secret
k8s secret
secret 存放一些敏感数据,但是不想被别人知道具体内容,如:密码,token,密钥等敏感信息;
把POD想要访问的数据加密后存储在etcd中,然后可以通过Pod的容器挂载volume的方式或者环境变量等方式访问secret里的信息;
secret 有些像ConfigMap,但是内容是加密的;
常用类型
opaque: 用户定义的任意数据,在不指定的情况为此类型; 弱安全性,base64 加密,可以进行解密获得原始数据;
kubernetes.io/service-account-token: 服务账号令牌
kubernetes.io/dockercfg:~/.dockercfg文件的序列化形式
kubernetes.io/dockerconfigjson:~/.docker/config.json文件的序列化形式
kubernetes.io/tls:用户TLS客户端或服务端的数据
kubernetes.io/basic-auth: 用于基本的身份验证
kubernetes.io/ssh-auth:用于ssh身份验证凭据
使用
通过文件创建secret
如:username 与password 存储用户名与密码的两个文件;
echo "admin" > username # 用户名不进行加密,做对比 echo "123456" | base64 > password
上面两条命令将用户名admin存放到文件username中
密码123456进行base64编码后存储到文件password中;
通过文件创建secret:
kuser@control195:~/learn/secret$ kubectl create secret generic -n test test-from-file --from-file=username --from-file=password -o yaml --dry-run=client
或者通过下面的yaml 文件来创建;
apiVersion: v1 data: password: TVRJME5UWUsK username: YWRtaW4K # 从生成的文件来看,即使不在指定的文件中(--from-file加密),在创建的时候也会进行加密; kind: Secret metadata: creationTimestamp: null name: test-from-file namespace: test
查看创建secret 后的情况:
kuser@control195:~/learn/secret$ kubectl describe secret -n test test-secret
kuser@control195:~/learn/secret$ kubectl describe secret -n test test-secret Name: test-secret Namespace: test Labels: <none> Annotations: <none> Type: Opaque Data ==== username: 8 bytes password: 6 bytes
通过yaml 描述文件创建secret:
apiVersion: v1 data: password_file: MTIzNDU2Cg== # 这里的加密信息需要手工进行计算:echo "123456" | base64 username_file: YWRtaW4K # 这里的加密信息需要手工进行计算:echo "admin" | base64 kind: Secret metadata: name: test-secret namespace: test
这里的描述文件与通过文件创建secret 生成的描述文件基本完全一致,所以.....
然后创建即可,kubectl apply -f secret-from-files.yaml
查看结果与上面的通过文件创建完全一致;
secret 使用
通过volume 挂载进行使用
1、创建一个测试的POD
由于直接写yaml 可能比较困难,所以有我们生成一个临时的,而后再进行编辑;
kuser@control195:~/learn/secret$ kubectl run --image=busybox -o yaml --dry-run=client testpod -- sleep "36000" > testpod.yaml
这样就创建出了一个testpod 的POD;
而后我们再对文件进行修改,如:修改namespace、添加volume 信息;
apiVersion: v1 kind: Pod metadata: labels: run: pod name: pod namespace: test spec: containers: - image: busybox name: pod command: - sleep - "36000" imagePullPolicy: IfNotPresent volumeMounts: # 这里volume 的挂载信息 - name: volume1 mountPath: /tmp/1 # 挂载点 readOnly: true volumes: - name: volume1 secret: secretName: test-from-file # 将secret 名称为test-from-file 的secret 挂载进来,不写后面items的情况,会将test-from-file中secret的所有key都挂载进来; items: # 指定将test-from-file 的username 与passwod 分别挂载到不同的文件 - key: username path: u/usermame - key: password path: p/password dnsPolicy: ClusterFirst restartPolicy: Always
上面的volume 下的secret 信息中,volumes中的secret,secretName 是引入的secret 的标识,当然此secret 需要与POD在相同的namespace下;
secret 名称为test-from-file 将被加载进来,如果 test-from-file 不存在的情况,那么也不会出现错误,我们需要创建即可;
加载secret的方式:
1、加载所有
指定好secretName后,后面不需要写items即可;
2、加载指定secret 的股固定选项(key)
指定好secretName后,后面需要添加items,items下面再添加需要添加进来的Key,如:
secretName: test-from-file items: - key: username path: u/username - key: password path: p/password
上面这就是加载了usrename 与password 的key,并且指定了挂载的路径;
如:volumeMounts中指定的volume 的path,那么会将这里的path 再加载到mount 的下面,如上面的例子中,最终结果为:
/tmp/1/u/username # 这里存放了username的内容 /tmp/1/p/password #这里存放了password 的内容
修改上面的描述文件,添加volume相关
kuser@control195:~/learn/secret$ kubectl apply -f testpod.yaml
pod/pod created
查看创建的POD的挂载情况,
kubectl describe pod -n test pod Mounts: /tmp/1 from volume1 (ro) /var/run/secrets/kubernetes.io/serviceaccount from default-token-ggksm (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: volume1: Type: Secret (a volume populated by a Secret) SecretName: test-from-file Optional: false default-token-ggksm: Type: Secret (a volume populated by a Secret) SecretName: default-token-ggksm
可以查看到Mounts 下已经有新的挂载记录,而在Volumes 信息中,也能看到volume1 中SecretName为test-from-file 已经挂载;
此时进入POD内部,查看具体信息:
kuser@control195:~/learn/secret$ kubectl exec pod -n test pod -- ls -l /tmp/1/ total 0 lrwxrwxrwx 1 root root 8 Jun 19 07:51 p -> ..data/p lrwxrwxrwx 1 root root 8 Jun 19 07:51 u -> ..data/u 再次查看挂载后的文件具体内容: kuser@control195:~/learn/secret$ kubectl exec pod -n test pod -- cat /tmp/1/u/usermame admin kuser@control195:~/learn/secret$ kubectl exec pod -n test pod -- cat /tmp/1/p/password MTIzNDU2Cg==
2、在环境变量中使用
1、创建secret
参照前面创建即可;
2、创建POD
apiVersion: v1 kind: Pod metadata: labels: run: pod2 name: pod2 namespace: test spec: containers: - command: - sleep - "3600" image: busybox name: pod2 env: - name: SEC_USERNAME valueFrom: secretKeyRef: name: secret-from-file key: username - name: SEC_PASSWORD valueFrom: secretKeyRef: key: password name: secret-from-file resources: {} imagePullPolicy: IfNotPresent dnsPolicy: ClusterFirst restartPolicy: Always status: {}
上面这种写法是指定加载secret 中的某些变量;
3、查看POD的信息中关于设置的环境变量中引用:
kuser@control195:~/learn/secret$ kubectl describe pod -n test pod2 | grep -i env -A 4 Environment: SEC_USERNAME: <set to the key 'username' in secret 'secret-from-file'> Optional: false SEC_PASSWORD: <set to the key 'password' in secret 'secret-from-file'> Optional: false Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-ggksm (ro)
4、在POD内部查看是否真正的读取到信息;
kuser@control195:~/learn/secret$ kubectl exec pod2 -n test -- printenv | grep -i env kuser@control195:~/learn/secret$ kubectl exec pod2 -n test -- printenv | grep -i sec SEC_USERNAME=YWRtaW4K SEC_PASSWORD=MTIzNDU2Cg==
5、加载secret 中的全部变量
apiVersion: v1 kind: Pod metadata: labels: run: pod3 name: pod3 namespace: test spec: containers: - command: - sleep - "3600" image: busybox name: pod2 envFrom: - secretRef: name: secret-from-file resources: {} imagePullPolicy: IfNotPresent dnsPolicy: ClusterFirst restartPolicy: Always status: {}
在容器内查看环境变量是否已经加载成功;
kuser@control195:~/learn/secret$ kubectl exec pod3 -n test -- printenv |egrep -i 'us|pass' PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin password=MTIzNDU2Cg== username=YWRtaW4K
6、更新secret 内容
设置生效后,查看更新后的secret与pod 中的环境变量
新增加一个环境变量port
kuser@control195:~/learn/secret$ kubectl exec -n test podenv -- printenv | grep SEC
SEC_PORT=MjMK
SEC_USR=admin
SEC_PASS=MTIzNDU2Cg==
kuser@control195:~/learn/secret$ echo "24"| base64 >port
kuser@control195:~/learn/secret$ kubectl apply -f secret-from-files.yaml
secret/test-from-file configured
kuser@control195:~/learn/secret$ kubectl exec -n test podenv -- printenv | grep SEC
SEC_PORT=MjMK
SEC_USR=admin
SEC_PASS=MTIzNDU2Cg==
发现POD并没有进行实时更新,对于已经引用了该secret的容器来说,并不会主动更新ENV,除非重启该POD;