今年の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
- メディア: 単行本(ソフトカバー)