kubestronautへの道 ~CKS編 その24 killer coda「Secret Access in Pods」~

tech article

今日覚えて帰ること

SecretをファイルとしてPodから利用する

podにマウントしたsecretの連想配列dataのキーは、mountPath以下のファイル名になる。

Secret Access in Pods

Create Secrets

  1. Create a Secret named holy with content creditcard=1111222233334444
  2. Create Secret from file /opt/ks/secret-diver.yaml

Secretを作成しろと言っています。
瞬殺なので特に解説はしません。

controlplane $ k create secret generic holy --from-literal=creditcard=1111222233334444
secret/holy created
controlplane $ k apply -f /opt/ks/secret-diver.yaml
secret/diver created

Access Secrets in Pod

  1. Create a Pod named pod1 of image nginx
  2. Make Secret holy available as environment variable HOLY
  3. Mount Secret diver as volume. The file should be available under /etc/diver/hosts .
  4. Test env+volume access in the running Pod

podを立ててそのpod内でSecretを使えるようにせよ、と書いています。
これも余裕かと思いきゃ、3で少し手こずりました。

podのマニフェストファイルを作成し、手を加えていきます。
参考にするページはこちら。

Secret
Secretとは、パスワードやトークン、キーなどの少量の機密データを含むオブジェクトのことです。 このような情報は、Secretを用いないとPodの定義やコンテナイメージに直接記載することになってしまうかもしれません。 Secretを使用すれば、アプリケーションコードに機密データを含める必要がなくなります。 なぜなら、...
controlplane $ k run pod1 --image=nginx -oyaml --dry-run > pod.yaml
W0915 10:20:22.641396   35839 helpers.go:703] --dry-run is deprecated and can be replaced with --dry-run=client.

手を加えたマニフェストファイルがこちら。

controlplane $ cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  containers:
  - image: nginx
    name: pod1
    env:
      - name: HOLY
        valueFrom:
          secretKeyRef:
            name: holy
            key: creditcard
    volumeMounts:
    - name: diver
      mountPath: "/etc/diver"
      readOnly: true
    resources: {}
  volumes:
  - name: diver
    secret:
      secretName: diver
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

変更点を赤字に、3にかかわる箇所をさらに太字にしています。
2は公式ページ通りにやればいいので解説は省略します。

3について、ファイルの配置ルールは以下のようになります。

イメージやコマンドラインを変更し、プログラムがそのディレクトリを参照するようにします。連想配列dataのキーはmountPath以下のファイル名になります。

今回対象となるSecretを確認します。

controlplane $ cat /opt/ks/secret-diver.yaml            
apiVersion: v1
data:
  hosts: MTI3LjAuMC4xCWxvY2FsaG9zdAoxMjcuMC4xLjEJaG9zdDAxCgojIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSVB2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgbG9jYWxob3N0IGlwNi1sb2NhbGhvc3QgaXA2LWxvb3BiYWNrCmZmMDI6OjEgaXA2LWFsbG5vZGVzCmZmMDI6OjIgaXA2LWFsbHJvdXRlcnMKMTI3LjAuMC4xIGhvc3QwMQoxMjcuMC4wLjEgaG9zdDAxCjEyNy4wLjAuMSBob3N0MDEKMTI3LjAuMC4xIGNvbnRyb2xwbGFuZQoxNzIuMTcuMC4zNSBub2RlMDEKMTcyLjE3LjAuMjMgY29udHJvbHBsYW5lCg==
kind: Secret
metadata:
  name: diver

すなわち、mountPath: “/etc/diver” 配下に hosts といファイルが作成されることになります。

これもまあ公式ページに書いてることではあるんですが、あまりちゃんと見ないでmountPath: “/etc/diver/hosts”と設定するミスをしてしまったので注意喚起をしておきます。

最後にSecretにアクセスできることを確認して完了です。

controlplane $ kubectl exec pod1 -- env | grep "HOLY=1111222233334444"
HOLY=1111222233334444
controlplane $ 
controlplane $ kubectl exec pod1 -- cat /etc/diver/hosts
127.0.0.1       localhost
127.0.1.1       host01

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 host01
127.0.0.1 host01
127.0.0.1 host01
127.0.0.1 controlplane
172.17.0.35 node01
172.17.0.23 controlplane
controlplane $ 
タイトルとURLをコピーしました