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 full-size 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 full-size slide

  3. 概要
    1. ConfigMap

    Secret
    2. Secret
    をより
    Secure

    View full-size slide

  4. ConfigMap と Secret

    View full-size slide

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

    View full-size slide

  6. 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 full-size slide

  7. 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 full-size slide

  8. 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 full-size slide

  9. 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 full-size slide

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

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

    View full-size slide

  11. 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 full-size slide

  12. 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 full-size slide

  13. 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 full-size slide

  14. 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 full-size slide

  15. 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 full-size slide

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

    View full-size slide

  17. 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 full-size slide

  18. 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 full-size slide

  19. 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 full-size slide

  20. 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 full-size slide

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

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

    View full-size slide

  22. 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 full-size slide

  23. 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 full-size slide

  24. 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 full-size slide

  25. 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 full-size slide

  26. Summary

    ConfigMap

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

    ConfigMap

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

    ConfigMap

    Secret

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

    View full-size slide

  27. よりSecretをSecureに

    View full-size slide

  28. 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 full-size slide

  29. Sealed Secret

    View full-size slide

  30. 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 full-size slide

  31. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. 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 full-size slide