デモや検証用の環境を作る時、毎回クラスタ立ち上げてパッケージ入れて、Manifestをapplyして、ってのがなかなか面倒くさい。
これをTanzu Mission Control(TMC)で楽しよう、というのが今回の狙い。
TMCではCluster groupという概念があり、クラスタを複数管理でき、まとめて設定などを入れることが出来る。
この設定の中に
- Helm Chartのインストール
- Kustomizationの設定
があり、これらを事前に設定しておくことで、Cluster groupに属するクラスタ作成時に自動でHelmのデプロイやらKustomizationを利用したリソースのデプロイが出来るので、これを使ってみる。
今回のゴール
Workloadクラスタ作成時に以下が最初からクラスタに入っている。
- Gitea(bitnamiのHelm Chartを利用)
- nginx(サンプルアプリ相当)
また、クラスタデプロイや上記の構築にCLIは利用しない。
前提
以下は実施済みのものとする。
- TMCへのManagement Clusterの登録
- GitHub上のPrivate RepositoryにCD対象のManifestを登録
なお、今回利用するManifestはこちらの記事と同じものを使う。
Cluster groupの準備
TMCにログインし、Cluster groups
からCREATE CLUSTER GROUP
を選択しCluster groupを作成する
Helmの準備
作成したCluster groupを選択し、Git repositories
からENABLE CONTINUOUS DELIVERY
を選択し、CDを有効化する。
クリックすると画面がリロードされ、ADD GIT REPOSITORY
がクリックできるようになっているので、これをクリックする。
今回はbitnamiのHelm Chartを利用するため、以下の設定を行う。
-
Repository name
: bitnami -
Repository URL
: https://github.com/bitnami/charts -
Repository credential (optional)
: No credentials needed -
Branch
: main
スクショには入れ忘れたが、Branch
にmainを設定するのを忘れないこと。
項目を埋めたらADD GIT REPOSITORY
をクリックする。問題なければSync status
がApplied
になる。(しばらく時間が掛かることがあるので、その場合は少し待つこと)
Kustomizationの準備
GitHub上のPrivate RepositoryにあるManifestにアクセスするために、リポジトリ参照用の認証情報を登録する。
Repository credentials
からCREATE REPOSITORY CREDENTIAL
をクリックする。
GitHubの認証情報を埋めてCREATE REPOSITORY CREDENTIAL
をクリックする
-
Credential name
: github -
SSH Key
:cat ~/.ssh/id_rsa
の結果 -
Known hosts
:ssh-keyscan github.com 2> /dev/null | grep ecdsa-sha2-nistp256
の結果
SSH Keyは人によっては異なると思うので、その場合は自分が使っているGitHubの認証で使ってる秘密鍵の中身を指定する。
追加後、Sync status
がProcessing
になっているが、一旦置いておいて次にManifestがあるリポジトリを追加する。
Git repositories
からADD GIT REPOSITORY
をクリックし、今度はManifestがあるリポジトリを選択する。
-
Repository name
: <リポジトリ名> -
Repository URL
: ssh://git@github.com/<アカウント名>/<リポジトリ>.git -
Repository credential (optional)
: github -
Branch
: <ブランチ名>
ブランチ名はデフォルトでmaster
となっており、最近のmain
の流れとずれてるため、明示的に指定した方が間違いが起きにくい。
こちらも追加すると、Sync status
がApplied
になる。
次に上記のリポジトリを使ってデプロイするためのKustomizationの設定を行う。
Installed kustomizaton
からADD KUSTOMIZATION
をクリックし、値を入れていく。
-
Kustomization name
: <任意の名前> -
Repository
: <先程作ったリポジトリ名> -
Path
:
Helmの有効化
Installed Helm releases
からENABLE HELM SERVICE
をクリックし、画面がリロードされた後に表示されるCREATE HELM RELEASE
をクリックする。
次に以下を入力する。
-
Repository
: bitnami ※先程作成したもの -
Chart path
: bitnami/gitea ※giteaの登録したリポジトリからの相対パス -
Release name
: -
Target namespace
: <展開先Namespace> -
YAML
: values.yamlの中身
今回は以下のように入力した。お試しのためYAML
は空にした。
以上で準備は完了となる。
クラスタのデプロイ
左サイドバーからCreate cluster
からADD Cluster
をクリックし、クラスタを作成する。
詳細な作成手順は省略するが、Cluster groupの指定は先程設定したものを指定することを忘れないようにする点だけ注意となる。
確認
クラスタ構築後、クラスタはHealthyになっているが、Add-onのステータスはFeatureDisabled
になっている。
これはクラスタ構築後に各種コントローラが構築されていない時に表示され、しばらく待てば解消されるので、クラスタ構築完了後もこちらのステータスが変わるまで待つ。
まずはGiteaから確認する。
$ kubectl get all -n gitea
NAME READY STATUS RESTARTS AGE
pod/gitea-gitea-7c87b6d775-qf8k6 1/1 Running 0 2m11s
pod/gitea-gitea-postgresql-0 1/1 Running 0 2m11s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/gitea-gitea LoadBalancer 100.71.123.61 <pending> 80:32712/TCP,22:32694/TCP 2m11s
service/gitea-gitea-postgresql ClusterIP 100.71.160.203 <none> 5432/TCP 2m11s
service/gitea-gitea-postgresql-hl ClusterIP None <none> 5432/TCP 2m11s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/gitea-gitea 1/1 1 1 2m11s
NAME DESIRED CURRENT READY AGE
replicaset.apps/gitea-gitea-7c87b6d775 1 1 1 2m11s
NAME READY AGE
statefulset.apps/gitea-gitea-postgresql 1/1 2m11s
デフォルトでService
がtype: LoadBalancer
になっているためExternal-IP
が<pending>
になっているものの、上手く起動しているようにみえる。
curlで念の為起動しているか確認する。
$ kubectl port-forward -n gitea service/gitea-gitea 8011:80 &
$ curl -s localhost 127.0.0.1:8011 | head
<!DOCTYPE html>
<html lang="en-US" class="theme-auto">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>example</title>
<link rel="manifest" href="data:application/json;base64,eyJuYW1lIjoiZXhhbXBsZSIsInNob3J0X25hbWUiOiJleGFtcGxlIiwic3RhcnRfdXJsIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwLyIsImljb25zIjpbeyJzcmMiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXNzZXRzL2ltZy9sb2dvLnBuZyIsInR5cGUiOiJpbWFnZS9wbmciLCJzaXplcyI6IjUxMng1MTIifSx7InNyYyI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hc3NldHMvaW1nL2xvZ28uc3ZnIiwidHlwZSI6ImltYWdlL3N2Zyt4bWwiLCJzaXplcyI6IjUxMng1MTIifV19">
<meta name="default-theme" content="auto">
<meta name="author" content="Gitea - Git with a cup of tea">
(23) Failed writing body
問題なさそうだ。
次にnginxの方を確認する。なお、Kustomizationのコントローラのチェック感覺が5分毎なので、場合によってはリソース作成まで少し待つことがある。
$ kubectl get all -n tmc-cd-demo
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-767b6f87c4-8vrnh 1/1 Running 0 9m53s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-deploy ClusterIP 100.70.21.167 <none> 80/TCP 44s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 14m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deploy-767b6f87c4 1 1 1 9m53s
$ kubectl port-forward service/nginx-deploy -n tmc-cd-demo 8111:80 &
$ curl -s localhost:8111 | head
Handling connection for 8111
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
こちらも問題なさそうだ。