コンテンツにスキップ

Secret系@リソース定義

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. 専用Secret

ArgoCD の各種コンポーネントの機密な変数やファイルを管理する。


02. argocd-initial-admin-secret

password

ArgoCD が argocd-initial-admin-secret という Secret を自動的に作成してくれる。

これに、admin ユーザーの初期パスワードが設定されている。

apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: argocd-initial-admin-secret
type: Opaque
data:
  password: <adminユーザーの初期パスワード>


03. argocd-repo

argocd-repoとは

ArgoCD がプライベートリポジトリをポーリングするときに必要な資格情報を設定する。

argocd-repo-creds とは異なり、1 個の資格情報で 1 個のリポジトリにリクエストを送信できるようにする。

なお、パブリックリポジトリの場合は、argocd-repo 自体が不要である。


共通項目

argocd.argoproj.io/secret-type キー (必須)

Secret タイプは repository とする。

ポーリング対象のプライベートなマニフェストリポジトリ、Helm チャートレジストリ、OCI レジストリの資格情報を設定する。

Helm チャートを対象とする場合、helm repo add コマンドを実行することに相当する。


マニフェストリポジトリの場合

▼ 注意点

プライベートなマニフェストリポジトリの資格情報を設定する。

プライベートなマニフェストレジストリごとに、異なる Secret で資格情報を設定する必要がある。

▼ アクセストークンの場合

アクセストークンをパスワードに設定する。

ユーザー名は、空文字以外の任意の文字列を設定できる。

# foo-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: foo-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # マニフェストリポジトリ名
  name: foo-repository
  url: https://github.com/hiroki-hasegawa/foo-manifest.git
  type: git
  # 空文字以外の任意の文字列を設定する
  username: personal-access-token
  # アクセストークンを設定する
  password: ******
---
# bar-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: bar-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # マニフェストリポジトリ名
  name: bar-repository
  url: https://github.com/hiroki-hasegawa/bar-manifest.git
  type: git
  # 空文字以外の任意の文字列を設定する
  username: personal-access-token
  # アクセストークンを設定する
  password: ******

▼ HTTPS認証の場合

HTTPS 認証に必要なユーザー名とパスワードを設定する。

ここでは、プライベートなマニフェストリポジトリが異なるレジストリにあるとしており、複数の Secret が必要になる。

# foo-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: foo-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # マニフェストリポジトリ名
  name: foo-repository
  url: https://github.com/hiroki-hasegawa/foo-manifest.git
  type: git
  # HTTPS認証に必要なユーザー名とパスワードを設定する。
  username: hiroki-it
  password: pass
---
# bar-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: bar-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # マニフェストリポジトリ名
  name: bar-repository
  url: https://github.com/hiroki-hasegawa/bar-manifest.git
  type: git
  # HTTPS認証に必要なユーザー名とパスワードを設定する。
  username: hiroki-it
  password: pass

▼ SSH公開鍵認証の場合

SSH 公開鍵認証に必要な秘密鍵を設定する。

ここでは、プライベートなマニフェストリポジトリが異なるレジストリにあるとしており、複数の Secret が必要になる。

# foo-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: foo-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # マニフェストリポジトリ名
  name: foo-repository
  url: git@github.com:hiroki-hasegawa/foo-manifest.git
  type: git
  # SSH公開鍵認証に必要な秘密鍵を設定する。
  sshPrivateKey: |
    MIIC2 ...
---
# bar-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: bar-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # マニフェストリポジトリ名
  name: bar-repository
  url: git@github.com:hiroki-hasegawa/bar-manifest.git
  type: git
  # SSH公開鍵認証に必要な秘密鍵を設定する。
  sshPrivateKey: |
    MIIEp ...


Helmチャートリポジトリの場合

▼ 注意点

プライベートな Helm チャートリポジトリごとに、異なる Secret で資格情報を設定する必要がある。

ただし、ポーリングする複数のプライベートな Helm チャートリポジトリが、すべて 1 個の Helm チャートレジストリ内にある場合は、Secret は 1 個でよい。

▼ HTTPS認証の場合

HTTPS 認証に必要なユーザー名とパスワードを設定する。

ここでは、プライベートな Helm チャートリポジトリが異なるレジストリにあるとしており、複数の Secret が必要になる。

# foo-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: foo-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # Helmチャートリポジトリ名
  name: foo-repository
  # HelmチャートリポジトリのURL
  url: https://github.com/hiroki-hasegawa/foo-charts.git
  type: helm
  username: foo
  password: bar
---
# bar-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: bar-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # Helmチャートリポジトリ名
  name: bar-repository
  # HelmチャートリポジトリのURL
  url: https://github.com/hiroki-hasegawa/bar-charts.git
  type: helm
  username: baz
  password: qux


OCIリポジトリの場合

▼ 注意点

OCI プロトコルの有効化 (.enableOCI キー) が必要であるが、内部的に OCI プロトコルが .repoURL キーの最初に追記されるため、プロトコルの設定は不要である。

