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 チャートを使用する。
- https://argo-cd.readthedocs.io/en/release-2.0/operator-manual/security/#authentication
- https://qiita.com/moriryota62/items/7d94027881d6fe9a478d
- https://stackoverflow.com/questions/66851895/how-to-deploy-helm-charts-which-are-stored-in-aws-ecr-using-argocd
- https://artifacthub.io/packages/helm/architectminds/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 ポリシーを設定する。
