Kubernetes完全ガイド 第7章 Config & Storage リソース
Secret
ConfigMap
PersistentVolumeClaim
k8sにおいては個別のコンテナに対する設定は環境変数やファイルのマウントが一般的
k8sで環境変数を渡す方法として
静的設定
spec.containers.env に静的な値として定義
Podの情報
pod自身のIPアドレス、起動時間など
fieldRef を使うことで参照できる
コンテナの情報
podの情報と同様にコンテナの情報はresourceFieldRef で参照
Secret リソースの機密情報
ConfigMap リソースの設定値
環境変数を扱う際の注意
通常のように ${TESTENV} のように利用はできない
マニフェスト内で定義した環境変数に限り $(TESTENV) という形式で呼び出しが可能
OSからしか参照できない環境変数は entrypoint を entrypoint.sh といったシェルスクリプトにしてその中で処理する
Secret
マニフェストはbase64でエンコードされてるだけで暗号化されてるわけではない
暗号化のためのOSSの一例として kubesec
一つのSecretの中には複数のKey-Value、格納可能なデータサイズは合計1MB
Generic (type: Opaque)
--from-file
ファイル名がそのままKeyになる (拡張子を外しておくのがよい)
--from-file=username=username.txt のように指定も可能
ファイル作成時に改行コードが入らないように注意 (echo -n で書き込むのがよい)
--from-env-file
envfileから作成する
Dockerで --env-file を使っている場合はそのまま利用できる
--from-literal
--from-literal=username=root のようにkubectlで直接 値を渡す
-f
マニフェストにbase64でエンコードした値を埋め込む
TLS (type: kubernetes.io/tls)
証明書として利用
Ingress から利用するのが一般的
例
code:txt
# 自己署名証明書の作成
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ~/tls.key -out ~/tls.crt -subj "/CN=sample1.example.com"
kubectl create secret tls --save-config tls-sample --key ~/tls.key --cert ~/tls.crt
Docker レジストリ (type: kubernetes.io/dockerconfigjson)
コンテナレジストリがプライベートの場合には認証が必要
この認証情報をSecretとして定義
プライベートリポジトリのイメージを取得する際はspec.imagePullSecrets に docker-registry タイプのSecretを指定する
Secret の利用方法
環境変数として渡す
Secretの特定のKeyのみ : spec.containers[].env の valueFrom.secretKeyRef
SecretのすべてのKey : spec.containers[].envFrom[].secretRef
Volumeとしてマウントする
Secretの特定のKeyのみ : spec.volumes[] の secret.items[]
SecretのすべてのKey : volumes[].secret.secretName
動的なSecretの更新
VolumeマウントによるSecretは一定期間(kubeletのSyncLoopのタイミング)にkube-apiserverに変更を確認し、変更がある場合はファイルの入れ替えを行う。
デフォルトは60秒。kubelet の --sync-frequency で調整
環境変数によるSecretは動的な更新はできない
kubesec
GnuPG, Google Cloud KMS, AWS KMS を利用してSecretを暗号化
ファイル全体を暗号化するのではなく、Secretの構造(data.*)を保ったまま値だけを暗号化
SecretとConfigMapの使い分け
機密情報を扱うかどうか
Secretのデータはetcdに保存
Secretを利用するpodがある場合にのみetcdからNodeにデータを送信
Nodeに永続的にデータが残らないように tmpfs に保持される
kubectl で表示した際に値が見えにくいというメリットも
ConfigMap
--from-file
ファイル名がそのままKey名になる
Key名を変更したい場合は --from-file=nginx.conf=sample-nginx.conf
--from-literal
--from-literal=connection.max=100 --from-literal=connection.min=10
-f
Secretとは異なり、base64エンコードはされない
Key: | のようにして次の行から定義
数値は "" ダブルクォートで囲む
利用方法
環境変数として 特定のKeyのみ
env.valueFrom.configMapKeyRef
環境変数としてすべてのKey
envFrom.configMapRef.name
Volumeとしてマウントして特定のKeyのみ
volumes[].configMap.items[].key
VolumeとしてマウントしてすべてのKey
volumes[].configMap.name
動的なConfigMapの更新
VolumeマウントしたConfigMapは一定期間(kubeletのSyncLoopのタイミング)でkube-apiserverに変更を確認し、ファイルの入れ替えを行う
間隔を調整する場合はkubeletの--sync-frequencyを設定する
Volume
Volume と PV と PVC の違い
Volume: あらかじめ用意された利用可能なボリューム(ホスト/NFS/Ceph等)をマニフェストに直接指定
PV: 外部の永続ボリュームを提供するシステムを連携して新規のボリューム作成や、既存のボリューム削除
PVC: 作成されたPVリソースの中からアサインするためのリソース。PVはクラスタにボリュームを登録するだけなので、podから利用するにはPVCが必要
Volumeプラグイン
(Secrets, ConfigMap もVolumeプラグインの一種)
emptyDir
pod用の一時的なディスク領域。podがterminateされると削除される
ホスト上の領域がマッピングされる
ホスト上の任意の領域をマウントできたり、ホスト上のファイルを参照することもできない
hostPath
ノード上の領域をコンテナにマッピングする
emptyDirとは異なりホスト上の任意の領域をマウントできる
typeとして、Directory/DirectoryOrCreate/File/Socket/BlockDevice
downwardAPI
podの情報などをファイルとして配置する
projected
Secret/ConfigMap/downwardAPI/serviceAccountToken のボリュームマウントを1箇所のディレクトリに集約する
nfs
iscsi
cepfs
PersistentVolume
VolumeはPodの定義に直接書き込むが、PVはリソースとして個別に作成し利用する
PersistentVolume プラグイン
GCE Persistent Disk
AWS Elastic Block Store
NFS
iSCSI
Ceph
OpenStack Cinder
GlusterFS
作成
Label
PVCでLabelを利用してボリュームを指定することができ便利
容量
dynamic provisioningが利用できない場合は小さめに用意するべき
PVCからの要求が3GBの場合、PVの中から最も近い容量である10GBが割り当てられたりする
アクセスモード
ReadWriteOnce (RWO)
単一ノードからRead/Writeが可能 (単一podでなく単一ノード)
ReadOnlyMany(ROX)
ReadWriteMany(RWX)
ReclaimPolicy
Delete
Retain
PVを消さずに保持する
他のPVCによって再度マウントされることはない
Recycle
廃止が予定されている(もう廃止されてる?)
PersistentVolumeClaim
ラベルセレクタ
容量
アクセスモード
StorageClass
いずれもPVで定義した値であり、PVCの要求にマッチするPVが払い出される
DynamicProvisioning
PVCが発行されたタイミングで動的にPVを作成し、割り当てる
多くのProvisionerが一部のアクセスモードしかサポートしていない
事前にStorageClassを作成する。この時点でProvisionerを設定して、DynamicProvisioningが行われる
PersistentVolumeClaimResizeによるボリュームの拡張
DynamicProvisioningにおいてリサイズがサポートされている場合は、PVCの拡張を行える
kubectl patch でPVCのサイズを変更
StatefulSetでのPVC(volumeClaimTempate)
StatefulSet にある設定項目 spec.volumeClaimTemplate
PVCを別途定義する必要がなくなり、自動的にPVCを作成可能
volumeMounts で利用可能なオプション
ReadOnly マウント
subPath