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

ConfigMap and Secret

ry
February 09, 2021

ConfigMap and Secret

ry

February 09, 2021
Tweet

More Decks by ry

Other Decks in Technology

Transcript

  1. Configmap and Secret
    2021

    2

    9

    Kuberenetes Novice Tokyo #8

    View Slide

  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)

    View Slide

  3. 概要
    1. ConfigMap

    Secret
    2. Secret
    をより
    Secure

    View Slide

  4. ConfigMap と Secret

    View Slide

  5. Configmap

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. Use ConfigMap as Environment Variables
    1. env
    ConfigMap
    及び
    key
    を指定し、
    ConfigMap
    に登録されて
    いる
    data

    1
    つを環境変数として登録する。
    2. envFrom
    ConfigMap
    を指定し、
    ConfigMap
    に登録されている
    data
    の全てを環境変数として登録する。

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  17. Secret

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. Use Secret as Environment Variables
    1. env
    ConfigMap
    及び
    key
    を指定し、
    ConfigMap
    に登録されて
    いる
    data

    1
    つを環境変数として登録する。
    2. envFrom
    Secret
    を指定し、
    Secret
    に登録されている
    data
    の全てを環
    境変数として登録する。

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  28. Summary

    ConfigMap

    Secret(Generic)
    の作成方法及び使い方はほとんど変わらない。

    ConfigMap

    Secret
    は、機密情報であるかどうかで使い分ける。

    ConfigMap

    Secret

    Volume
    としてマウントした場合に限り、
     
    Pod
    作成後のリソース変更は動的に反映される。

    View Slide

  29. よりSecretをSecureに

    View Slide

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

    View Slide

  31. Sealed Secret

    View Slide

  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
    秘密鍵

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide