1. Secret存在的意义:
-
Secret解决了密码、token、密钥等敏感数据配置的问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用
-
Secret有三种类型:
- Service Account:用来访问k8s API,由K8S自动创建,并且会自动挂在pod的
/run/secret/kubernetes.io/serviceaccount
目录中。 - Opaque:base64编码格式的Secret,用来存储密码、密钥等
- kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
- Service Account:用来访问k8s API,由K8S自动创建,并且会自动挂在pod的
2. Service Account
//创建一个pod
[root@master1 configmap]# kubectl run nginx --image nginx:latest
//查看是否创建成功:
[root@master1 configmap]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 2m15s
nginx-deployment-75dfc89886-8sbxf 1/1 Running 0 61m
nginx-deployment-75dfc89886-r4bvn 1/1 Running 0 61m
nginx-deployment-75dfc89886-t2664 1/1 Running 0 61m
//查看是否挂在到/run/secret/kubernetes.io/serviceaccount
[root@master1 configmap]# kubectl exec nginx -it /bin/bash
root@nginx:/# cd /run/secrets/kubernetes.io/serviceaccount/
root@nginx:/run/secrets/kubernetes.io/serviceaccount# ls
ca.crt namespace token
3. Opaque Service
-
创建说明:
- Opaque类型的数据是一个map类型,要求value是base64编码格式:
[root@master1 ~]# echo -n "admin"|base64
YWRtaW4=
[root@master1 ~]# echo -n "12345678Qaz."|base64
MTIzNDU2NzhRYXou
3.1. 创建secret.yaml
vim secret.yaml
apiVersion: v1 #指定使用的Kubernetes API版本,这里是v1,表示使用的是核心v1版本的API
kind: Secret #指定要创建的资源类型,这里是Secret,表示创建一个Secret资源
metadata: #用于定义Secret的元数据,包括名称、标签和其他元数据信息
name: my-secret #指定Secret的名称,这里是my-secret
type: Opaque #指定Secret的类型是Opaque
data: #定义存储在Secret中的数据键值对,每个键值对表示一个密钥和对应的值
username: YWRtaW4= #定义一个名为username的密钥,值为YWRtaW4=。这是一个Base64编码的字符串
password: MTIzNDU2NzhRYXou #定义一个名为password的密钥,值为MTIzNDU2NzhRYXou
//创建
[root@master1 yaml]# kubectl apply -f secret.yaml
secret/my-secret created
[root@master1 yaml]# kubectl get secret
NAME TYPE DATA AGE
default-token-td6z6 kubernetes.io/service-account-token 3 2d6h
my-secret Opaque 2 23s
3.2. 使用方式:
3.2.1. 使用volume方法关联secret
vim pod-secret-volume.yaml
apiVersion: v1 #指定使用的Kubernetes API版本为v1
kind: Pod #定义要创建的资源类型为Pod
metadata: #包含有关Pod的元数据,例如名称
name: my-nginx #指定Pod的名称为"my-nginx"
spec: #定义了Pod的规范
containers: #定义了Pod中的容器列表
- name: my-nginx #指定容器的名称为"my-nginx"
image: nginx:latest #定义容器的镜像
volumeMounts: #定义了容器的挂载点列表
- name: secret-volume #指定挂载点的名称为"secret-volume"
mountPath: /etc/my-secret #指定要将Secret挂载到容器中的路径为"/etc/my-secret"
volumes: #定义了Pod的卷列表
- name: secret-volume #指定卷的名称为"secret-volume"
secret: #指定要使用的Secret
secretName: my-secret # 指定要使用的Secret的名称为"my-secret"
[root@master1 yaml]# kubectl apply -f pod-secret-volume.yaml
[root@master1 yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx 1/1 Running 0 2m33s
nginx 1/1 Running 0 4h2m
nginx-deployment-75dfc89886-8sbxf 1/1 Running 0 5h1m
nginx-deployment-75dfc89886-r4bvn 1/1 Running 0 5h1m
nginx-deployment-75dfc89886-t2664 1/1 Running 0 5h1m
[root@master1 yaml]# kubectl exec my-nginx -it /bin/bash
root@my-nginx:/# cd /etc/my-secret/
root@my-nginx:/etc/my-secret# ls
password username
3.2.2. 使用env方法关联secret
[root@master1 yaml]# vim pod-secret-env.yaml
apiVersion: v1 #定义了Kubernetes API的版本,这里使用的是v1版本
kind: Pod #定义要创建的资源类型为Pod
metadata: #包含有关Pod的元数据,例如名称
name: my-pod ##指定Pod的名称为"my-pod"
spec: #定义Pod的规格信息
containers: #定义了Pod中的容器列表
- name: nginx-container #定义容器名称
image: nginx:latest #定义容器镜像
env: #定义了容器的环境变量列表
- name: SECRET_USERNAME # 定义了环境变量的名称
valueFrom: #定义了环境变量的值来源
secretKeyRef: #指定了值来自一个Secret,并指定了Secret的名称和键
name: my-secret #定义了Secret的名称,这里是"my-secret"
key: username #定义了Secret中的键为username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
//创建:
[root@master1 yaml]# kubectl apply -f pod-secret-env.yaml
pod/my-pod created
[root@master1 yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx 1/1 Running 0 16m
my-pod 1/1 Running 0 4s
nginx 1/1 Running 0 4h16m
nginx-deployment-75dfc89886-8sbxf 1/1 Running 0 5h16m
nginx-deployment-75dfc89886-r4bvn 1/1 Running 0 5h16m
nginx-deployment-75dfc89886-t2664 1/1 Running 0 5h16
//验证:
[root@master1 yaml]# kubectl exec my-pod -it /bin/bash
root@my-pod:/# echo $SECRET_USERNAME
admin
root@my-pod:/# echo $SECRET_PASSWORD
12345678Qaz.