1. Secret簡介
Secret
解決了密碼、token、金鑰等敏感資料的配置問題,而不需要把這些敏感資料暴露到映象或者Pod Spec
中。
Secret
可以以以下兩種方式使用:
volume
掛載- 環境變數
2. Secret型別
Secret有四種型別:
注:一些教程說只有三種,經過筆者kubectl create secret --help
檢視,且回顧之前ingress
七層代理的知識點,發現其他教程都漏了一種secret是tsl
Service Account
用來訪問Kubernetes API,由Kubernetes 自動建立,並且會自動掛載到Pod的 /run/secrets/kubernetes.io/serviceaccount 目錄中
Opaque
base64編碼
格式的Secret,用來儲存密碼、金鑰等.
kubernetes.io/dockerconfigjson
用來儲存私有
docker registry
的認證資訊
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 命令列建立
- 使用字面值建立
- 通過命令列建立不用將value指定為
base64
,但是yaml
形式必須指定,不然建立會失敗!
kubectl create secret generic my-sec --from-literal=key1=value1
如下,型別為Opaque
:
- 使用檔案或者資料夾建立
跟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