天天看點

10、kubernetes 核心技術-Secret、ConfigMap一、Secret二、ConfigMap

文章目錄

  • 一、Secret
    • 1.1 變量形式挂載到Pod
    • 1.2 資料卷形式挂載
  • 二、ConfigMap
    • 2.1 建立配置檔案
    • 2.2 建立ConfigMap
    • 2.3 Volume資料卷形式挂載
    • 2.4 以變量的形式挂載Pod

一、Secret

Secret的主要作用就是加密資料,然後存在etcd裡面,讓Pod容器以挂載Volume方式進行通路

Secret 解決了密碼、token、密鑰等敏感資料的配置問題,而不需要把這些敏感資料暴露 到鏡像或者 Pod Spec 中。Secret 可以以 Volume 或者環境變量的方式使用

場景:使用者名 和 密碼進行加密

一般場景的是對某個字元串進行base64編碼 進行加密

[[email protected] ~]$ echo -n 'admin' | base64
YWRtaW4=
           

Secret 有三種類型

  • Service Account :用來通路 Kubernetes API,由 Kubernetes 自動建立,并且會自動挂 載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中
  • Opaque : base64 編碼格式的 Secret,用來存儲密碼、密鑰等
  • kubernetes.io/dockerconfigjson :用來存儲私有 docker registry 的認證資訊

1.1 變量形式挂載到Pod

建立secret加密資料的yaml檔案 secret.yaml

[[email protected] ~]$ cat > secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
EOF
           

建立一個pod

[[email protected] ~]$ kubectl create -f secret.yaml


[[email protected] ~]$ kubectl get pods

[[email protected] ~]$ kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-wqhjb   kubernetes.io/service-account-token   3      27h
mysecret              Opaque                                2      7m36s
           

建立一個 secret-val.yaml 檔案

[[email protected] ~]$ cat > secret-val.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:   #挂載目錄
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:   #名稱
            name: mysecret
            key: password
EOF
[[email protected] ~]$ kubectl apply -f secret-val.yaml
NAME                     READY   STATUS      RESTARTS   AGE
ds-test-ljb52            1/1     Running     0          85m
mypod                    1/1     Running     0          15s

           

進入到容器内部

[[email protected] ~]$ kubectl exec -it mypod bash
           

然後就可以輸出值,這就是以變量的形式挂載到容器中

# 輸出使用者
[email protected]:/# echo $SECRET_USERNAME
admin

# 輸出密碼
[email protected]:/# echo $SECRET_PASSWORD
1f2d1e2e67df

           

要删除這個Pod,就可以使用這個指令

[[email protected] ~]$ kubectl delete -f secret-val.yaml
           

1.2 資料卷形式挂載

建立一個 secret-vol.yaml 檔案

[[email protected] ~]$ cat > secret-vol.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:   #挂載
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
EOF
           

建立Pod

# 根據配置建立容器
[[email protected] ~]$ kubectl apply -f secret-vol.yaml

# 進入容器
[[email protected] ~]$ kubectl exec -it mypod bash

# 檢視
[email protected]:/# ls /etc/foo
password  username

           

二、ConfigMap

ConfigMap作用是存儲不加密的資料到etcd中,讓Pod以變量或資料卷Volume挂載到容器中

應用場景:配置檔案

2.1 建立配置檔案

建立一個配置檔案 redis.properties

[[email protected] ~]$ kubectl delete Pod --all

[[email protected] ~]$ cat > redis.properties << EOF
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
EOF
           

2.2 建立ConfigMap

[[email protected] ~]$ kubectl create configmap redis-config --from-file=redis.properties
           

檢視詳細資訊

[[email protected] ~]$ kubectl get cm
NAME           DATA   AGE
redis-config   1      7m8s

[[email protected] ~]$ kubectl describe cm redis-config
Name:         redis-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
redis.properties:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

Events:  <none>

           

2.3 Volume資料卷形式挂載

建立一個 cm.yaml

[[email protected] ~]$ cat > cm.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never
EOF
           

使用該yaml建立pod

# 建立
[[email protected] ~]$ kubectl apply -f cm.yaml

# 檢視
[[email protected] ~]$ kubectl get pods
NAME    READY   STATUS      RESTARTS   AGE
mypod   0/1     Completed   0          6m42s
           

最後通過指令就可以檢視結果輸出了

[[email protected] ~]$ kubectl logs mypod
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
           

2.4 以變量的形式挂載Pod

建立一個myconfig.yaml檔案,聲明變量資訊,然後以configmap建立

[[email protected] ~]$ cat > myconfig.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello
EOF
           

建立配置檔案

# 建立pod
[[email protected] ~]$ kubectl apply -f myconfig.yaml

# 擷取
[[email protected] ~]$ kubectl get cm
           

建立完該pod後,我們就需要在建立一個 config-var.yaml 來使用我們的配置資訊

[[email protected] ~]$ cat > config-var.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox  #容器
      image: busybox
      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]  #輸出資訊
      env:
        - name: LEVEL
          valueFrom:
            configMapKeyRef:
              name: myconfig   #挂載
              key: special.level
        - name: TYPE
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never
EOF
           

檢視輸出

[[email protected] ~]$ kubectl logs mypod