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

ConfigMap and Secret

Avatar for ry ry
February 09, 2021

ConfigMap and Secret

Avatar for ry

ry

February 09, 2021
Tweet

More Decks by ry

Other Decks in Technology

Transcript

  1. 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)
  2. What’s ConfigMap 作成方法 • --from-flie ◦ Fileから作成 ① • --from-env-file

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

    を指定し、 ConfigMap に登録されて いる data の 1 つを環境変数として登録する。 2. envFrom ConfigMap を指定し、 ConfigMap に登録されている data の全てを環境変数として登録する。
  8. 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
  9. 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 に配置する。
  10. 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"]
  11. 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"]
  12. 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
  13. 作成方法 • --from-flie ◦ Fileから作成 ① • --from-env-file ◦ Fileから作成

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

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

    は、機密情報であるかどうかで使い分ける。 ・ ConfigMap と Secret を Volume としてマウントした場合に限り、   Pod 作成後のリソース変更は動的に反映される。
  24. 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 簡単に内容がわかってしまう。。。
  25. What's Sealed-Secret Secret をより Secure に管理することができるツール。 Sealed-Secret コンテナが払い出す公開鍵で暗号化し、 Sealed-Secret コンテナが所有する秘密鍵によってのみ

    複合化をすることが可能。 GitOps などで、 Secret を Git 上にあげることができない 不便への解決策の 1 つとなりえる。 Secret Sealed-Secret kubeseal command 公開鍵 sealed secret pod kubectl apply 秘密鍵
  26. 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
  27. Create Secret # echo -n "novice" |base64 bm92aWNl # echo

    -n "novicepassword" |base64 bm92aWNlcGFzc3dvcmQ= # cat novice-secret.yaml
  28. 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" }