GitHubのprivate repositoryにあるkubernetesのリソースをArgoCDでデプロイしてみる
はじめに
前回はArgoCDのセットアップ周りを書いたので 今回は、ArgoCDにprivate repositoryを読み取らせてアプリケーションがデプロイ出来るにしてみます。 また、アプリケーションはArgoCDのexamplesにあるものにkustomizeを使いつつデプロイしてみます。
今回は以下の手順でデプロイしてみます。
- GitHubのrepo scopeのpersonal アクセストークンを発行する
- アクセストークンをArgoCDが使うようにSecretリソースを作成する
- Applicationリソースを作成してArgoCDがデプロイできるようにする
1. GitHubのrepo scopeのpersonal アクセストークンを発行する
今回は簡易的にrepo scopeのpersonalアクセストークンを使って デプロイ出来るようにします。
本当はSSH Keyでgitの認証をするのが良いのでしょうか? もしくはGitHubならGitHub Appを使うのがいいのでしょうか?
repo scope、結構大きな権限なので、もう少し絞れるといいんですけどね・・・。
アクセストークンの発行は以下のURLから出来ます。
repo scopeにチェックを入れてアクセストークンを発行してください。 スクリーンショットでは、No expirationにしていますが、テスト用途ならばexpirationを設定しておくと安心です。
2. アクセストークンをArgoCDが使うようにSecretリソースを作成する
テストのため、今回は何も考えずに以下のようなSecretリソースを作成します。
本来であれば、Secretのリソースは gitなどのバージョン管理システムの外で管理するのが望ましいです。
# secret.yaml apiVersion: v1 kind: Secret metadata: name: private-repo-creds namespace: argocd labels: argocd.argoproj.io/secret-type: repo-creds stringData: type: git url: https://github.com/wreulicke password: <your-access-token> username: wreulicke
以下のコマンドでリソースをkubernetes上に作成します。
kubectl apply -f ./secret.yaml
ちなみに、ArgoCDは argocd.argoproj.io/secret-type
がrepo-creds
のSecretリソースを
Repository Credentialsとして取り扱うようです。
LabelKeySecretType = "argocd.argoproj.io/secret-type" // LabelValueSecretTypeCluster indicates a secret type of cluster ... // LabelValueSecretTypeRepoCreds indicates a secret type of repository credentials LabelValueSecretTypeRepoCreds = "repo-creds"
3. Applicationリソースを作成してArgoCDがデプロイできるようにする
以下のようなyamlを作成しました。 これはArgoCDによってCustomResourceDefinitionリソースによって定義されたApplicationリソースです。 Kubernetesではこのように、自分たちのリソースの定義を持つ事ができ、このリソースに対する処理を書くことが可能です。 ArgoCDはこのリソースに対して処理を行うことでアプリケーションのデプロイを行います。
今回はmasterブランチを対象にguestbookディレクトリ配下のアプリケーションをデプロイします。
destination
に関してはクラスタ内にデプロイするのでこのような値になっています。
クラスタ外にデプロイする場合はこの辺を変えるのでしょうかね。
# application.yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: guestbook namespace: argocd spec: project: default source: repoURL: https://github.com/wreulicke/<your-repository>.git targetRevision: master path: guestbook syncPolicy: automated: {} destination: server: https://kubernetes.default.svc namespace: default
ここで、syncPolicyはautomated: {}
にしています。
この場合、automated synchronizationが有効になり、3分に1回、gitの更新を読み取りにいくようです。
syncPolicyのautomated配下にいろいろ設定ができるようです。 気が向いたら読みましょう。
Automated Sync Policy - Argo CD - Declarative GitOps CD for Kubernetes
また、上のrepoURL
で設定したrepositoryにおいてあるファイルの構成は以下のイメージです。
$ tree . ├── .git # 便宜上.gitを表示しています └── guestbook ├── guestbook-ui-deployment.yaml ├── guestbook-ui-svc.yaml └── kustomization.yaml $ cat guestbook/guestbook-ui-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: guestbook-ui spec: replicas: 1 revisionHistoryLimit: 3 selector: matchLabels: app: guestbook-ui template: metadata: labels: app: guestbook-ui spec: containers: - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 name: guestbook-ui ports: - containerPort: 80 $ cat guestbook/guestbook-ui-svc.yaml apiVersion: v1 kind: Service metadata: name: guestbook-ui spec: ports: - port: 80 targetPort: 80 selector: app: guestbook-ui $ cat guestbook/kustomization.yaml resources: - guestbook-ui-deployment.yaml - guestbook-ui-svc.yaml
先程作成したApplicationリソースを以下のコマンドで作成します。
$ kubectl apply -f ./applciation.yaml
ArgoCDのUIに以下のような表示がでていれば成功です。 表示したタイミングによってはOutOfSyncのようなステータス表示になっているかもしれませんが 問題がなければ以下のような表示になるはずです。
終わり
今回は、Applicationリソースを使ったArgoCDにアプリケーションのデプロイをさせてみました。 特に難しいことはないんですが、一通り試せたかなと思います。
おまけ. ArgoCDはどうやって使っているツールのdetectionをしているか
この辺に記述があります。kustomizeの場合は、kustomization.yamlがあるかどうかで判断しているようですね。