2021年6月17日木曜日

k8s の kustomize に入門する

k8s の kustomize に入門する

概要

kustomize は k8s のマニフェストを生成、管理することができるツールです helm や helmfile に近いツールですが kubectl に標準で搭載されているので別途インストール作業は不要で使えます 今回は簡単なリソース作成を kustomize を使ってやってみました

環境

  • k8s 1.20.1
  • kubectl 1.20.4

今回の流れ

configMap で作成した情報を nginx で表示するアプリを作成してみます 最終的には kustomize.yaml で各種リソースを定義してデプロイします

profile.txt の作成

今回は configMap として登録します kustomize では configMap を作成するために configMapGenrator という機能が使えます これはファイルから configMap の定義を生成してくれる機能です

  • vim profile.txt
name=hawksnowlog

この profile.txt を使って configMap を作成するために kustomize.yaml というファイルを作成します

  • vim kustomize.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

configMapGenerator:
- name: user-profile
  files:
  - profile.txt

とりあえずこれでビルドしてみると kustomize が自動生成してくれるマニフェストの状態を確認することができます

  • kubectl kustomize .

こんな感じで kustomize.yaml にいろいろな定義をしていくことで一括でマニフェストを管理してくれるツールになります

deployment.yaml の作成

次に deployment.yaml を作成します 先程定義した configMap を使うように定義します

  • vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: nginx:latest
        volumeMounts:
        - name: profile
          mountPath: /usr/share/nginx/html
      volumes:
      - name: profile
        configMap:
          name: user-profile

単純な deployment の定義になります volumeMounts で configMap を参照できます 今回はテキストファイルですが nginx のドキュメントルートに配置してあとから確認できるようにします

そしてこの deployment.yaml も kustomize.yaml で管理するので追記します 普通のマニフェストを管理する場合は resoureces ディレクティブを使って定義します

  • vim kustomize.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

configMapGenerator:
- name: user-profile
  files:
  - profile.txt

resources:
- deployment.yaml

service.yaml の作成

deploment によってデプロイされた Pods にアクセスするために service を定義します NodePort でアクセスします

  • vim service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: my-app

selector の「app: my-app」は deployment のラベルと合わせるようにしましょう

これも kustomize.yaml に追記します

  • vim kustomize.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

configMapGenerator:
- name: user-profile
  files:
  - profile.txt

resources:
- deployment.yaml
- service.yaml

動作確認

ここまで作成できたら適用してみます kustomize を使っている場合はすべてのリソースを一回でデプロイできます

  • kubectl apply -k .

-f ではなく -k オプションなので注意しましょう

これでデプロイされると以下のように kustomize によりリソースが作成されているのが確認できると思います

  • kubectl get -k .
NAME                                       DATA   AGE
configmap/user-profile-gd9h846t5c   1      3m25s
NAME             TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/my-app   NodePort   10.110.195.120   <none>        80:30722/TCP   11m
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-app   1/1     1            1           23s

あとは NodePort で LISTEN しているポートにアクセスすればちゃんと profile.txt の内容が確認できます

  • curl node_ip:30722/profile.txt

=> name=hawksnowlog

リソース削除

  • kubectl delete -k .

最後に

自分でマニフェストを作成して管理する際にわざわざ helm chart のテンプレートとして書きたくない場合には kustomize を使う感じかなと思います

helmfile もあるのを考えると helm に寄せるほうが良い気はしますが一概にどちらが良いかは何とも言えないかなと思います

kubectl でのオペレーションに慣れている人は kustomize にしたほうがいいし helm でのオペレーションに慣れている人は helm にしたほうがいいなどはあるかなと思います

参考サイト

0 件のコメント:

コメントを投稿