對一個公司來說安全也是最爲重要的因爲可能一旦出現安全問題可能這個公司就完了,所以對密碼管理是一個長久不變的話題,Kubernetes對密碼管理提供了Secret組件進行管理,最終映射成環境變量,文件等方式提供使用,統一進行了管理更換方便,並且開發人員並不需要關心密碼降低了密碼的受衆範圍從而保障了安全.
Kubernetes官方文檔:https://kubernetes.io/docs/reference/
Kubernetes官方Git地址:https://github.com/kubernetes/kubernetes
PS:本系列中使用 KubernetesV1.8 RancherV1.6.14
1. 初始化Secret
首先我們需要初始化一個Secret,使用Yaml文件創建時需要使用base64之後的內容作爲Value
$ echo -n "admin" | base64
YWRtaW4=
$ echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm
老規矩通過yaml的方式創建我們的Secret配置文件可以看到已經生效了
> vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
> kubectl create -f ./secret.yaml
secret "mysecret" created
> kubectl get secret
NAME TYPE DATA AGE
default-token-lnftf kubernetes.io/service-account-token 3 1d
mysecret Opaque 2 9s
2. 環境變量
我們在使用Secret第一個場景就是作爲容器的環境變量,大部分容器都提供使用環境變量配置密碼的功能,你的程序只需要讀取到這個環境變量使用這個環境變量的內容去鏈接到對應的服務就可以正常使用了,如下我們初始化一個Pod服務,使用之前預設好的信息作爲用戶名密碼配置進去
> vim secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
> kubectl create -f secret-env.yaml
3.文件(TLS證書)
除了配置成環境變量我們在很多地方也會使用到文件的方式來存放密鑰信息,最常用的就是HTTPS這樣的TLS證書,使用證書程序(比如Nginx沒法使用環境變量來配置證書)需要一個固定的物理地址去加載這個證書,我們吧之前配置用戶名和密碼作爲文件的方式掛在到某個目錄下
> vim secret-file.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-file-pod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
> kubectl create -f secret-file.yaml
如果有需要對同的配置分開掛載到不同的地方可以使用如下配置
apiVersion: v1
kind: Pod
metadata:
name: secret-file-pod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
- username存儲在/etc/foo/my-group/my-username文件而不是/etc/foo/username。
- password 不會掛載到磁盤
因爲映射成了文件那麼對權限也是可以控制的
volumes:
- name: foo
secret:
secretName: mysecret
defaultMode: 256
然後,祕密將被掛載,/etc/foo並且由祕密卷掛載創建的所有文件都將具有權限0400。
PS: JSON規範不支持八進制表示法,因此對於0400權限使用值256。如果您使用yaml代替pod的json,則可以使用八進制表示法以更自然的方式指定權限。
您也可以使用映射(如上例所示),併爲不同的文件指定不同的權限,如下所示:
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
mode: 511
在這種情況下,生成的文件/etc/foo/my-group/my-username將具有權限值0777。由於JSON限制,您必須以十進制表示法指定模式。
4.Docker私有倉庫認證
使用過K8s的小夥伴肯定會遇到一個問題,我們在使用自有的Docker倉庫的時候都需要先登錄用戶名和密碼,但是如果使用K8S怎麼配置密碼呢?在secret中有一個類型是docker-registry我們可以通過命令行的方式創建在獲取Docker鏡像時使用的用戶名和密碼
kubectl create secret docker-registry regsecret --docker-server=registry-vpc.cn-hangzhou.aliyuncs.com --docker-username=admin --docker-password=123456 [email protected]
如果使用編排文件是如下格式
kind: Secret
apiVersion: v1
metadata:
name: regsecret
type: kubernetes.io/dockercfg
data:
".dockercfg": eyJyZWdpc3RyeS12cGMuY24taGFuZ3pob3UuYWxpeXVuY3MuY29tIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEyMzQ1NiIsImVtYWlsIjoieHh4eEBxcS5jb20iLCJhdXRoIjoiWVdSdGFXNDZNVEl6TkRVMiJ9fQ==
# 反base64的結果 : {"registry-vpc.cn-hangzhou.aliyuncs.com":{"username":"admin","password":"123456","email":"[email protected]","auth":"YWRtaW46MTIzNDU2"}}
然後我們就可以在獲取指定鏡像的時候爲他指定一個獲取鏡像的Docker憑證
apiVersion: v1
kind: Pod
metadata:
name: secret-file-pod
spec:
containers:
- name: mypod
image: redis
imagePullSecrets: # 獲取鏡像需要的用戶名密碼
- name: regsecret