GitOpsを実現できるArgoCDを試しに使っていきたいと思います。
環境
名前 | バージョン |
---|---|
OS | CentOS Linux release 7.6.1810 (Core) |
kubelet | v1.18.1 |
kubeadm | v1.18.1 |
docker | v1.13.1 |
ArgoCD | v1.5.0 |
手順
ArgoCDのインストール
kubectl create namespace argocd
wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -O argo.yaml
以下のように修正します。
apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: server app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd name: argocd-server spec: + type: NodePort ports: - name: http port: 80 protocol: TCP targetPort: 8080 + nodePort: 30080 - name: https port: 443 protocol: TCP targetPort: 8081 + nodePort: 30080
そして適用
kubectl apply -f argo.yaml -n argocd
確認します。
[root@master argocd]# kubectl get svc -n argocd NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE argocd-dex-server ClusterIP 10.103.237.133 <none> 5556/TCP,5557/TCP 14s argocd-metrics ClusterIP 10.109.206.213 <none> 8082/TCP 14s argocd-redis ClusterIP 10.105.249.81 <none> 6379/TCP 14s argocd-repo-server ClusterIP 10.109.46.125 <none> 8081/TCP,8084/TCP 14s argocd-server NodePort 10.98.127.105 <none> 80:30080/TCP,443:30081/TCP 13s argocd-server-metrics ClusterIP 10.107.207.114 <none> 8083/TCP 13s
アクセスします。(http://[サーバのIP]:30080)
パスワードはこのコマンドの実行結果です。
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
- ユーザ:admin
- パスワード:上記のコマンドの結果(argocd-serverのpod名)
ArgoCDのCLIをインストール
VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/') curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64 chmod +x /usr/local/bin/argocd ln -s /usr/local/bin/argocd /usr/bin/argocd
インストールできたら、ArgoCDのAPIサーバを外部公開します。方法は3通りあり
type: LoadBalancer
を使うIngress
を使う- ポートフォワーディングを使う
今回はローカル環境なのでポートフォワーディングを使います。
kubectl port-forward svc/argocd-server -n argocd 8080:443 > /dev/null &
そうししたらCLIでAPI serverに接続します。
argocd login 127.0.0.1:8080 Username: 👈 **admin**を入力 Password: 👈**先ほどのパスワード**を入力
デモアプリの作成
+New Appをクリックします。
入力します
入力します
DESTINATIONを指定します
CREATEをおします。
argocd app get guestbook
で確認すると
Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://127.0.0.1:8080/applications/guestbook Repo: https://github.com/argoproj/argocd-example-apps.git Target: HEAD Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: OutOfSync from HEAD (6bed858) Health Status: Missing GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui OutOfSync Missing apps Deployment default guestbook-ui OutOfSync Missing
となっていると思います。OutOfSync
というのはアプリがまだデプロイしていないという状態ですね。まだkubernetesにはリソースが作られていません。
そうしたらsync
してgitリポジトリと同期をとってkubectl apply
をしてあげましょう。
argocd app sync guestbook
しばらく待つとHEALTH
がHealthy
となりデプロイが成功します。
[root@master argocd]# argocd app get guestbook Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://127.0.0.1:8080/applications/guestbook Repo: https://github.com/argoproj/argocd-example-apps.git Target: HEAD Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: Synced to HEAD (6bed858) Health Status: Healthy GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui Synced Healthy service/guestbook-ui created apps Deployment default guestbook-ui Synced Healthy deployment.apps/guestbook-ui created [root@master argocd]#
argoCDを使ってNodePortで公開してみよう
このままだとguestbookがせっかく起動したのにアクセスがしづらいです。ということでNodePortの設定を入れてみようと思います。
まずはGitHubを操作しhttps://github.com/argoproj/argocd-example-apps.gitをforkしましょう。
そして宛先リポジトリのURLを変更します。
argocd app set guestbook --repo https://github.com/lirlia/argocd-example-apps
かわりました。
[root@master argocd]# argocd app get guestbook Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://127.0.0.1:8080/applications/guestbook Repo: **https://github.com/lirlia/argocd-example-apps** Target: HEAD Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: Synced to HEAD (6bed858) Health Status: Healthy GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui Synced Healthy service/guestbook-ui created apps Deployment default guestbook-ui Synced Healthy deployment.apps/guestbook-ui created [root@master argocd]#
そうしたらargocd-example-apps/guestbook/guestbook-ui-svc.yaml
を変更してcommit
します。
apiVersion: v1 kind: Service metadata: name: guestbook-ui spec: + type: NodePort ports: - port: 80 targetPort: 80 + nodePort: 30090 selector: app: guestbook-ui
するとguestbookの状態がOutOfSync
になりました。これはSync
してあげないといけません。
[root@master argocd]# argocd app get guestbook Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://127.0.0.1:8080/applications/guestbook Repo: https://github.com/lirlia/argocd-example-apps Target: HEAD Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: OutOfSync from HEAD (607a82f) Health Status: Healthy GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui OutOfSync Healthy service/guestbook-ui created apps Deployment default guestbook-ui Synced Healthy deployment.apps/guestbook-ui created
argocd app sync guestbook
はいSynced
になりました。
[root@master argocd]# argocd app get guestbook Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://127.0.0.1:8080/applications/guestbook Repo: https://github.com/lirlia/argocd-example-apps Target: HEAD Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: Synced to HEAD (607a82f) Health Status: Healthy GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui Synced Healthy service/guestbook-ui configured apps Deployment default guestbook-ui Synced Healthy deployment.apps/guestbook-ui unchanged
こちらもNodePort
が有効になりました。
[root@master argocd]# kubectl get svc | grep guestbook guestbook-ui NodePort 10.111.172.74 <none> 80:30090/TCP 25m
アクセスもきちんとできるようになりましたね。
自動Syncも試してみよう。
--sync-policy
をautomated
にすると自動で同期するようです。では、続いてはNodePort
のポート番号を変更してみましょう。
argocd app set guestbook --sync-policy automated
[root@master argocd]# argocd app get guestbook | grep Policy Sync Policy: Automated
そうしたら
argocd-example-apps/guestbook/guestbook-ui-svc.yaml
を変更してcommit
します。
apiVersion: v1
kind: Service
metadata:
name: guestbook-ui
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
+ nodePort: 30091
selector:
app: guestbook-ui
ArgoCDは3分ごとにGitリポジトリにポーリングを仕掛けているので、3分以内に変わったかと思います。
Argo CD polls Git repositories every three minutes to detect changes to the manifests. https://argoproj.github.io/argo-cd/operator-manual/webhook/
[root@master argocd]# kubectl get svc | grep guestbook guestbook-ui NodePort 10.111.172.74 <none> 80:**30091**/TCP 39m
おまけ
3分じゃなくてリアルタイムにしたいという場合は「Webhook」を使いましょう。ただしWebhook元からargocd-server
に接続できないといけません。