Secret介紹html
Secret存在的意義docker
Secret解決了密碼、token、密鑰等敏感數據的配置問題,而不須要把這些敏感數據暴露到鏡像或者Pod Spec中,能夠以Volume或者環境變量的方式使用json
Secret有三種類型vim
Service Account:用來訪問Kubernetes API,由Kubernetes自動建立,而且會自動掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中api
Opaque:base64編碼格式的Secret,用來存儲密碼、祕鑰等app
kubernetes.io/dockerconfigjson:用來存儲私有 docker registry的認證信息ui
Service Account編碼
只要與Kubernetes API有交互的Pod,都會自動擁有此種類型的Secret,例如kube-system名稱空間下的Pod加密
### 隨便進入kube-system下的Pod內查看是否有此類型 [root@Centos8 ~]# kubectl exec -it kube-proxy-76x2c -n kube-system -- /bin/sh # cd /run/secrets/kubernetes.io/serviceaccount # ls ca.crt namespace token ### 能夠看到,其中保存了crt、token等文件
Opaquespa
此種加密類型爲base64,其特色就是將明文改成了密文,可是解密也很是簡單,由於同一串字符串加密後的密文永遠是相同的
## 加密 [root@Centos8 ~]# echo -n admin | base64 YWRtaW4= [root@Centos8 ~]# echo -n vfan123 | base64 dmZhbjEyMw== ## 解密 [root@Centos8 ~]# echo -n dmZhbjEyMw== | base64 -d vfan123 [root@Centos8 ~]# echo -n YWRtaW4= | base64 -d admin
建立一個Opaque類型的Secret
vim secrets.yaml ... apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: password: dmZhbjEyMw== username: YWRtaW4= ... kubectl create -f secrets.yaml
將此secret掛載到Pod中
[root@Centos8 secret]# vim s-volume.yaml ... apiVersion: v1 kind: Pod metadata: name: s-volume labels: type: opaque spec: volumes: - name: secrets secret: secretName: mysecret containers: - name: db image: hub.vfancloud.com/test/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: - name: secrets mountPath: /etc/secrets readOnly: true ... [root@Centos8 secret]# kubectl create -f secrets.yaml secret/mysecret created ## 進入container [root@Centos8 secret]# kubectl exec -it s-volume -- /bin/sh /etc/secrets # ls password username /etc/secrets # cat password vfan123 /etc/secrets # cat username admin ### secret加密後的用戶名和密碼,傳輸到container中已經是明文
將此secret定義到Pod的環境變量中
vim s-env.yaml ... apiVersion: v1 kind: Pod metadata: name: s-env labels: type: opaque spec: containers: - name: pod-1 image: hub.vfancloud.com/test/myapp:v1 imagePullPolicy: IfNotPresent ports: - containerPort: 80 env: - name: DB_USER valueFrom: secretKeyRef: name: mysecret key: username - name: DB_PASSWD valueFrom: secretKeyRef: name: mysecret key: password ... kubectl create -f s-env.yaml ## 查看環境變量 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=s-env TERM=xterm DB_USER=admin DB_PASSWD=vfan123
kubernetes.io/dockerconfigjson
保存docker倉庫認證信息
打開咱們以前搭建的Harbor鏡像倉庫,設置一個私有倉庫(若無搭建私有倉庫能夠參考本人其餘隨筆:http://www.javashuo.com/article/p-gkarkjqc-mv.html)
建立Pod,使Pod導入私有倉庫的鏡像文件hub.vfancloud.com/test/myapp:v2
vim s-configjson.yaml ... apiVersion: v1 kind: Pod metadata: name: s-configjson spec: containers: - name: configjson image: hub.vfancloud.com/test/myapp:v2 ... [root@Centos8 secret]# kubectl create -f s-configjson.yaml pod/s-configjson created ### 鏡像導入失敗,是由於私有倉庫中的鏡像必須登陸後纔可導入 [root@Centos8 secret]# kubectl get pod NAME READY STATUS RESTARTS AGE s-configjson 0/1 ErrImagePull 0 22s ### 詳細信息中的報錯信息 Failed to pull image "hub.vfancloud.com/test/myapp:v2": rpc error: code = Unknown desc = Error response from daemon: pull access denied for hub.vfancloud.com/test/myapp, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
設置dockerconfigjson類型secret
## 建立secret [root@Centos8 secret]# kubectl create secret docker-registry myregistrykey --docker-server=hub.vfancloud.com --docker-username=admin --docker-password=Harbor12345 --docker-email=vfan8991 secret/myregistrykey created ## 在資源清單中添加配置 [root@Centos8 secret]# vim s-configjson.yaml ... apiVersion: v1 kind: Pod metadata: name: s-configjson spec: containers: - name: configjson image: hub.vfancloud.com/test/myapp:v2 imagePullSecrets: - name: myregistrykey ... [root@Centos8 secret]# kubectl create -f s-configjson.yaml pod/s-configjson created ## 查看,導入成功 [root@Centos8 secret]# kubectl get pod NAME READY STATUS RESTARTS AGE s-configjson 1/1 Running 0 5s