フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【手順】KubernetesにArgoCDを入れてデモアプリを動かしてみる

f:id:lirlia:20200414043748p:plain

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)

f:id:lirlia:20200414025036p:plain


パスワードはこのコマンドの実行結果です。

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通りあり

  1. type: LoadBalancerを使う
  2. Ingressを使う
  3. ポートフォワーディングを使う

今回はローカル環境なのでポートフォワーディングを使います。

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をクリックします。

f:id:lirlia:20200414030735p:plain


入力します

f:id:lirlia:20200414030807p:plain


入力します

f:id:lirlia:20200414030913p:plain


DESTINATIONを指定します

f:id:lirlia:20200414030919p:plain


CREATEをおします。

f:id:lirlia:20200414030951p:plain


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

しばらく待つとHEALTHHealthyとなりデプロイが成功します。

[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]# 

f:id:lirlia:20200414032204p:plain

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

アクセスもきちんとできるようになりましたね。

f:id:lirlia:20200414034644p:plain

自動Syncも試してみよう。

--sync-policyautomatedにすると自動で同期するようです。では、続いては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に接続できないといけません。