GitHubのprivate repositoryにあるkubernetesのリソースをArgoCDでデプロイしてみる

はじめに

前回はArgoCDのセットアップ周りを書いたので 今回は、ArgoCDにprivate repositoryを読み取らせてアプリケーションがデプロイ出来るにしてみます。 また、アプリケーションはArgoCDのexamplesにあるものにkustomizeを使いつつデプロイしてみます。

今回は以下の手順でデプロイしてみます。

  1. GitHubのrepo scopeのpersonal アクセストークンを発行する
  2. アクセストークンをArgoCDが使うようにSecretリソースを作成する
  3. 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-typerepo-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があるかどうかで判断しているようですね。

参考資料