Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ConfigMap and Secret

30d97c8383a531c459ac210540b4eace?s=47 ry
February 09, 2021

ConfigMap and Secret

30d97c8383a531c459ac210540b4eace?s=128

ry

February 09, 2021
Tweet

Transcript

  1. Configmap and Secret 2021 年 2 月 9 日 Kuberenetes

    Novice Tokyo #8
  2. 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)
  3. 概要 1. ConfigMap と Secret 2. Secret をより Secure に

  4. ConfigMap と Secret

  5. Configmap

  6. What’s ConfigMap 作成方法 • --from-flie ◦ Fileから作成 ① • --from-env-file

    ◦ Fileから作成 ② • --from-literal ◦ CLIから直接値を渡す。 • -f ◦ Manifestから作成 使い方 • 環境変数 • Volumeとしてマウント 用途: 構成ファイルや、機密情報でない環境変数を設定する際に用いる。
  7. 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>
  8. 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>
  9. 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>
  10. 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
  11. Use ConfigMap as Environment Variables 1. env ConfigMap 及び key

    を指定し、 ConfigMap に登録されて いる data の 1 つを環境変数として登録する。 2. envFrom ConfigMap を指定し、 ConfigMap に登録されている data の全てを環境変数として登録する。
  12. 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
  13. 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 に配置する。
  14. 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"]
  15. 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"]
  16. 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
  17. Secret

  18. 作成方法 • --from-flie ◦ Fileから作成 ① • --from-env-file ◦ Fileから作成

    ② • --from-literal ◦ CLIから直接値を渡す。 • -f ◦ Manifestから作成 使い方 • 環境変数 • Volumeとしてマウント 用途: 機密性の高い情報を扱うためのもの What’s Secret (Type: Generic)
  19. 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" }
  20. 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" }
  21. 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" }
  22. 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" }
  23. Use Secret as Environment Variables 1. env ConfigMap 及び key

    を指定し、 ConfigMap に登録されて いる data の 1 つを環境変数として登録する。 2. envFrom Secret を指定し、 Secret に登録されている data の全てを環 境変数として登録する。
  24. 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
  25. 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 に配置する。
  26. 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
  27. 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
  28. Summary ・ ConfigMap と Secret(Generic) の作成方法及び使い方はほとんど変わらない。 ・ ConfigMap と Secret

    は、機密情報であるかどうかで使い分ける。 ・ ConfigMap と Secret を Volume としてマウントした場合に限り、   Pod 作成後のリソース変更は動的に反映される。
  29. よりSecretをSecureに

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

  32. What's Sealed-Secret Secret をより Secure に管理することができるツール。 Sealed-Secret コンテナが払い出す公開鍵で暗号化し、 Sealed-Secret コンテナが所有する秘密鍵によってのみ

    複合化をすることが可能。 GitOps などで、 Secret を Git 上にあげることができない 不便への解決策の 1 つとなりえる。 Secret Sealed-Secret kubeseal command 公開鍵 sealed secret pod kubectl apply 秘密鍵
  33. 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
  34. Generate Public Key # kubeseal --fetch-cert --controller-namespace=sealed-secret \ --controller-name=sealed-secrets >

    public-crt.pem # cat public-crt.pem
  35. Create Secret # echo -n "novice" |base64 bm92aWNl # echo

    -n "novicepassword" |base64 bm92aWNlcGFzc3dvcmQ= # cat novice-secret.yaml
  36. Create Sealed-Secret # kubeseal --format=yaml --cert=public-crt.pem -n default < novice-secret.yaml

    > novice-sealedsecret.yaml # cat novice-sealedsecret.yaml
  37. 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" }