如何使用secret傳參數給kubernetes的pod

王俊城 Anderson Wang

  • 精誠資訊/恆逸教育訓練中心-資深講師
  • 技術分類:虛擬化應用

 

 

kubernetes的最小單位是pod,預設情況下,一個pod內只有一個container。



Run-time的時候,pod的參數有幾種方式取得

  • Container image的預設值
  • Run-time透過 --env 參數傳入
  • Run-time使用 configMAP 傳入
  • Run-time使用 secret 傳入

只有secret可以將參數,透過base64 encode/decode方式,增加傳遞參數的安全性。

先將要傳遞給pod的帳號及密碼,使用base64 encode編碼

    [root@master ~]# echo -n "root" | base64
    cm9vdA==
    [root@master ~]# echo -n "pass1234" | base64 
    cGFzczEyMzQ= 

將base64 encode編碼之後的內容,寫到YAML檔案

    [root@master ~]# vi my-secret.yaml
    [root@master ~]# cat my-secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
        name: demo-secret-from-yaml
    type: Opaque
    data:
        username: cm9vdA==
        password: cGFzczEyMzQ=

建立secret

    [root@master ~]# kubectl apply -f my-secret.yaml
    secret/demo-secret-from-yaml created
    [root@master ~]# kubectl get secrets demo-secret-from-yaml
    NAME                    TYPE     DATA   AGE
    demo-secret-from-yaml   Opaque   2      83s
    [root@master ~]# kubectl describe secrets demo-secret-from-yaml
    Name:         demo-secret-from-yaml
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  8 bytes
    username:  4 bytes

pod透過environment,接收secret傳遞的參數

    [root@master ~]# vi my-pod.yaml
    [root@master ~]# cat my-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
        name: my-pod
        labels:
        app: webserver
    spec:
        containers:
            - name: nginx
            image: nginx
            ports:
            - containerPort: 3000
            env:
            - name: SECRET_USERNAME
                valueFrom:
                  secretKeyRef:
                    name: demo-secret-from-yaml
                    key: username
            - name: SECRET_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: demo-secret-from-yaml
                    key: password

建立pod,並檢查是否收到environment?

    [root@master ~]# kubectl apply -f my-pod.yaml
    pod/my-pod created
    [root@master ~]# kubectl get pods
    NAME     READY   STATUS    RESTARTS   AGE
    my-pod   1/1     Running   0          47s
    [root@master ~]# kubectl exec -it my-pod -- /bin/bash
    root@my-pod:/app#
    root@my-pod:/app# env | grepSECRET
    SECRET_USERNAME=root 
    SECRET_PASSWORD=pass1234
    root@my-pod:/app# exit
    exit

您可在下列課程中了解更多技巧喔!