Secret用来保存敏感信息,例如密码、令牌和SSH Key,将这些信息放在Secret中比较安全和灵活。
1. 创建Secret
1. 使用kubectl命令行创建
# echo -n "admim" > ./username.txt
# echo -n "123456" > ./password.txt
# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
# kubectl get secret db-user-pass
NAME TYPE DATA AGE
db-user-pass Opaque 2 32s
# kubectl get secret db-user-pass -oyaml
apiVersion: v1
data:
password.txt: MTIzNDU2
username.txt: YWRtaW0=
kind: Secret
metadata:
name: db-user-pass
type: Opaque
# kubectl describe secret db-user-pass
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 6 bytes
username.txt: 5 bytes
默认情况下,get和describe命令都不会显示文件内容,这是为了防止Secret中的内容被意外暴露。
2. 通过yaml文件创建
手动创建Secret时,每一项内容必须是base64编码的。
# echo -n "admin" | base64
YWRtaW4=
# echo -n "123456" | base64
MTIzNDU2
# cat db-user-pass-sceret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MTIzNDU2
# kubectl create -f db-user-pass-sceret.yaml
secret/mysecret created
# kubectl get secret mysecret -oyaml
apiVersion: v1
data:
password: MTIzNDU2
username: YWRtaW4=
kind: Secret
metadata:
name: mysecret
namespace: default
type: Opaque
# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 6 bytes
username: 5 bytes
对于base64的解码,可以使用如下命令:
# echo "YWRtaW4=" | base64 --decode
admin
2. Secret实践
Secret与ConfigMap使用方法类似,区别就是将ConfigMap换成Secret。
containers:
- volumeMounts:
- name: secret
mountPath: /etc/secret/mysecret # 这里是挂载文件路径,可以重命名文件
subPath: mysecret
volumes:
- name: secret
secret:
secretName: mysecret # secret名称
defaultMode: 420 # 设置权限
- env:
envFrom: # 注意envFrom的位置
- secretRef:
name: mysecret # Secret名称
- env:
- name: SPECIAL_LEVEL_KEY # 环境变量的名称
valueFrom: # 注意valueFrom的位置
secretKeyRef:
key: special.how # 需要引入的key
name: special-configmap # Secret名称
secret一般保存密钥等,key-value的形式,采用envFrom的形式较多。
3. 常用的Secret类型
通过命令行kubectl create secret generic创建的类型为Opaque。另外常见的类型有镜像仓库Secret和HTTPS证书的Secret。
1. Docker镜像仓库Secret
当部署应用所需镜像为私有仓库镜像时,需要认证后才能拉取,此时可以使用imagePullSecret字段包含Docker镜像注册密码的Secret,才可以拉取镜像。
kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
docker-registry:指定Secret的类型。
myregistrykey:Secret的名称。
docker-server:镜像仓库地址.
docker-username:镜像仓库用户名,需要有拉取镜像的权限。
docker-password:镜像仓库密码。
docker-email:邮箱信息,可以为空。
示例:
kubectl create secret docker-registry myregistrykey --docker-server=registry.cn-beijing.aliyuncs.com --docker-username=jiangStudy --docker-password=xxc113206
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-docker # Deployment的名称;
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1
imagePullPolicy: Always # 已经仓库设为私有,这里设置为Always
ports:
- containerPort: 80
imagePullSecrets: # 如果有多个,就写多行 -name
- name: myregistrykey
2. HTTPS证书类型的Secret
传统架构中,域名证书一般在集群的代理服务器上进行管理,比如nginx,在kubernetes中,一般服务都是通过Ingress发布,此时可以将域名证书保存在TLS类型的Secret上,之后Ingress即可绑定该证书。
一般证书会生成 .key 和 .crt 的文件,我们根据生成的 .key 和 .crt 文件创建Secret。
kubectl create secret tls nginx-test-tls --key=tls.key --cert=tls.crt
最后创建一个ingress将证书绑定到指定的域名上。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-https-test
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: https-test.com
http:
paths:
- backend:
serviceName: nginx-svc
servicePort: 80
tls:
- secretName: nginx-test-tls
一个ingress可以绑定多个TLS类型的Secret,同一个Secret也可以被多个ingress绑定。