kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Kubernetes でバイナリを ConfigMap (binaryData) に登録する

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

Kubernetes完全ガイド 第2版 (Top Gear)

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 を使っている.

docs.docker.com

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

コマンド例はドキュメントにも載っている.

kubernetes.io

マニフェスト管理をする場合は,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.htmlcat.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.htmlcat.png を表示できた.なお,白い猫アイコンと次に使う黒い猫アイコンは Icons8 から取得した.

f:id:kakku22:20200814214221p:plain

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 マウントしている場合は,自動的に反映されるため,ブラウザを更新すると黒い猫アイコンに変わった.

f:id:kakku22:20200814214233p:plain

まとめ

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

Kubernetes完全ガイド 第2版 (Top Gear)

Kubernetes完全ガイド 第2版 (Top Gear)

  • 作者:⻘⼭ 真也
  • 発売日: 2020/08/07
  • メディア: 単行本(ソフトカバー)