Slide 1

Slide 1 text

Configmap and Secret 2021 年 2 月 9 日 Kuberenetes Novice Tokyo #8

Slide 2

Slide 2 text

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)

Slide 3

Slide 3 text

概要 1. ConfigMap と Secret 2. Secret をより Secure に

Slide 4

Slide 4 text

ConfigMap と Secret

Slide 5

Slide 5 text

Configmap

Slide 6

Slide 6 text

What’s ConfigMap 作成方法 ● --from-flie ○ Fileから作成 ① ● --from-env-file ○ Fileから作成 ② ● --from-literal ○ CLIから直接値を渡す。 ● -f ○ Manifestから作成 使い方 ● 環境変数 ● Volumeとしてマウント 用途: 構成ファイルや、機密情報でない環境変数を設定する際に用いる。

Slide 7

Slide 7 text

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: Annotations: 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:

Slide 8

Slide 8 text

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: Annotations: Data ==== cpu.max: ---- 4 cpu.min: ---- 2 Events:

Slide 9

Slide 9 text

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: Annotations: Data ==== cpu.max: ---- 4 cpu.min: ---- 2 Events:

Slide 10

Slide 10 text

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: Annotations: 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

Slide 11

Slide 11 text

Use ConfigMap as Environment Variables 1. env ConfigMap 及び key を指定し、 ConfigMap に登録されて いる data の 1 つを環境変数として登録する。 2. envFrom ConfigMap を指定し、 ConfigMap に登録されている data の全てを環境変数として登録する。

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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 に配置する。

Slide 14

Slide 14 text

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"]

Slide 15

Slide 15 text

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"]

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Secret

Slide 18

Slide 18 text

作成方法 ● --from-flie ○ Fileから作成 ① ● --from-env-file ○ Fileから作成 ② ● --from-literal ○ CLIから直接値を渡す。 ● -f ○ Manifestから作成 使い方 ● 環境変数 ● Volumeとしてマウント 用途: 機密性の高い情報を扱うためのもの What’s Secret (Type: Generic)

Slide 19

Slide 19 text

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" }

Slide 20

Slide 20 text

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" }

Slide 21

Slide 21 text

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" }

Slide 22

Slide 22 text

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" }

Slide 23

Slide 23 text

Use Secret as Environment Variables 1. env ConfigMap 及び key を指定し、 ConfigMap に登録されて いる data の 1 つを環境変数として登録する。 2. envFrom Secret を指定し、 Secret に登録されている data の全てを環 境変数として登録する。

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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 に配置する。

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Summary ・ ConfigMap と Secret(Generic) の作成方法及び使い方はほとんど変わらない。 ・ ConfigMap と Secret は、機密情報であるかどうかで使い分ける。 ・ ConfigMap と Secret を Volume としてマウントした場合に限り、   Pod 作成後のリソース変更は動的に反映される。

Slide 29

Slide 29 text

よりSecretをSecureに

Slide 30

Slide 30 text

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 簡単に内容がわかってしまう。。。

Slide 31

Slide 31 text

Sealed Secret

Slide 32

Slide 32 text

What's Sealed-Secret Secret をより Secure に管理することができるツール。 Sealed-Secret コンテナが払い出す公開鍵で暗号化し、 Sealed-Secret コンテナが所有する秘密鍵によってのみ 複合化をすることが可能。 GitOps などで、 Secret を Git 上にあげることができない 不便への解決策の 1 つとなりえる。 Secret Sealed-Secret kubeseal command 公開鍵 sealed secret pod kubectl apply 秘密鍵

Slide 33

Slide 33 text

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 8080/TCP 121m

Slide 34

Slide 34 text

Generate Public Key # kubeseal --fetch-cert --controller-namespace=sealed-secret \ --controller-name=sealed-secrets > public-crt.pem # cat public-crt.pem

Slide 35

Slide 35 text

Create Secret # echo -n "novice" |base64 bm92aWNl # echo -n "novicepassword" |base64 bm92aWNlcGFzc3dvcmQ= # cat novice-secret.yaml

Slide 36

Slide 36 text

Create Sealed-Secret # kubeseal --format=yaml --cert=public-crt.pem -n default < novice-secret.yaml > novice-sealedsecret.yaml # cat novice-sealedsecret.yaml

Slide 37

Slide 37 text

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" }