本記事は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を用いたデプロイのデモ
ハンズオン デモ環境構築
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に変更する必要があります。
GitHubのPackagesにて、対象のイメージ(cicd-handson-2021-code/go-image)を選択し、Package settingsからPublicに変更します。
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を参照出来るかと思います。
今後の取り組み
今回ハンズオンで学んだ技術を社内に展開することが出来ました。
今後、他のツールと比較しながらAidemyのシステムに導入可能かを検討し、よりアジリティの高い開発や堅牢なシステムを実現していきたいと考えております。
もし導入が実現出来た際には、CI/CD Conferenceのコンセプトに沿って、ブログや(機会があれば)登壇などで他の方へ知見を共有していきたいと思います。