プライベートな Helm チャートリポジトリの場合と同様にして、OCI リポジトリごとに異なる Secret で資格情報を設定する必要がある。

ただし、ポーリングする複数のリポジトリが、すべて 1 個の OCI レジストリ内にある場合は、Secret は 1 個でよい。

▼ HTTPS認証の場合

HTTPS 認証に必要なユーザー名とパスワードを設定する。

ここでは、プライベートな OCI リポジトリが異なるレジストリにあるとしており、複数の Secret が必要になる。

# foo-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: foo-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # OCIリポジトリ名
  name: foo-oci-repository
  # OCIリポジトリのURL
  url: <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
  type: helm
  username: foo
  password: bar
  enableOCI: true # OCIリポジトリを有効化する。
---
# bar-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: bar-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # OCIリポジトリ名
  name: bar-oci-repository
  # OCIリポジトリのURL
  url: <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
  type: helm
  username: baz
  password: qux
  # OCIリポジトリを有効化する。
  enableOCI: "true"

Amazon ECR のように資格情報に有効期限がある場合は、資格情報を定期的に書き換えられるようにする。例えば、aws-ecr-credential チャートを使用する。


04. argocd-repo-creds

argocd-repo-credsとは

ArgoCD がプライベートリポジトリをポーリングするときに必要な資格情報を設定する。

argocd-repo とは異なり、1 個の資格情報で複数のリポジトリへリクエストを送信できるようにする。

ポーリングする複数のリポジトリがすべて 1 個のマニフェストレジストリ内にある場合、1 個の資格情報ですべてのマニフェストリポジトリをポーリングできる。

なお、パブリックリポジトリの場合は、argocd-repo-creds 自体が不要である。


マニフェストリポジトリの場合

▼ HTTPS認証の場合

設定できる項目は、argocd-repo と同じである。

argocd-repo-creds に、各 argocd-repo で共有する項目を設定する。

