社内勉強会でCI/CD Conference 2021にて学んだことを展開しました

f:id:aidemy-blog:20210927212127p:plain
CI/CD Conf. '21 を社内展開
Aidemyでは毎週エンジニアによる社内勉強会を実施しております。

本記事は2021/09/02に開催されましたCI/CD Conference 2021のハンズオンに参加しました社員による社内展開の様子を紹介します。

Aidemyの社内勉強について

Aidemyでは毎週水曜日17:30 - 18:00にエンジニアがリモート上に集まり社内勉強会を実施しております。
ローテーションでエンジニア1名が発表者となり、Aidemyの開発に役立つこと、新しい技術についてなど共有します。

以下は過去に発表したテーマの一例です。

  • SOLID原則D 依存関係逆転の原則
  • スクラム開発 「スウォーミング」
  • 実務に活きるアルゴリズム: バイナリサーチ
    ※こちらにご興味がある方は過去にブログへまとめておりますので、是非そちらをご参照ください。

CI/CD Conference 2021について

2021/09/02, 2021/09/03にCI/CD Conference 2021 by CloudNative Daysが開催されました。

2021/09/02は実行委員有志様や各企業様によるハンズオンが行われ、2021/09/03には登壇者様による先端事例・技術解説セッションが行われました。

詳しくはそれぞれのHPをご参照ください。

勉強会(ハンズオン)の発表について

テーマを決めた経緯

発表のテーマを決める際に、CI/CD ConferenceのHPに記載されている以下コンセプトが頭に残っておりました。

『技術を知り、試して、取り入れる』のコンセプトのもと、参加者が優れたCI/CDの知見を取り入れ、改善を行っていけるイベントを目指しています。
そして、ゆくゆくは参加者が登壇者となり、他の人に知見を共有していける、Continuousなイベントでありたいと思っています。

大変素晴らしいコンセプトだと思います。

また、AidemyではGKEを利用しておりますが、CI/CD周りを整備仕切れていないという課題感もありました。

※Aidemyではシステム基盤にGoogle Cloudを採用しています。
採用理由等についてはこちらをご参照ください。

以上2点より、ハンズオンイベント午前に実施されました「Kubernetesで始めるGitOpsの基礎について」を社内に展開しようと考えました。

発表する内容について

発表時間はQAを考えると、20分~25分程度です。
ハンズオンは3時間ほどでしたので、全部展開することは出来ません。

※ハンズオン内容については下記にまとまっております。
とても勉強になりますので、是非ご一度実施することをお勧め致します。

AidemyではCircleCIを導入し、CIOpsベースのCI/CDを実現しております。
なので、CI周りやテストについては省略しようと考えました。
また、セキュリティ周りは色々調査し別途展開したい思いがありましたので、今回は省略しようと考えました。

残った下記項目をスライドにまとめて発表致しました。

  • GitOpsの概要紹介
  • ArgoCDの概要紹介
  • GitOps構成でArgoCDを用いたデプロイのデモ

f:id:aidemy-blog:20210927172742p:plain

ハンズオン デモ環境構築

2021/09/02に行われたハンズオン当日はDocker for Macを利用し、GitOpsとArgoCDを試しておりました。
社内勉強会の発表にて聞き手の皆さんにもArgoCD Web UIを触って頂きたい思いがあり、Aidemyで採用しているGKEでデモ環境を構築し皆さんがログイン出来るようにしようと考えました。

基本的にはドキュメントに沿って構築して行けば問題ありませんがGKEの場合、3点注意点があります。

1. レジストリ変更

GitHub PackagesレジストリをDockerレジストリからコンテナレジストリに変更する必要があります。
つまり、ドキュメント内に出てくるレジストリのURLを下記のように変更する必要があります。

docker.pkg.github.com -> ghcr.io

goapp.yamlで言うと下記のように変更します。

変更前

image: docker.pkg.github.com/<GITHUB_USER>/cicd-handson-2021-code/go-image:base

変更後

image: ghcr.io/<GITHUB_USER>/cicd-handson-2021-code/go-image:base

これはCONTAINER-RUNTIMEがcontainerdの場合、Dockerレジストリが対応していなく、下記エラーが発生するためです。
※一部省略及びマスクしてます

