kubernetes系列(十二) - 儲存之Secret

寶樹吶發表於2020-07-07

1. Secret簡介

Secret解決了密碼、token、金鑰等敏感資料的配置問題,而不需要把這些敏感資料暴露到映象或者Pod Spec 中。

Secret 可以以以下兩種方式使用:

  • volume掛載
  • 環境變數

2. Secret型別

Secret有四種型別:

注:一些教程說只有三種,經過筆者kubectl create secret --help檢視,且回顧之前ingress七層代理的知識點,發現其他教程都漏了一種secret是tsl

  1. Service Account

用來訪問Kubernetes API,由Kubernetes 自動建立,並且會自動掛載到Pod的 /run/secrets/kubernetes.io/serviceaccount 目錄中

  1. Opaque

base64編碼格式的Secret,用來儲存密碼、金鑰等.

  1. kubernetes.io/dockerconfigjson

用來儲存私有docker registry的認證資訊

  1. kubernetes.io/tls

用來儲存tsl證書。一般是用來配合ingress實現https證書的配置,具體見ingress那章

3. Service Account

  • 用來訪問Kubernetes API Service,由Kubernetes 自動建立,並且會自動掛載到Pod的 /run/secrets/kubernetes.io/serviceaccount目錄中
  • 即不是所有的pod都有權訪問api service,不然會給api service造成很大的壓力。
  • service account不需要我們自己管理!

示例

如下,因為kube-proxy肯定會跟api-servie互動,所以檢視他的service account


4. Opaque

4.1 Opaque型別說明

Opaque型別的資料是一個 map型別,要求value是base64編碼格式

示例

  • 如下是base64編碼和解碼的:

4.2 Opaque建立方式

4.2.1 命令列建立

  1. 使用字面值建立
  • 通過命令列建立不用將value指定為base64,但是yaml 形式必須指定,不然建立會失敗!
kubectl create secret generic my-sec --from-literal=key1=value1

如下,型別為Opaque:

  1. 使用檔案或者資料夾建立

跟configmap一樣,都是使用--from-file

kubectl create secret generic my-sec --from-file=/一個資料夾或者一個檔案

4.2.2 yaml資源清單建立

apiVersion: v1 
kind: Secret 
metadata:
  name: mysecret 
type: Opaque 
data:
  password: MWYyZDF1MmU2N2Rm 
  username: YWRtaW4=

4.3 Opaque使用方式

4.3.1 將Secret掛載到Volume

  • 使用方式跟configMap差不多
apiVersion: v1 
kind: Pod 
metadata:
  labels:
    name: seret-test 
  name: seret-test 
spec:
  # volume中匯入secret
  volumes:
  - name: secrets 
    secret:
      secretName: mysecret 
  containers:
  - image: lzw5399/tocgenerator
    name: db 
    # mounts中使用volume中的secret
    volumeMounts:
    - name: secrets 
      mountPath: "/etc/secrets"
      readOnly: true

4.3.2 將Secret匯出到環境變數中

  • 使用方式跟configMap差不多
apiVersion: extensions/v1beta1 
kind: Deployment 
metadata:
  name: pod-deployment 
spec:
  replicas: 2 
  template:
    metadata:
      labels:
        app: pod-deployment 
    spec:
      containers:
      - name: pod-1 
        image: lzw5399/tocgenerator
        ports:
        - containerPort: 80 
        # 將secret的值賦給環境變數
        env:
        - name: TEST_USER 
          valueFrom:
            secretKeyRef:
              name: mysecret 
              key: username 
        - name: TEST_PASSWORD 
          valueFrom:
            secretKeyRef:
              name: mysecret 
              key: password

5. Dockerconfigjson

用來儲存私有docker registry的認證資訊

5.1 建立docker-registry型別的secret

kubectl create secret docker-registry myregistrykey --docker-server=hub.codepie.fun --docker-username=baoshu --docker-password=yourpwd --docker-email=baoshu@test.com

如下可以看到,建立出來的型別是kubernetes.io/dockerconfigjson

5.2 yaml中使用dockerconfigjson

apiVersion: v1 
kind: Pod 
metadata:
  name: foo 
spec:
  containers:
    - name: foo 
      image: lzw5399/tocgenerator
  # 引用建立出來的dockerconfigjson
  imagePullSecrets:
    - name: myregistrykey

6. Tsl

用來儲存tsl證書。一般是用來配合ingress實現https證書的配置,可以參見ingress那篇

6.1 建立tsl

6.1.1 直接指定檔案建立

kubectl create secret tls toc-secret --key tls.key --cert tls.crt

6.1.2 以yaml資源清單方式建立

apiVersion: v1
kind: Secret
metadata:
  name: mywebsite-secret
data:
  tls.crt: **************************
  tls.key: **************************

6.2. 使用tsl secret

  • 這裡演示的是配置ingress,實現https域名訪問
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tocgenerator-ingress
spec:
  tls:
    - hosts:
      - toc.codepie.fun
      # 使用tsl
      secretName: toc-secret
  rules:
    - host: toc.codepie.fun
      http:
        paths:
          - path: /
            backend:
              serviceName: tocgenerator-svc
              servicePort: 80

相關文章