Share
Embed
ConfigMap and Secret
ry
February 09, 2021
Transcript
37 slides
-
Configmap and Secret 2021 年 2 月 9 日 Kuberenetes
Novice Tokyo #8 -
kubectl describe human ry - name: ry - skillset: Storage,
Kubernetes, Ansible(Ansible Tower, AWX), Python - etc: - Kubernetes Novice Tokyo - Kubenews (10:00 p.m. on Friday) -
What’s ConfigMap 作成方法 • --from-flie ◦ Fileから作成 ① • --from-env-file
◦ Fileから作成 ② • --from-literal ◦ CLIから直接値を渡す。 • -f ◦ Manifestから作成 使い方 • 環境変数 • Volumeとしてマウント 用途: 構成ファイルや、機密情報でない環境変数を設定する際に用いる。 -
Create ConfigMap (--from-file) 1. fileを作成 prometheus.yaml 2. fileからConfigmapを作成 # kubectl
create cm prom-config \ --from-file=prometheus.yaml 3. Configmapを確認 # kubectl describe cm prom-config Name: prom-config Namespace: pgo Labels: <none> Annotations: <none> Data ==== prometheus.yaml: ---- global: scrape_interval: 15s external_labels: monitor: 'codelab-monitor' scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] Events: <none> -
Create ConfigMap (--from-env-file) 1. Fileを作成 cpu.txt 2. FileからConfigMapを作成 # kubectl
create cm cpu-conf --from-env-file=cpu.txt 3. ConfigMapを確認 # kubectl describe cm cpu-conf Name: cpu-conf Namespace: default Labels: <none> Annotations: <none> Data ==== cpu.max: ---- 4 cpu.min: ---- 2 Events: <none> -
Create ConfigMap (--from-literal) 1. FileからConfigmapを作成 # kubectl create cm cpu-config
\ --from-literal=cpu.max=4 \ --from-literal=cpu.min=2 2. ConfigMapを確認 # kubectl describe cm cpu-config Name: cpu-config Namespace: pgo Labels: <none> Annotations: <none> Data ==== cpu.max: ---- 4 cpu.min: ---- 2 Events: <none> -
Create ConfigMap (-f) 1. Fileを作成 demo-cm.yaml 2. ManifestからConfigmapを作成 # kubectl
apply -f demo-cm.yaml 3. ConfigMapを確認 # kubectl describe cm prom-config Name: novice-demo Namespace: pgo Labels: <none> Annotations: <none> Data ==== cpu.max: ---- 2 prometheus.yaml: ---- global: scrape_interval: "15s" external_labels: monitor: "codelab-monitor" scrape_configs: - job_name: "prometheus" scrape_interval: "5s" static_configs: - targets: ["localhost:9090"] cpu.max: ---- 4 -
Use ConfigMap as Environment Variables 1. env ConfigMap 及び key
を指定し、 ConfigMap に登録されて いる data の 1 つを環境変数として登録する。 2. envFrom ConfigMap を指定し、 ConfigMap に登録されている data の全てを環境変数として登録する。 -
Use ConfigMap as Environment Variables 「 env 」では、 spec.containers[*].env[*].name で指定した値を
key として環境変数に登録するのに対し、 # kubectl exec -it configmap-demo-pod -- env |grep CPU_* CPU_MAX=4 CPU_MIN=2 「 emvFrom 」では、 ConfigMap の data として登録した状態で、環境変数に登録される。 # kubectl exec -it configmap-demo-pod -- env |grep cpu.* cpu.max=4 cpu.min=2 -
Use ConfigMap as Volumes 1. items なし ConfigMap 内の data
に対して、 key をファイル名、 value をデータとして、 mountPath で指定した path に配置する。 2. items あり ConfigMap 内の data に対して、 spec.volumes[*].configMap.items[*].key で指定した data を spec.volumes[*].configMap.items[*].path をファイル名として、 mountPath で指定した path に配置する。 -
Use ConfigMap as Volumes (itemsなし) # kubectl exec -it configmap-demo-pod
\ -- ls /tmp/novice cpu.max cpu.min prometheus.yaml # kubectl exec -it configmap-demo-pod \ -- cat /tmp/novice/cpu.max 4 # kubectl exec -it configmap-demo-pod \ -- cat /tmp/novice/cpu.min 2 # kubectl exec -it configmap-demo-pod \ -- cat /tmp/novice/prometheus.yaml global: scrape_interval: "15s" external_labels: monitor: "codelab-monitor" scrape_configs: - job_name: "prometheus" scrape_interval: "5s" static_configs: - targets: ["localhost:9090"] -
Use ConfigMap as Volumes (itemsあり) # kubectl exec -it configmap-demo-pod
\ -- ls /tmp/novice CPU.MAX PROMETHEUS.yaml # kubectl exec -it configmap-demo-pod \ -- cat /tmp/novice/CPU.MAX 4 # kubectl exec -it configmap-demo-pod \ -- cat /tmp/novice/PROMETHEUS.yaml global: scrape_interval: "15s" external_labels: monitor: "codelab-monitor" scrape_configs: - job_name: "prometheus" scrape_interval: "5s" static_configs: - targets: ["localhost:9090"] -
Dynamically Update ConfigMap VolumeとしてmountされたConfigmapに関してのみ、更新が反映される。 (最大120秒) (【公式】kubelet sync period (1 minute
by default) + ttl of ConfigMaps cache (1 minute by default) in kubelet) # kubectl patch cm novice-demo -p='{"data":{"cpu.max": "100"}}' (直後) # kubectl exec -it configmap-demo-pod -- cat /tmp/novice/CPU.MAX 4 (数十秒後) # kubectl exec -it configmap-demo-pod -- cat /tmp/novice/CPU.MAX 100 -
作成方法 • --from-flie ◦ Fileから作成 ① • --from-env-file ◦ Fileから作成
② • --from-literal ◦ CLIから直接値を渡す。 • -f ◦ Manifestから作成 使い方 • 環境変数 • Volumeとしてマウント 用途: 機密性の高い情報を扱うためのもの What’s Secret (Type: Generic) -
Create Secret (--from-file) 1. Fileを作成 echo -n "novice" > ./username
echo -n "novicepassword" > ./password 2. FileからSecretを作成 # kubectl create secret generic --save-config novice-cred --from-file=./username --from-file=./password 3. Secretを確認 Key: ファイル名, Value: データ(base64でエンコードされる) # kubectl get secret novice-cred -o json | jq .data { "password": "bm92aWNlcGFzc3dvcmQ=", "username": "bm92aWNl" } -
Create Secret (--from-env-file) 1. Fileを作成 env-cred.txt 2. FileからSecretを作成 # kubectl
create secret generic --save-config novice-env-cred --from-env-file=./env-cred.txt 3. Secretを確認 # kubectl get secret novice-env-cred -o json | jq .data { "password": "bm92aWNlcGFzc3dvcmQ=", "username": "bm92aWNl" } -
Create Secret (--from-literal) 1. FileからSecretを作成 # kubectl create secret generic
--save-config novice-literal-cred \ --from-literal=username=novice \ --from-literal=password=novicepassword 2. Secretを確認 # kubectl get secret novice-literal-cred -o json | jq .data { "password": "bm92aWNlcGFzc3dvcmQ=", "username": "bm92aWNl" } -
Create Secret (-f) 1. Fileを作成 # echo -n "novice" |base64
bm92aWN # echo -n "novicepassword" |base64 bm92aWNlcGFzc3dvcmQ= demo-secret.yaml 2. ManifestからSecretを作成 # kubectl apply -f demo-secret.yaml 3. Secretを確認 # kubectl get secret novice-demo -o json | jq .data { "password": "bm92aWNlcGFzc3dvcmQ=", "username": "bm92aWNl" } -
Use Secret as Environment Variables 1. env ConfigMap 及び key
を指定し、 ConfigMap に登録されて いる data の 1 つを環境変数として登録する。 2. envFrom Secret を指定し、 Secret に登録されている data の全てを環 境変数として登録する。 -
Use Secret as Environment Variables 「 env 」では、 spec.containers[*].env[*].name で指定した値を
key として環境変数に登録するのに対し、 # kubectl exec -it secret-demo-pod -- env |grep USERNAME USERNAME=novice 「 emvFrom 」では、 Secret の data として登録した状態で、環境変数に登録される。 # kubectl exec -it secret-demo-pod -- env |grep username username=novice # kubectl exec -it secret-demo-pod -- env |grep password password=novicepassword -
Use Secret as Volumes 1. items なし Secret 内の data
に対して、 key をファイル名、 value をデータとして、 mountPath で指定した path に配置する。 2. items あり Secret 内の data に対して、 spec.volumes[*].configMap.items[*].key で指定した data を spec.volumes[*].configMap.items[*].path をファイル名として、 mountPath で指定した path に配置する。 -
Use Secret as Volumes ◯itemsなし # kubectl exec -it secret-demo-pod
-- ls /tmp/novice password username # kubectl exec -it secret-demo-pod \ -- cat /tmp/novice/username novice # kubectl exec -it secret-demo-pod \ -- cat /tmp/novice/password novicepassword ◯itemsあり # kubectl exec -it secret-demo-pod -- ls /tmp/novice PASSWORD USERNAME # kubectl exec -it secret-demo-pod \ -- cat /tmp/novice/USERNAME novice # kubectl exec -it secret-demo-pod \ -- cat /tmp/novice/PASSWORD novicepassword -
Dynamically Update Secret VolumeとしてmountされたSecretに関してのみ、更新が反映される。 (最大120秒) (【公式】the kubelet sync period +
cache propagation delay) # echo -n "novice-tokyo" |base64 bm92aWNlLXRva3lv # kubectl patch secret novice-demo -p='{"data":{"username": "bm92aWNlLXRva3lv"}}' (直後) # kubectl exec -it secret-demo-pod -- cat /tmp/novice/USERNAME novice (数十秒後) # kubectl exec -it secret-demo-pod -- cat /tmp/novice/USERNAME novice-tokyo -
Summary ・ ConfigMap と Secret(Generic) の作成方法及び使い方はほとんど変わらない。 ・ ConfigMap と Secret
は、機密情報であるかどうかで使い分ける。 ・ ConfigMap と Secret を Volume としてマウントした場合に限り、 Pod 作成後のリソース変更は動的に反映される。 -
Secret isn't always secure Secret の情報は、 base64 でエンコードして登録してきた。 では、 base64
でデコードしてみると?? # echo `kubectl get secret novice-cred -o json | jq .data.password` |sed 's/"//g' |base64 -d novicepassword 簡単に内容がわかってしまう。。。 -
What's Sealed-Secret Secret をより Secure に管理することができるツール。 Sealed-Secret コンテナが払い出す公開鍵で暗号化し、 Sealed-Secret コンテナが所有する秘密鍵によってのみ
複合化をすることが可能。 GitOps などで、 Secret を Git 上にあげることができない 不便への解決策の 1 つとなりえる。 Secret Sealed-Secret kubeseal command 公開鍵 sealed secret pod kubectl apply 秘密鍵 -
Install (Helm) # helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets # kubectl
create ns sealed-secret # helm install sealed-secrets --namespace sealed-secret sealed-secrets/sealed-secrets # kubectl get pod,svc -n sealed-secret NAME READY STATUS RESTARTS AGE pod/sealed-secrets-58c486d767-ll5ld 1/1 Running 0 121m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/sealed-secrets ClusterIP 10.3.240.14 <none> 8080/TCP 121m -
Generate Public Key # kubeseal --fetch-cert --controller-namespace=sealed-secret \ --controller-name=sealed-secrets >
public-crt.pem # cat public-crt.pem -
Create Secret # echo -n "novice" |base64 bm92aWNl # echo
-n "novicepassword" |base64 bm92aWNlcGFzc3dvcmQ= # cat novice-secret.yaml -
Create Sealed-Secret # kubeseal --format=yaml --cert=public-crt.pem -n default < novice-secret.yaml
> novice-sealedsecret.yaml # cat novice-sealedsecret.yaml -
Apply the sealed-secrets resource # kubectl apply -f novice-sealedsecret.yaml #
kubectl get sealedsecrets NAME AGE novice-secret 51m # kubectl get secrets novice-secret NAME TYPE DATA AGE novice-secret Opaque 2 51m # kubectl get secret novice-secret -o json | jq .data { "password": "bm92aWNlcGFzc3dvcmQ=", "username": "bm92aWNl" }