$ kubectl get pod
NAME                               READY   STATUS             RESTARTS   AGE
goapp-deployment-7f6d77587-8x69b   0/1     ImagePullBackOff   0          84s

$ kubectl describe pod goapp-deployment-7f6d77587-8x69b
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Warning  Failed     53s (x6 over 2m11s)  kubelet            Error: ImagePullBackOff
  Normal   Pulling    40s (x4 over 2m11s)  kubelet            Pulling image "docker.pkg.github.com/XXXXXXXX/cicd-handson-2021-code/go-image"
  Warning  Failed     40s (x4 over 2m11s)  kubelet            Failed to pull image "docker.pkg.github.com/XXXXXXXX/cicd-handson-2021-code/go-image": rpc error: code = Unknown desc = failed to pull and unpack image "docker.pkg.github.com/XXXXXXXX/cicd-handson-2021-code/go-image": failed to resolve reference "docker.pkg.github.com/XXXXXXXX/cicd-handson-2021-code/go-image": unexpected status code [manifests 12]: 401 Unauthorized
  Warning  Failed     40s (x4 over 2m11s)  kubelet            Error: ErrImagePull
  Normal   BackOff    26s (x7 over 2m11s)  kubelet            Back-off pulling image "docker.pkg.github.com/XXXXXXXX/cicd-handson-2021-code/go-image"

2019年に上記エラーが発生し、2020年にコンテナレジストリを発表し対応したとのことです。
詳細については、こちらのIssuesにてやりとりがされております。

Docker for MacにてCONTAINER-RUNTIME確認

% kubectl get nodes -o wide
NAME             STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION     CONTAINER-RUNTIME
docker-desktop   Ready    control-plane,master   67d   v1.21.2   192.168.65.4   <none>        Docker Desktop   5.10.25-linuxkit   docker://20.10.7

GKEにてCONTAINER-RUNTIME確認

% kubectl get nodes -o wide
NAME                                          STATUS   ROLES    AGE   VERSION           INTERNAL-IP   EXTERNAL-IP      OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME
gke-cicd-cluster-default-pool-24047f61-scqt   Ready    <none>   40s   v1.20.9-gke.701   10.146.0.19   34.146.187.150   Container-Optimized OS from Google   5.4.120+         containerd://1.4.4

2. コンテナレジストリをPublicに変更

コンテナレジストリにPushするとデフォルトPrivateとなっております。
GKEにデプロイ出来るようPublicに変更する必要があります。

f:id:aidemy-blog:20210917171225p:plain

GitHubのPackagesにて、対象のイメージ(cicd-handson-2021-code/go-image)を選択し、Package settingsからPublicに変更します。

f:id:aidemy-blog:20210917171323p:plain

f:id:aidemy-blog:20210917171334p:plain

3. ArgoCDにて外部IP付与

自分のみArgoCD Web UIを参照する場合、ドキュメントに記載されている通りPort Forwardingを実施すればアクセス出来ます。
今回は勉強会に参加している皆さんにArgoCD Web UIを参照して頂くため、Service TypeをLoad Balancerに変更しました。

% kubectl get svc argocd-server -n argocd
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
argocd-server           ClusterIP   10.3.248.65    <none>        80/TCP,443/TCP               8m49s

% kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
service/argocd-server patched

% kubectl get svc argocd-server -n argocd
NAME            TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)                      AGE
argocd-server   LoadBalancer   10.3.248.65   34.85.85.184   80:30138/TCP,443:30505/TCP   10m

EXTERNAL-IPに表示されたIPを用いてブラウザにてアクセス出来ます。
以降は、ドキュメントに記載されている通り作業して頂ければArgoCD Web UIを参照出来るかと思います。

f:id:aidemy-blog:20210917171346p:plain
デプロイ後のArgoCD Web UI

今後の取り組み

今回ハンズオンで学んだ技術を社内に展開することが出来ました。
今後、他のツールと比較しながらAidemyのシステムに導入可能かを検討し、よりアジリティの高い開発や堅牢なシステムを実現していきたいと考えております。

もし導入が実現出来た際には、CI/CD Conferenceのコンセプトに沿って、ブログや(機会があれば)登壇などで他の方へ知見を共有していきたいと思います。