ConfigMap系@リソース定義¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. 専用ConfigMap¶
ArgoCDの各コンポーネントの機密でない変数やファイルを管理する。
ConfigMapでは、.metadata.labels
キー配下に、必ずapp.kubernetes.io/part-of: argocd
キーを割り当てる必要がある。
02. argocd-cm (必須)¶
argocd-cmとは¶
ArgoCDの各コンポーネントで共通する値を設定する。
exec¶
▼ execとは¶
ArgoCDのExec機能を設定する。
▼ exec.enabled¶
Exec機能を有効化する。
kubectl exec
コマンドのようにして、ArgoCDのダッシュボード上からコンテナにログインできる。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
exec.enabled: "true"
argocd-serverに紐づけるClusterRoleでは、Podのexec
リソースとcreate
アクションを許可する必要がある。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
namespace: argocd
name: argocd-server
labels:
app.kubernetes.io/part-of: argocd
rules:
- apiGroups:
- ""
resources:
- pods/exec
verbs:
- create
▼ exec.enabled¶
全てのコンテナにExecできるわけではなく、ArgoCDがサポートしているシェルでログインできるコンテナにのみ、Execが可能である。
ログイン時に使用できるシェルを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
exec.shells: bash,sh,powershell,cmd
application.instanceLabelKey¶
▼ application.instanceLabelKeyとは¶
Kubernetesリソースや子Applicationが親Applicationを識別するためのラベルのキー名を設定する。
デフォルトはapp.kubernetes.io/instance
キーであり、コンフリクトしやすいキー名なため、変更した方が良い。
ラベルのキー名は1
個しか設定できない。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
application.instanceLabelKey: argocd.argoproj.io/instance
▼ ラベル挿入のタイミング¶
argocd.argoproj.io/instance
ラベルの挿入は、application-controllerが実行する。
そのため挿入のタイミングは、マニフェスト作成のタイミングではなく、Syncの直前である。
ConfigMapやSecretのファイル変更に合わせてチェックサム値を更新するようなロジックがチャートあったとしても、repo-serverがマニフェスト作成時にargocd.argoproj.io/instance
ラベルを挿入するわけではないので、チェックサム値は変更にならない。
なお、CRDには挿入しない仕様になっている。
▼ RootのApplication名の重複¶
単一のClusterでNamespacedスコープのArgoCDを構築している時、RootのApplicationをdefault
というAppProjectに配置すると、この問題が起こる可能性がある。
default
のAppProjectに所属したApplicationは、Namespacedスコープのapplication-controllerであって、他のNamespaceも見てしまうようである。
RootのApplication名が重複している場合、たとえNamespaceが異なっていても、Namespace間でRootのApplicationを共有してしまう。
ちなみに、ClusterスコープのArgoCDに限り、.spec.sourceNamespaces
キーを使用して、この重複を許可できる。
globalProjects¶
▼ globalProjectsとは¶
グローバルスコープを持つ親AppProjectと、これの設定値を継承させる子AppProjectを指定する。
labelSelector
キーで、子Projectの条件を設定する。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
globalProjects: |
- projectName: foo-global-project
labelSelector:
matchExpressions:
- key: opt
operator: In
values:
- prd
# グローバルスコープを持つ親AppProject
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: foo-global-project
spec: ...
kustomize.buildOptions¶
▼ kustomize.buildOptionsとは¶
Kustomizeの実行時に、コマンドに渡すオプションを設定する。
特に、Kustomizeのプラグイン (例:KSOPSなど) を使用する場合、--enable-alpha-plugins
オプションと--enable-exec
オプションを有効化する必要がある。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
kustomize.buildOptions: --enable-alpha-plugins --enable-exec
なお、kustomize.path.<バージョン>
オプションを使用している場合、kustomize.buildOptions.<バージョン>
オプションの使用が必須であり、バージョンごとにオプションを設定できる。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
kustomize.buildOptions.v1.0.0: --enable-alpha-plugins --enable-exec
kustomize.buildOptions.v2.0.0: --enable-alpha-plugins --enable-exec
kustomize.path.<バージョン>¶
▼ kustomize.path.<バージョン>とは¶
デフォルトのKustomizeのバージョン以外のものも使用したい場合に、そののバージョンと、バイナリファイルの置き場所を設定する。
ArgoCDで一つのバージョンのKustomizeしか使用しない場合、kustomize.path.<バージョン>
で/usr/local/bin/kustomize
を指定する。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
kustomize.path.v1.0.0: /usr/local/bin/kustomize
複数のバージョンのKustomizeを使用できる。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
kustomize.path.v1.0.0: /usr/local/bin/kustomize_1_0_0
kustomize.path.v2.0.0: /usr/local/bin/kustomize_2_0_0
▼ 各ApplicationでKustomizeを使用する¶
Applicationの.spec.kustomize.version
キーで、使用するKustomizeのバージョンを指定する。
各Applicationで異なるバージョンのKustomizeを指定できる。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: foo-application
namespace: argocd
spec:
repoURL: https://github.com/hiroki-hasegawa/foo-manifests.git
targetRevision: main
path: .
kustomize:
version: v1.0.0
oidc.config¶
▼ oidc.configとは¶
OIDCを使用して、ArgoCDにログインできるようにする。
▼ 委譲先Webサイトに直接的に接続する場合¶
ArgoCDから認証フェーズの委譲先のIDプロバイダーに情報を直接的に接続する。
OIDCのIDプロバイダー (例:Auth0、GitHub、Keycloak、Zitadel、AWS Cognito、Google Cloud Auth) が発行したクライアントIDやクライアントシークレットを設定する。
ここでは、プライベートなマニフェストリポジトリが異なるレジストリにあるとしており、複数のSecretが必要になる。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
data:
admin.enabled: "true"
# OIDCに必要なIDやトークンを設定する
oidc.config: |
connectors:
- type: github
id: github
name: GitHub SSO
config:
clientID: *****
clientSecret: *****
# dex-serverが認可レスポンスによるリダイレクトを受信するURLを設定する
redirectURI: https://<ArgoCDのドメイン>/api/dex/callback
# ArgoCDのダッシュボードのNode外公開URLを設定する
# 開発環境では、https://127.0.0.1:8080
url: <URL>
▼ Dexを介して委譲先Webサイトに接続する場合¶
ArgoCDから認証フェーズの委譲先のIDプロバイダーに直接的に接続するのではなく、ハブとしてのDexを使用する。
Dexはdex-server
コンテナとして稼働させる。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
data:
admin.enabled: "true"
# 必要なIDやトークンを設定する。
dex.config: |
connectors:
- type: github
id: github
name: GitHub SSO
config:
clientID: *****
clientSecret: *****
# dex-serverが認可レスポンスによるリダイレクトを受信するURLを設定する
redirectURI: https://<ArgoCDのドメイン>/api/dex/callback
# ArgoCDのダッシュボードのNode外公開URLを設定する。
# 開発環境では、https://127.0.0.1:8080
url: <URL>
repositories¶
▼ repositoriesとは¶
ConfigMapでリポジトリのURLを管理する方法は、将来的に廃止される予定である。
resource.customizations.ignoreDifferences.all¶
▼ resource.customizations.ignoreDifferences.allとは¶
ArgoCD全体で.spec.ignoreDifferences
キーと同じ機能を有効化する。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-cm
labels:
app.kubernetes.io/part-of: argocd
data:
resource.customizations.ignoreDifferences.all: |
jsonPointers:
# .spec.replicasキー (インスタンス数) の設定値の変化を無視する。
- /spec/replicas
jqPathExpressions:
# .spec.metrics (ターゲット対象のメトリクス) の自動整形を無視する。
- /spec/metrics
03. argocd-cmd-params-cm¶
argocd-cmd-params-cmとは¶
ArgoCDの各コンポーネント (application-controller、dex-server、redis-server、repo-server) の起動コマンドに渡すオプションを設定する。
複数コンポーネント¶
複数コンポーネントの起動コマンドのオプションを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cmd-params-cm
namespace: argocd
data:
# application-controllerとargocd-server
# Applicationの作成を許可したいNamespaceを設定する
application.namespaces: foo-application-ns
application-controller¶
application-controllerの起動コマンドのオプションを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cmd-params-cm
namespace: argocd
data:
# Applicationの作成を許可したいNamespaceを設定する
application.namespaces: foo
controller.log.format: text
controller.log.level: warn
controller.operation.processors: "10"
controller.repo.server.timeout.seconds: "60"
controller.self.heal.timeout.seconds: "5"
controller.status.processors: "20"
otlp.address: ""
redis-server¶
redis-serverの起動コマンドのオプションを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cmd-params-cm
namespace: argocd
data:
redis.server: argocd-redis:6379
repo-server¶
repo-serverの起動コマンドのオプションを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cmd-params-cm
namespace: argocd
data:
repo.server: argocd-repo-server:8081
reposerver.log.format: text
reposerver.log.level: warn
reposerver.parallelism.limit: "0"
argocd-server¶
argocd-serverの起動コマンドのオプションを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cmd-params-cm
namespace: argocd
data:
server.basehref: /
server.dex.server: https://argocd-dex-server:5556
server.dex.server.strict.tls: "false"
server.disable.auth: "false"
server.enable.gzip: "false"
# ロードバランサーで、リクエストをHTTPで転送するように設定している場合に、argocd-serverでHTTPの受信を許可する
server.insecure: "true"
server.log.format: text
server.log.level: warn
server.repo.server.strict.tls: "false"
server.rootpath: ""
server.staticassets: /shared/app
server.x.frame.options: sameorigin
04. argocd-rbac-cm¶
ArgoCDを構成するKubernetesリソースにリクエストを送信するための認可スコープを紐付ける。
認可スコープの設定¶
▼ 記法¶
Casbinの記法を使用して、ロールと認可スコープを定義しつつ、これをグループ名に紐付ける。
readonly
とadmin
というロールは、デフォルトで定義済みである。
記号 | 項目 | 説明 |
---|---|---|
p (パーミッション) |
p, <ロール名> <Kubernetesリソースの種類> <アクション名> <AppProject名>/<ApplicationのNamespace名>/<Application名> |
ロールとArgoCD系リソースの認可スコープを定義する。代わりに、RoleやClusterRoleでも定義できる。 |
g (グループ) |
g, <グループ名> <ロール名> |
グループにロールを紐付ける。 |
- https://stackoverflow.com/a/73784100
- https://argo-cd.readthedocs.io/en/stable/operator-manual/rbac/#rbac-permission-structure
- https://github.com/argoproj/argo-cd/blob/v2.6.0/assets/model.conf
- https://github.com/argoproj/argo-cd/blob/v2.6.0/assets/builtin-policy.csv
- https://argo-cd.readthedocs.io/en/stable/operator-manual/app-any-namespace/#application-rbac
ArgoCDで認証する場合¶
ロールに付与するポリシーの認可スコープは、AppProject単位にするとよい。
AppProjectに所属するArgoCD系リソースのみへのアクセスを許可すれば、結果として特定のClusterへのデプロイのみを許可したことになる。
*実装例*
管理チーム (app
、infra
) 単位でAppProjectを作成した上で、AppProjectに所属するArgoCD系リソースのみに認可スコープを持つロールを定義する。
これにより、その管理チームに所属するエンジニアしかSyncできなくなる。
app
ロールに、app
のAppProjectに所属するArgoCD系リソースのみを操作できる認可スコープinfra
ロールに、infra
のみを操作できる認可スコープmaintainer
ロールに、app
とinfra
の両方を操作できる認可スコープ- 認証グループに該当する認可ロールがなければ、
readonly
になる。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
# デフォルトのロール
policy.default: role:readonly
policy.csv: |
# ロールと認可スコープを定義する
p, role:app, *, *, app/*, allow
p, role:infra, *, *, infra/*, allow
p, role:maintainer, *, *, app/*, allow
p, role:maintainer, *, *, infra/*, allow
# グループにロールを紐付ける。
g, app-team, role:app
g, infra-team, role:infra
g, admin, role:maintainer
scopes: "[groups]"
- https://krrrr.hatenablog.com/entry/2022/01/23/201700
- https://qiita.com/dtn/items/9bcae313b8cb3583977e#argocd-cm-rbac-configmap-%E3%81%AE%E4%BD%9C%E6%88%90
- https://github.com/argoproj/argo-cd/blob/v2.6.0/assets/builtin-policy.csv
- https://weseek.co.jp/tech/95/#SSO_RBAC
- https://techblog.zozo.com/entry/mlops-argocd
*実装例*
実行環境 (dev
、prd
) 別にAppProjectを作成した上で、AppProjectに所属するArgoCD系リソースのみに認可スコープを持つロールを定義する。
developer
ロールに、開発環境のAppProject内に所属するArgoCD系リソースのみを操作できる認可スコープmaintainer
ロールに、開発環境と本番環境の両方を操作できる認可スコープ- 認証グループに該当する認可ロールがなければ、
readonly
になる。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
# デフォルトのロール
policy.default: role:readonly
policy.csv: |
# ロールと認可スコープを定義する
p, role:developer, *, *, dev/*, allow
p, role:maintainer, *, *, dev/*, allow
p, role:maintainer, *, *, prd/*, allow
# グループにロールを紐付ける
g, developers, role:developer
g, maintainers, role:maintainer
scopes: "[groups]"
ArgoCDの認証をIDプロバイダーに委譲する場合 (SSOの場合)¶
▼ IDプロバイダーのチームに紐付ける場合¶
IDプロバイダーに委譲する場合、グループ名はIDプロバイダーで認証されたものにする必要がある。
*実装例*
IDプロバイダー側で、チームによる認証グループがすでに存在しているとする。
以下のように、ロールと認可スコープを紐付ける。
app
ロールに、app
のAppProjectに所属するArgoCD系リソースのみを操作できる認可スコープinfra
ロールに、infra
のみを操作できる認可スコープmaintainer
ロールに、app
とinfra
の両方を操作できる認可スコープ- 認証グループに該当する認可ロールがなければ、
readonly
になる。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
# デフォルトのロール
policy.default: role:readonly
policy.csv: |
# ロールとArgoCD系リソースの認可スコープを定義する
p, role:app, *, *, app/*, allow
p, role:infra, *, *, infra/*, allow
p, role:maintainer, *, *, app/*, allow
p, role:maintainer, *, *, infra/*, allow
# IDプロバイダーで認証されたグループにロールを紐付ける
g, example-org.github.com:app-team, role:app
g, example-org.github.com:infra-team, role:infra
g, example-org.github.com:maintainer, role:maintainer
scopes: "[groups]"
*実装例*
IDプロバイダー側で、チームによる認証グループがすでに存在しているとする。
実行環境 (dev-*
、prd-*
) 別にAppProjectを作成した上で、AppProjectに所属するArgoCD系リソースのみに認可スコープを持つロールを定義する。
以下のように、ロールと認可スコープを紐付ける。
app
ロールに、dev-app
のAppProjectに所属するArgoCD系リソースのみを操作できる認可スコープinfra
ロールに、dev-infra
のみを操作できる認可スコープmaintainer
ロールに、dev-app
とdev-infra
の両方を操作できる認可スコープ- 認証グループに該当する認可ロールがなければ、
readonly
になる。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
# デフォルトのロール
policy.default: role:readonly
policy.csv: |
# ロールとArgoCD系リソースの認可スコープを定義する
p, role:app, *, *, dev-app/*, allow
p, role:infra, *, *, dev-infra/*, allow
p, role:maintainer, *, *, dev-app/*, allow
p, role:maintainer, *, *, dev-infra/*, allow
# IDプロバイダーで認証されたグループにロールを紐付ける
g, example-org.github.com:app-team, role:app
g, example-org.github.com:infra-team, role:infra
g, example-org.github.com:maintainer, role:maintainer
scopes: "[groups]"
▼ IDプロバイダーのメールアドレスに紐付ける場合¶
IDプロバイダー側で、メールアドレスによる認証グループがすでに存在しているとする。
以下のように、ロールと認可スコープを紐付ける。
app
ロールに、app
のAppProjectに所属するArgoCD系リソースのみを操作できる認可スコープinfra
ロールに、infra
のみを操作できる認可スコープmaintainer
ロールに、app
とinfra
の両方を操作できる認可スコープ- 認証グループに該当する認可ロールがなければ、
readonly
になる。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
# デフォルトのロール
policy.default: role:readonly
policy.csv: |
# ロールとArgoCD系リソースの認可スコープを定義する
p, role:app, *, *, app/*, allow
p, role:infra, *, *, infra/*, allow
p, role:maintainer, *, *, app/*, allow
p, role:maintainer, *, *, infra/*, allow
# IDプロバイダーで認証されたグループにロールを紐付ける
g, app-team@gmail.com, role:app
g, infra-team@gmail.com, role:infra
g, maintainer@gmail.com, role:maintainer
scopes: "[email]"
05. SSL証明書系ConfigMap¶
SSL証明書系ConfigMapとは¶
argocd-server、repo-server、dex-server、はHTTPSリクエストを受信できる。
これらのコンポーネントにHTTPSリクエストを送信する場合、ConfigMap上のSSL証明書をクライアント側のコンテナにマウントする必要がある。
反対にHTTPリクエストを送信する場合は、このConfigMapが不要である。
ConfigMap上のSSL証明書の代わりに、ArgoCD外のSSL証明書 (例:Cert Manager) を使用しても良い。
argocd-dex-server-tls¶
argocd-serverはdex-serverに対してHTTPSリクエストを送信する。
このConfigMapは、そのためのSSL証明書を管理する。
argocd-repo-server-tls¶
application-controller、argocd-server、はrepo-serverに対してHTTPSリクエストを送信する。
このConfigMapは、そのためのSSL証明書を管理する。
argocd-server-tls¶
クライアントはargocd-serverに対してHTTPSリクエストを送信する。
このConfigMapは、そのためのSSL証明書を管理する。
argocd-tls-certs-cm¶
ArgoCDは、ArgoCDの外 (特にリポジトリ) にHTTPSリクエストを送信する。
ArgoCDでは、コンテナイメージの/etc/ssl
ディレクトリにデフォルトのSSL証明書が配置されているが、ユーザー定義のSSL証明書を使用したい場合がある。
このConfigMapは、そのためのユーザー定義のSSL証明書を管理する。
06. argocd-ssh-known-hosts-cm¶
SSH公開鍵認証でリポジトリに接続してポーリングする場合に、argocd-serverで必要なknown_hosts
ファイルを設定する。
known_hosts
ファイルには、SSHプロコトルに必要なホスト名や秘密鍵を設定する。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argocd
name: argocd-ssh-known-hosts-cm
labels:
app.kubernetes.io/part-of: argocd
data:
ssh_known_hosts: |
bitbucket.org ssh-rsa AAAAB ...
github.com ecdsa-sha2-nistp256 AAAAE ...
github.com ssh-ed25519 AAAAC ...
github.com ssh-rsa AAAAB ...
gitlab.com ecdsa-sha2-nistp256 AAAAE ...
gitlab.com ssh-ed25519 AAAAC ...
gitlab.com ssh-rsa AAAAB ...
ssh.dev.azure.com ssh-rsa AAAAB ...
vs-ssh.visualstudio.com ssh-rsa AAAAB ...
07. 環境変数¶
application-controller¶
▼ ARGOCD_CONTROLLER_REPLICAS¶
application-controllerのレプリカ数を設定する。
これを設定しないと、application-controllerを冗長化しても、処理が片方のレプリカに偏ってしまう。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: argocd-application-controller
spec:
replicas: 2
template:
spec:
containers:
- name: argocd-application-controller
env:
- name: ARGOCD_CONTROLLER_REPLICAS
value: 2
argocd-server¶
▼ ARGOCD_API_SERVER_REPLICAS¶
argocd-serverのレプリカ数を設定する。
これを設定しないと、argocd-serverを冗長化しても、処理が片方のレプリカに偏ってしまう。
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-server
spec:
replicas: 3
template:
spec:
containers:
- name: argocd-server
env:
- name: ARGOCD_API_SERVER_REPLICAS
value: 3