🏆 Secret
secret
对象类型用来保存铭感信息、密码什么的,它是一种少量包含敏感信息的对象
注意:
kubernetes Secret
默认情况下存储为base64
编码的,非加密的字符串。默认情况下,能够访问API
的任何人、或者能够访问Kubernetes
下层数据存储(ETCD
)的任何人都可以以明文形式读取这些数据,为了安全要启动静态加密;启用或配RBAC
规则来限制对Secret
的读写操作。要注意、任何被允许创建Pod
的人都默认地具有读取Secret
的权限
🌟 Secret 概览
要使用 Secret,Pod 需要引用 Secret。 Pod 可以用三种方式之一来使用 Secret:
- 作为挂载到一个或多个容器上的 卷 中的文件。
- 作为容器的环境变量
- 由 kubelet 在为 Pod 拉取镜像时使用
Secret
对象的名称必须是合法的 DNS 子域名。 在为创建 Secret
编写配置文件时,你可以设置 data
与/或 stringData
字段。 data
和 stringData
字段都是可选的。data
字段中所有键值都必须是 base64 编码的字符串。如果不希望执行这种 base64
字符串的转换操作,你可以选择设置 stringData
字段,其中可以使用任何字符串作为其取值。
🌟 sercet的类型
在创建 Secret
对象时,你可以使用 Secret
资源的 type
字段,或者与其等价的 kubectl
命令行参(如果有的话)为其设置类型。 Secret
的类型用来帮助编写程序处理 Secret
数据。
内置类型 | 用法 |
---|---|
Opaque | 用户定义的任意数据 |
kubernetes.io/service-account-token | 服务账号令牌 |
kubernetes.io/dockercfg | ~/.dockercfg 文件的序列化形式 |
kubernetes.io/dockerconfigjson | ~/.docker/config.json 文件的序列化形式 |
kubernetes.io/basic-auth | 用于基本身份认证的凭据 |
kubernetes.io/ssh-auth | 用于 SSH 身份认证的凭据 |
kubernetes.io/tls | 用于 TLS 客户端或者服务器端的数据 |
bootstrap.kubernetes.io/token | 启动引导令牌数据 |
如果 type
字段为空则默认为 opaque
🌟 Opaque secret
1️⃣ 通过命令行创建
[root@master ~]# kubectl create secret generic secret-test1
secret/secret-test1 created
[root@master ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-j5z7h kubernetes.io/service-account-token 3 3d17h
secret-test1 Opaque 0 14s
data
为0就代表创建了一个空的Secret
2️⃣ 查看secret
[root@master ~]# kubectl get secret secret-test1 -o yaml
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: "2021-08-24T02:22:37Z"
name: secret-test1
namespace: default
resourceVersion: "204083"
selfLink: /api/v1/namespaces/default/secrets/secret-test1
uid: f1cd2b14-4dd9-410b-8714-87f55983a3f7
type: Opaque
3️⃣使用yaml文件创建
##Opaque类型的数据是一个Map类型,要求Value是base64编码
##先转换
[root@master ~]# echo "tom" | base64
dG9tCg==
[root@master ~]# echo "you" | base64
eW91Cg==
[root@master secret]# cat sercret-test1.yaml
apiVersion: v1
kind: Secret
metadata:
name: secret-test1
type: Opaque
data:
name: dG9tCg==
like: eW91Cg==
[root@master secret]# kubectl create -f sercret-test1.yaml
secret/secret-test1 created
##查看
[root@master secret]# kubectl get secret
NAME TYPE DATA AGE
secret-test1 //-·
Opaque 2 49s
4️⃣ 将secret挂载到Volume中
[root@master secret]# cat sercret-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-pod-test2
spec:
volumes:
- name: secret-volume
secret:
secretName: secret-test1
containers:
- image: centos
name: test
imagePullPolicy: IfNotPresent
volumeMounts:
- name: secret-volume
mountPath: /opt/secret-volume
readOnly: true
command: ["sh","-c","sleep 700s;"]
[root@master secret]# kubectl exec -it secret-pod-test2 /bin/bash
[root@secret-pod-test2 secret-volume]# ls
like name
[root@secret-pod-test2 secret-volume]# cat like
you
[root@secret-pod-test2 secret-volume]# cat name
tom
5️⃣ secret导入到容器的环境变量中
[root@master secret]# cat env-secret-test3.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: secret-test-deployment
spec:
replicas: 3
selector:
matchLabels:
app: secret
template:
metadata:
labels:
app: secret
spec:
containers:
- image: centos
name: test2
imagePullPolicy: IfNotPresent
command: ["sh","-c","sleep 700;"]
env:
- name: LIKE
valueFrom:
secretKeyRef:
name: secret-test1
key: like
[root@master secret]# kubectl get pod
NAME READY STATUS RESTARTS AGE
secret-pod-test2 1/1 Running 2 30m
secret-test-deployment-54bdf6cc9f-49vmp 1/1 Running 0 32s
secret-test-deployment-54bdf6cc9f-nlln2 1/1 Running 0 32s
secret-test-deployment-54bdf6cc9f-pl6xt 1/1 Running 0 32s
[root@master secret]# kubectl exec -it secret-test-deployment-54bdf6cc9f-49vmp -- sh -c "env"
HOSTNAME=secret-test-deployment-54bdf6cc9f-49vmp
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
PWD=/
HOME=/root
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
LIKE=you
TERM=xterm
SHLVL=1
KUBERNETES_SERVICE_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_SERVICE_HOST=10.96.0.1
_=/usr/bin/env
🌟kubernetes.io dockerconfigjson
使用Kuberctl创建docker registry认证的secret
$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER--
docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER__EMAIL
secret "myregistrykey" created.
在创建Pod的时候,通过imagePul1Secrets 来引用刚创建的、 myregistrykey'
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
name: foo
image: roc/ awangyang:v1
imagePullSecrets:
name: myregistrykey