1. 程式人生 > >kubernetes系列(十二) - 儲存之Secret

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

- [1. Secret簡介](#head1) - [2. Secret型別](#head2) - [3. Service Account](#head3) - [4. Opaque](#head4) - [4.1 Opaque型別說明](#head5) - [4.2 Opaque建立方式](#head6) - [4.2.1 命令列建立](#head7) - [4.2.2 yaml資源清單建立](#head8) - [4.3 Opaque使用方式](#head9) - [4.3.1 將Secret掛載到Volume](#head10) - [4.3.2 將Secret匯出到環境變數中](#head11) - [5. Dockerconfigjson](#head12) - [5.1 建立docker-registry型別的secret](#head13) - [5.2 yaml中使用dockerconfigjson](#head14) - [6. Tsl](#head15) - [6.1 建立tsl](#head16) - [6.1.1 直接指定檔案建立](#head17) - [6.1.2 以yaml資源清單方式建立](#head18) - [6.2. 使用tsl secret](#head19) ## 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 目錄中 2. `Opaque` > `base64編碼`格式的Secret,用來儲存密碼、金鑰等. 3. `kubernetes.io/dockerconfigjson` > 用來儲存私有`docker registry`的認證資訊 4. `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` ![](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggiq5nfb61j30kc08iab4.jpg) ---- ## 4. Opaque ### 4.1 Opaque型別說明 Opaque型別的資料是一個 map型別,要求value是base64編碼格式 **示例** - 如下是base64編碼和解碼的: ![](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggir5kvtybj30c701uaa6.jpg) ### 4.2 Opaque建立方式 #### 4.2.1 命令列建立 1. **使用字面值建立** - 通過命令列建立不用將value指定為`base64`,但是`yaml` 形式必須指定,不然建立會失敗! ```shell kubectl create secret generic my-sec --from-literal=key1=value1 ``` 如下,型別為`Opaque`: ![](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggir8zc9b2j30fn01vglp.jpg) 2. **使用檔案或者資料夾建立** > 跟configmap一樣,都是使用`--from-file` ```shell kubectl create secret generic my-sec --from-file=/一個資料夾或者一個檔案 ``` #### 4.2.2 yaml資源清單建立 ```yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: password: MWYyZDF1MmU2N2Rm username: YWRtaW4= ``` ### 4.3 Opaque使用方式 #### 4.3.1 將Secret掛載到Volume - 使用方式跟`configMap`差不多 ```yaml 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`差不多 ```yaml 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 ```shell kubectl create secret docker-registry myregistrykey --docker-server=hub.codepie.fun --docker-username=baoshu --docker-password=yourpwd [email protected] ``` 如下可以看到,創建出來的型別是`kubernetes.io/dockerconfigjson` ![](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggirywbxfbj30vx04174x.jpg) ### 5.2 yaml中使用dockerconfigjson ```yaml 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 直接指定檔案建立 ```yaml kubectl create secret tls toc-secret --key tls.key --cert tls.crt ``` ![](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggis48n1zpj30fd02u0sz.jpg) #### 6.1.2 以yaml資源清單方式建立 ```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: