目录
一、Secret配置管理介绍
二、创建一个Secret
2.1 从文件创建
2.2 编写一个Secret对象
三、将Secret挂载到volume中
四、向指定路径映射Secret
五、将Secret设置为环境变量
六、创建私有仓库的认证
一、Secret配置管理介绍
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。 敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
Pod 可以用两种方式使用 secret:
• 作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里;
• 当 kubelet 为 pod 拉取镜像时使用。
Secret的类型:
•Service Account:Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改 pod 以使用此类型的 secret。对应的 secret 会自动挂载到Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中
•Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据, 因此安全性弱。
•kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
对于每一个namespace的sa都有一个默认的default用来使得pod连接apiserver;每个namespace下有一个名为default的默认的ServiceAccount对象;
ServiceAccount里有一个名为Tokens的可以作为Volume一样被Mount到Pod里的Secret,当Pod启动时这个Secret会被自动Mount到Pod的指定目录下,用来协助完成Pod中的进程访问API Server时的身份鉴权过程。
二、创建一个Secret
2.1 从文件创建
##创建用户和密码的文件[root@server1 secret]# echo -n 'admin' > ./username.txt[root@server1 secret]# echo -n 'password' > ./password.txt[root@server1 secret]# ls -a. .. password.txt username.txt###通过文件创建[root@server1 secret]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txtsecret/db-user-pass created##查看秘密内容[root@server1 secret]# kubectl get secrets NAME TYPE DATA AGEdb-user-passOpaque 218sdefault-token-drfsm kubernetes.io/service-account-token 336d##含有特殊字符时的创建[root@server1 secret]# kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\!B\\*d\$zDsbsecret/dev-db-secret created##创建过程中使用BSAER64对内容进行一定的转义[root@server1 secret]# echo 'admin' | base64YWRtaW4K[root@server1 secret]# echo 'password' | base64cGFzc3dvcmQK##secret查看[root@server1 secret]# kubectl get secret db-user-pass -o yaml
默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容,可以 通过以下方式查看:
2.2 编写一个Secret对象
##创建secret的对象文件[root@server1 secret]# vim secret.yml[root@server1 secret]# cat secret.yml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: cmVkaGF0##文件应用并查看创建结果[root@server1 secret]# kubectl apply -f secret.yml secret/mysecret created[root@server1 secret]# kubectl get secret
三、将Secret挂载到volume中
##编写pod文件[root@server1 secret]# vim sa-volume.ymladmin[root@server1 secret]# cat sa-volume.yml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: cmVkaGF0---apiVersion: v1 kind: Pod metadata: name: mysecret spec: containers: - name: nginx image: nginx volumeMounts: - name: secretsmountPath: "/secret"readOnly: true volumes: ##挂载的内容- name: secrets secret:secretName: mysecret##查看当前pod[root@server1 secret]# kubectl get allNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 36d##文件应用[root@server1 secret]# kubectl apply -f sa-volume.yml secret/mysecret unchangedpod/mysecret created##查看创建的secret[root@server1 secret]# kubectl get secretNAME TYPE DATA AGEdb-user-passOpaque 227mdefault-token-drfsm kubernetes.io/service-account-token 336ddev-db-secret Opaque 225mmysecret Opaque 28m16s##查看配置文件中的内容[root@server1 secret]# kubectl exec mysecret -- ls /secretpasswordusername[root@server1 secret]# kubectl exec mysecret -- cat /secret/passwordredhat[root@server1 secret]# kubectl exec mysecret -- cat /secret/username
四、向指定路径映射Secret
##编写映射文件[root@server1 secret]# vim sa-morror.yml[root@server1 secret]# cat sa-morror.yml apiVersion: v1kind: Secretmetadata:name: mysecrettype: Opaquedata:username: YWRtaW4=password: cmVkaGF0---apiVersion: v1kind: Podmetadata:name: sa-nginx spec:containers:- name: sa-nginximage: nginxvolumeMounts:- name: secretsmountPath: "/secret" ##映射到该目录下readOnly: truevolumes:- name: secretssecret:secretName: mysecretitems:- key: username ##将mysecret中的username 映射到路径path下《主路径下》path: my-group/my-username##使文件生效[root@server1 secret]# kubectl apply -f sa-morror.yml secret/mysecret unchangedpod/sa-nginx created##查看创建的POD[root@server1 secret]# kubectl get pod NAME READY STATUS RESTARTS AGEmysecret 1/1Running 011msa-nginx 1/1Running 010s##查看映射路径中的文件[root@server1 secret]# kubectl exec sa-nginx -- ls /secret/my-groupmy-username[root@server1 secret]# kubectl exec sa-nginx -- cat /secret/my-group/my-usernameadmin
五、将Secret设置为环境变量
##编写配置文件[root@server1 secret]# vim sa-env.yml[root@server1 secret]# cat sa-env.yml apiVersion: v1kind: Secretmetadata:name: mysecrettype: Opaquedata:username: YWRtaW4=password: cmVkaGF0---apiVersion: v1kind: Podmetadata:name: secret-envspec:containers:- name: nginximage: nginxenv: ##设置环境变量- name: SECRET_USERNAME ##名字:keyvalueFrom: ##值的来源:valuesecretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: password[root@server1 secret]# kubectl apply -f sa-env.yml secret/mysecret unchangedpod/secret-env created[root@server1 secret]# kubectl exec secret-env -- env
六、创建私有仓库的认证
当个人私有仓库不公开时,若没有登陆,则此时无法进行镜像下载。使用kubernetes.io/dockerconfigjson 可以用于存储docker registry的认证信息。在镜像下载时进行认证。
##创建认证[root@server1 secret]# kubectl create secret docker-registry myregistrykey --docker-server= --docker-username=admin --docker-password=redhat --docker-email=root@[root@server1 secret]# kubectl get secret NAME TYPE DATA AGEmyregistrykey kubernetes.io/dockerconfigjson 110s[root@server1 secret]# vim sa-registry.yml[root@server1 secret]# cat sa-registry.ymlapiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: game2048image: yakexi007/game2048 imagePullSecrets: ##设置镜像拉取时所需的认证资源 - name: myregistrykey[root@server1 secret]# kubectl apply -f sa-registry.yml pod/mypod created