kubestronautへの道 ~CKS編 その25 killer coda「Secret Read and Decode/Secret ServiceAccount Pod」~

tech article

今日覚えて帰ること

base64コマンド

 echo -n c2VjcmV0 | base64 -d
  • echoに-nオプションをつけて改行が入らないようにする
  • base64コマンドでdecodeしたいときは-dオプションをつける

Secret Read and Decode

Read and decode the Secrets in Namespace one

  1. Get the Secrets of type Opaque that have been created in Namespace one .
  2. Create a new file called /opt/ks/one and store the base64-decoded values in that file. Each value needs to be stored on a new line.

secretをdecodeしてファイルに書き込め、と言っています。
ちなみに「Opaque」というのは不明瞭な、曖昧な、という意味の英単語です。
汎用的に使えるsecretの型で、迷ったらtypeはこれにしとこう的なやつです。

まずはsecretを確認します。

controlplane $ k get secret -n one
NAME   TYPE     DATA   AGE
s1     Opaque   1      49s
s2     Opaque   1      49s

2つのsecretが存在するのでそれぞれ中身を見てみます。

controlplane $ k get secret s1 -n one -o yaml
apiVersion: v1
data:
  data: c2VjcmV0
kind: Secret
metadata:
  creationTimestamp: "2024-09-15T14:19:25Z"
  name: s1
  namespace: one
  resourceVersion: "1577"
  uid: 282a9eef-3145-4e87-a296-e272d2e94c1e
type: Opaque

controlplane $ k get secret s2 -n one -o yaml
apiVersion: v1
data:
  data: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2024-09-15T14:19:25Z"
  name: s2
  namespace: one
  resourceVersion: "1578"
  uid: 2e068ee4-4b5d-4a29-b733-212d406a0366
type: Opaque

それぞれdecodeします。

controlplane $ echo -n c2VjcmV0 | base64 -d
secretcontrolplane $ 

controlplane $ echo -n YWRtaW4= | base64 -d
admincontrolplane $ 

出力をリダイレクトして書き込もうと思いましたが、改行がちょっとめんどくさそうなのでそれぞれ単語を書き込んで終了です。

Read and decode the Secrets in Namespace two

  1. Get the Secrets of type Opaque that have been created in Namespace two .
  2. Create a new file called /opt/ks/two and store the base64-decoded values in that file. Each value needs to be stored on a new line.

先ほどとやることは全く同じなので解説は省略します。(何のための問題これ?)

Secret ServiceAccount Pod

簡単すぎたのでもう一問やります。

Create Namespace, ServiceAccount and Secrets

  1. Create new Namespace ns-secure and perform everything following in there
  2. Create ServiceAccount secret-manager
  3. Create Secret sec-a1 with any literal content of your choice
  4. Create Secret sec-a2 with any file content of your choice (like /etc/hosts )

namespace, sa, secretを作成しろと言っています。
今更やる必要あるのか、という感じなので手順だけ載せておきます。

controlplane $ k create ns ns-secure
namespace/ns-secure created

controlplane $ k create -n ns-secure sa secret-manager
serviceaccount/secret-manager created

controlplane $ k create -n ns-secure secret generic sec-a1 --from-literal=key=sec-a1
secret/sec-a1 created
controlplane $ k create -n ns-secure secret generic sec-a2 --from-file=/etc/hosts   
secret/sec-a2 created

Create Pod that uses ServiceAccount and Secrets

  1. In Namespace ns-secure create Pod secret-manager with image httpd:alpine which uses the new ServiceAccount
  2. Make Secret sec-a1 available as environment variable SEC_A1
  3. Mount Secret sec-a2 into the Pod read-only under /etc/sec-a2
  4. Verify your solution worked

pod作って環境変数をsecretから埋め込め、と言っています。
今更やる必要あるのか、という感じなので手順だけ載せておきます。

Make Secret sec-a1 available as environment variable SEC_A1
の手順で設定するKeyの値は先ほどこちら側で決めたkeyを入力します。

controlplane $ k run secret-manager -n ns-secure --image=serviceAccountName -oyaml --dry-run > pod.yaml
W0915 14:52:35.030579   13033 helpers.go:703] --dry-run is deprecated and can be replaced with --dry-run=client.

controlplane $ vi pod.yaml 
controlplane $ cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: secret-manager
  name: secret-manager
  namespace: ns-secure
spec:
  volumes:
    - name: sec-a2
      secret:
        secretName: sec-a2
  serviceAccountName: secret-manager
  containers:
    - image: httpd:alpine
      name: secret-manager
      volumeMounts:
        - name: sec-a2
          mountPath: /etc/sec-a2
          readOnly: true
      env:
        - name: SEC_A1
          valueFrom:
            secretKeyRef:
              name: sec-a1
              key: key
  dnsPolicy: ClusterFirst
  restartPolicy: Always

タイトルとURLをコピーしました