今年の4月頃に「Kubernetes 完全ガイド」を読み終えたけど,まだ書評を書いていなかった.そしたら8月に「Kubernetes 完全ガイド 第2版」が出版されたため,さっそく購入して,読み直している.読みながら気になった機能を試していく.今回は ConfigMap にする.

Kubernetes完全ガイド 第2版 (Top Gear)
- 作者:⻘⼭ 真也
- 発売日: 2020/08/07
- メディア: 単行本(ソフトカバー)
ConfigMap (binaryData)
「第7章 : Config & Storage APIs カテゴリ」の ConfigMap を読み直していたら,テキスト (UTF-8) だけではなく「バイナリ」を登録する内容が新しく追加されていた.拡張子 .jpg など画像ファイルを Base64 でエンコードして,nginx コンテナから HTML と画像ファイルを配信するというサンプルだった.今まで ConfigMap で「バイナリ」を登録したことがなく,動作確認のために「Kubernetes 完全ガイド 第2版」を参考にしながら試した.なお,今回試した Kubernetes 環境は以下の通り.
$ kubectl version --short Client Version: v1.18.6 Server Version: v1.18.6
通常の Docker Desktop for Mac だと Kubernetes v1.16 になるけど,Docker Desktop for Mac "Edge" を使えば,Kubernetes v1.18 を使えるようになる.個人的には Edge を使っている.
ConfigMap を作成する
まず,マニフェストを書かずに kubectl create で直接 ConfigMap を作成する.今回は --from-literal オプションで HTML をテキストとして設定し,--from-file オプションで画像を設定している.画像のフィールド名は cat.png だけど,実際には白い猫アイコン (cat-white.png) を設定している.
$ kubectl create configmap sandbox-configmap-binary \ --save-config \ --from-literal=index.html='Hello, <img src="./cat.png">' \ --from-file=cat.png=cat-white.png configmap/sandbox-configmap-binary created
コマンド例はドキュメントにも載っている.
マニフェスト管理をする場合は,Base64 でエンコードをする必要はなく,kubectl create に --dry-run オプションと --output オプションを追加すれば,マニフェストにリダイレクトできる.
$ kubectl create configmap sandbox-configmap-binary \ --save-config \ --from-literal=index.html='Hello, <img src="./cat.png">' \ --from-file=cat.png=cat-white.png \ --dry-run=client \ --output=yaml > sandbox-configmap-binary.yaml
data フィールドと binaryData フィールド
リダイレクトした sandbox-configmap-binary.yaml を確認すると,以下のようにテキスト (UTF-8) の値は data フィールドに設定されて,バイナリは binaryData フィールドに設定される.なお,エンコードされた内容は長いので xxxxx と省略した.
apiVersion: v1 binaryData: cat.png: xxxxx data: index.html: Hello, <img src="./cat.png"> kind: ConfigMap metadata: creationTimestamp: null name: sandbox-configmap-binary
ConfigMap に変化はないけど,マニフェストを kubectl apply で適用しておく.
$ kubectl apply -f sandbox-configmap-binary.yaml
configmap/sandbox-configmap-binary configured
Pod を作成する
今度は ConfigMap を Volume マウントした nginx の Pod マニフェスト sandbox-configmap-binary-nginx.yaml を書く.目的としては nginx から ConfigMap に登録した index.html と cat.png を配信できるようにする.
apiVersion: v1 kind: Pod metadata: name: sandbox-configmap-binary-nginx spec: containers: - name: nginx image: nginx:1.18 volumeMounts: - name: config-volume mountPath: /usr/share/nginx/html volumes: - name: config-volume configMap: name: sandbox-configmap-binary
マニフェストを kubectl apply で適用し,ポートフォワードもしておく.
$ kubectl apply -f sandbox-configmap-binary-nginx.yaml
pod/sandbox-configmap-binary-nginx created
$ kubectl port-forward sandbox-configmap-binary-nginx 8888:80
さっそく http://localhost:8888/ にアクセスをすると,期待通りに index.html と cat.png を表示できた.なお,白い猫アイコンと次に使う黒い猫アイコンは Icons8 から取得した.

ConfigMap を更新する
今度は ConfigMap に登録した cat.png を 白い猫アイコン (cat-white.png) から黒い猫アイコン (cat-black.png) に変えて,マニフェストを適用する.
$ kubectl create configmap sandbox-configmap-binary \ --save-config \ --from-literal=index.html='Hello, <img src="./cat.png">' \ --from-file=cat.png=cat-black.png \ --dry-run=client \ --output=yaml > sandbox-configmap-binary.yaml $ kubectl apply -f sandbox-configmap-binary.yaml configmap/sandbox-configmap-binary configured
ConfigMap を Volume マウントしている場合は,自動的に反映されるため,ブラウザを更新すると黒い猫アイコンに変わった.

まとめ
8月に出版された「Kubernetes 完全ガイド 第2版」を読みながら ConfigMap の binaryData フィールドを試した.実際のワークロードでは画像を Base64 でエンコードする場面は少ないかもしれないけど,試せて良かった.引き続き,読み直していくぞ!

Kubernetes完全ガイド 第2版 (Top Gear)
- 作者:⻘⼭ 真也
- 発売日: 2020/08/07
- メディア: 単行本(ソフトカバー)