argocd-repo-creds の url キーには、argocd-repo の .url キーの上層のパス (ここでは https://github.com/hiroki-hasegawa) を設定する。

apiVersion: v1
kind: Secret
metadata:
  name: argocd-repo-creds-github
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repo-creds
type: Opaque
data:
  type: git
  url: https://github.com/hiroki-hasegawa
  # HTTPS認証に必要なユーザー名とパスワードを設定する。
  username: hiroki-it
  password: pass

また、argocd-repo には資格情報 (.username キー、.password キー) を設定しないようにする。

# foo-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: foo-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # 資格情報は設定しない。
  # マニフェストリポジトリ名
  name: foo-repository
  # https://github.com/hiroki-hasegawa に前方一致する。
  url: https://github.com/hiroki-hasegawa/foo-manifest.git
---
# bar-repositoryをポーリングするためのargocd-repo
apiVersion: v1
kind: Secret
metadata:
  namespace: argocd
  name: bar-argocd-repo
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
data:
  # 資格情報は設定しない。
  # マニフェストリポジトリ名
  name: bar-repository
  # https://github.com/hiroki-hasegawa に前方一致する。
  url: https://github.com/hiroki-hasegawa/bar-manifest.git

ArgoCD は、argocd-repo-creds の .url キーを使用して、argocd-repo の .url キーに対する前方一致を実施する。

前方一致した URL を持つすべての argocd-repo で、argocd-repo-creds の資格情報 (.username キー、.password キー) が適用される。


05. argo-secret (必須)

argocd-secretとは

以下の資格情報やサーバー証明書を設定する。

  • クライアントが、任意の認証/認可方法で ArgoCD にログインするためのユーザー名とパスワード
  • ArgoCD が apiserver にリクエストを送信するためのサーバー証明書と秘密鍵
  • Webhook リクエストを送信するためのサーバー証明書


admin

記入中...

apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
  namespace: argocd
  labels:
    app.kubernetes.io/part-of: argocd
type: Opaque
data:
  admin.password: ""
  admin.passwordMtime: ""


tls

記入中...

apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
  namespace: argocd
  labels:
    app.kubernetes.io/part-of: argocd
type: Opaque
data:
  tls.crt: ""
  tls.key: ""


server

記入中...

apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
  namespace: argocd
  labels:
    app.kubernetes.io/part-of: argocd
type: Opaque
data:
  server.secretkey: ""


webhook

記入中...

apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
  namespace: argocd
  labels:
    app.kubernetes.io/part-of: argocd
type: Opaque
data:
  webhook.github.secret: ""
  webhook.gitlab.secret: ""
  webhook.bitbucket.uuid: ""
  webhook.bitbucketserver.secret: ""
  webhook.gogs.secret: ""


ユーザー定義のキー

▼ OIDC

例えば、OIDC による認証で使用する値を管理する。

apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
  namespace: argocd
  labels:
    app.kubernetes.io/part-of: argocd
type: Opaque
data:
  # base64方式でエンコードしたクライアントシークレット
  oidc.auth0.clientSecret: *****

argocd-cm にて、$<Secret名>:<キー名> を指定して、定義したクライアントシークレットを出力する。

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: argocd
  name: argocd-cm
  labels:
    app.kubernetes.io/part-of: argocd
data:
  # OIDCに必要なIDやトークンを設定する
  oidc.config: |
    name: Auth0
    clientID: *****
    clientSecret: $argocd-secret:oidc.auth0.clientSecret

  ...


06. cluster-<エンドポイントURL>

cluster-<エンドポイントURL>とは

ArgoCD の application-controller がデプロイ先と異なる Cluster で稼働している場合に、デプロイ先の Cluster の ServiceAccount と application-controller を紐付ける必要がある。

ArgoCD の application-controller は、cluster-<エンドポイントURL> という Secret を介して、デプロイ先の ServiceAccount と紐づく。


awsAuthConfig

▼ Amazon EKSの場合

Amazon EKS の場合、

デプロイ先の Cluster が Amazon EKS の場合は、以下のような Secret が作成される。

apiVersion: v1
kind: Secret
metadata:
  annotations:
    managed-by: argocd.argoproj.io
  labels:
    argocd.argoproj.io/secret-type: cluster
  name: cluster-<エンドポイントURL>
  namespace: argocd
type: Opaque
data:
  config: |
    awsAuthConfig:
      clusterName: <デプロイ先のCluster名>
      roleARN: <IRSAでArgoCDのPodに紐づくIAMロールARN>
    tlsClientConfig:
      insecure: "false"
      caData: <HTTPSに必要なサーバー証明書>
  name: foo-cluster
  server: https://*****.gr7.ap-northeast-1.eks.amazonaws.com


shard

application-controller の特定の Cluster に対するシャード数を設定する。

アルゴリズムによるシャード数の自動調整ではなく、シャード数を明示的に偏らせたい場合に使用する。

apiVersion: v1
kind: Secret
metadata:
  annotations:
    managed-by: argocd.argoproj.io
  labels:
    argocd.argoproj.io/secret-type: cluster
  name: cluster-<エンドポイントURL>
  namespace: argocd
type: Opaque
data:
  shard: 3


06-02. セットアップ

Amazon EKS Clusterの場合

▼ 手順

ArgoCD が Cluster をポーリングするためには、ArgoCD に Cluster の資格情報を登録する必要がある。

これは、ローカルマシンで kubectl コマンドを実行するときに、kubeconfig ファイルに Cluster の資格情報を登録することと同じである。

(1)

ArgoCD の稼働する Cluster をコンテキストとする。

$ kubectl config use-context <ArgoCDの稼働するClusterのARN>
(2)

ArgoCD のパスワードを確認する。

$ kubectl get secret argocd-initial-admin-secret \
    -n foo \
    -o jsonpath="{.data.password}" | base64 -d; echo
(3)

ArgoCD にログインする。

この時、ユーザー名はadminでパスワードは前の手順で取得したものとする。

# Bearer認証の場合
$ argocd login <ArgoCDのドメイン名> \
    --grpc-web \
    --skip-test-tls \
    --username admin \
    --password <前の手順で取得した文字列>

# SSOの場合
$ argocd login <ArgoCDのドメイン名> \
    --grpc-web \
    --skip-test-tls \
    --sso
(4)

ArgoCD にポーリングさせたい Cluster をコンテキストとする。

$ kubectl config use-context <デプロイ先のClusterのARN>
(5)

argocd cluster add <デプロイ先のClusterのARN> コマンドを実行することにより、デプロイ先の Cluster に ArgoCD のエージェントを作成する。

Secret、ServiceAccount (argocd-manager) 、ClusterRole (argocd-manager-role) 、ClusterRoleBinding (argocd-manager-role-binding) を作成できる。

# デフォルトでkube-systemに作成するため、nオプションは不要である
$ argocd cluster add <デプロイ先のClusterのARN> --name <ダッシュボード上でのClusterの表示名> -n kube-system

INFO[0011] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0011] ClusterRole "argocd-manager-role" updated
INFO[0011] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://*****.gr7.ap-northeast-1.eks.amazonaws.com' added
(6)

もし手順がうまく行っていない場合、Application で指定する Cluster の URL が ArgoCD に登録されていないとして、以下のようなエラーになってしまう。

cluster 'https://*****.gr7.ap-northeast-1.eks.amazonaws.com' has not been configured

執筆時点 (2022/01/30) では、argocd cluster add コマンドをマニフェストとして定義する方法はない。

もしタイムアウトになる場合、kube-apiserver の IP アドレスのアクセス制限に引っ掛かっていないかを確認する。

▼ プリンシパルIAMロールとアクセスエントリー

Amazon EKS アクセスエントリーを使用する場合、argocd cluster add コマンドは不要になる。

まず、argocd-server と application-controller の Pod の ServiceAccount に IRSA 用 IAM プリンシパルロールを紐づける。

プリンシパル IAM ロールに紐づく Pod が Amazon EKS に接続するとき、アクセスエントリーがこれを中継して動的に IAM ポリシーを設定する。

argocd_access-entry