目录
①使用kubectl的create命令来指定文件创建Secret
⑤使用Secret配置实现免密交互拉取Harbor私有仓库镜像
一、Secret
1、定义
Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。
2、四种Secret类型
①opaque 通用类型(可以通过文件 目录、变量创建)默认类型
②kubernetes.io/service-account-token k8s自动创建的给 serviceaccount 服务账号(podza在k8s集群内部的专属服务用户)访问APiserver使用
③kubernetes.io/dockerconfigjson 给k8s 从harbor私有镜像仓库 去镜像认证使用
④kubernetes.io/tls 通过TLS 证书来认证的 (私有文件、秘钥)
3、Pod使用Secret的方式
Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:
●作为挂载到一个或多个容器上的卷 中的文件。
在Kubernetes中,Secret资源提供了一种安全的方式来存储和管理敏感信息,如密码、OAuth令牌、SSH密钥等。Pod可以通过以下三种方式使用Secret:
●作为容器的环境变量。
当你想要在Pod的容器中访问Secret中的数据时,可以将Secret挂载为一个卷。这样,Secret中的数据就会以文件的形式出现在容器的文件系统中。例如,你可以将数据库密码挂载到容器的某个目录下,容器内的应用程序就可以通过读取这些文件来获取所需的凭据。
●由 kubelet 在为 Pod 拉取镜像时使用。
如果你的Pod需要从私有Docker Registry拉取镜像,你可以创建一个包含registry认证信息的Secret。这个Secret会被kubelet用来在拉取镜像时进行认证,而不需要在Pod的配置中直接暴露这些认证信息。
4、应用场景
在实际应用中,Secret常用于存储和管理各种凭据,比如数据库访问密码、API服务的访问令牌、SSH密钥等。这些凭据通常不应该直接硬编码在应用程序代码中,也不应该存储在容器镜像或者配置文件中。使用Secret可以确保这些敏感信息的安全性,并且便于管理和更新。
例如,可能有一个Web应用程序,它需要连接到一个后端数据库。可以创建一个包含数据库用户名和密码的Secret,然后在Pod的配置中引用这个Secret,将其作为环境变量或者文件挂载到容器中。这样,应用程序就可以在运行时安全地访问这些凭据,而无需在代码中直接处理敏感信息。
为了确保Secret的安全性,Kubernetes还提供了一些额外的保护措施,比如限制对Secret的访问,以及在Pod被删除后自动清除其在节点上的Secret副本。此外,Kubernetes还支持将Secret标记为不可变的(immutable),以防止意外或不必要的更新导致应用程序中断。
5、Secret的实例
①使用kubectl的create命令来指定文件创建Secret
创建了一个名为cxksecret的Secret,并且包含了两个文件:username.txt和password.txt。这些文件分别包含了用户名和密码。在Kubernetes中,Secret的内容是加密存储的,以确保敏感信息的安全。因此,即使使用kubectl get secret或kubectl describe secret命令,也不会显示Secret的实际内容
mkdir /opt/secrets
cd /opt/secrets/
echo -n "rmh" > usrname.txt
echo -n "zhenshuai123" > password.txt
kubectl create secret generic rmhsecret --from-file=usrname.txt --from-file=password.txt
#首先创建了两个文本文件,一个包含用户名,另一个包含密码。然后,使用kubectl create secret generic命令创建了一个名为cxksecret的Secret,并指定了这两个文件作为数据源。
kubectl get secrets
kubectl describe secrets rmhsecret
#get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑
②内容使用base64编码创建Secret
使用base64编码创建了一个新的Secret资源cxksecret1。在这个过程中,首先将用户名和密码转换为base64编码的字符串,然后将这些编码后的数据直接写入到一个YAML文件secret.yaml中,最后使用kubectl create -f secret.yaml命令创建了Secret。
echo -n "rmh" | base64
Y3hr
echo -n "zhenshaui123" | base64
YWJjMTIz
#使用echo命令和管道|将用户名和密码通过base64命令进行编码。这样,得到了可以安全传输的编码字符串。
[root@master01 secrets]]#vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: rmhsecret1
type: Opaque
data:
username: cm1o
password: emhlbnNodWFp
kubectl create -f secret.yaml
kubectl get secrets
kubectl describe secrets rmhsecret1
#创建了一个名为secret.yaml的文件,其中包含了Secret的定义。在这个文件中,指定了Secret的名称cxksecret1,类型为Opaque,并提供了编码后的用户名和密码。
③通过Volume挂载的方式创建Secret
vim volume-sc.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secrets
secret:
secretName: rmhsecret
#创建了一个名为volume-sc.yaml的YAML文件,定义了一个Pod,其中包含一个容器(使用nginx镜像)。在Pod的spec部分,指定了一个卷secrets,它引用了名为cxksecret的Secret,并将其挂载到容器的/etc/secrets目录。
kubectl exec -it mypod sh
cd /etc/secrets/
cat password.txt
cat username.txt
#可以查看password.txt和username.txt文件的内容。这些文件包含了在创建Secret时定义的用户名和密码。
#请注意,由于在Pod定义中设置了readOnly: true,这意味着Secret卷是以只读模式挂载的,不能修改这些文件。这是处理敏感数据时的一个安全最佳实践。如果需要修改Secret中的数据,应该在Kubernetes集群外部进行,然后更新Secret资源。
④通过将Secret导出到环境变量
创建了一个名为mypod1
的Pod,并将mysecret1
Secret中的特定键(username
和password
)导出为环境变量。这样,Pod中的容器就可以通过环境变量访问这些敏感信息。
kubectl describe secrets rmhsecret1
vim env-sc.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: nginx
image: nginx
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: rmhsecret1
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: rmhsecret1
key: password
kubectl apply -f env-sc.yaml
kubectl get pod
kubectl exec -it mypod1 bash
root@mypod1:/# echo $TEST_USER
rmh
root@mypod1:/# echo $TEST_PASSWORD
zhenshuai123
root@mypod1:/# env|grep TEST
TEST_USER=rmh
TEST_PASSWORD=zhenshuai123
⑤使用Secret配置实现免密交互拉取Harbor私有仓库镜像
⑤-①创建私有仓库的Secret资源
首先,先创建一个Secret资源,这个资源将包含访问Harbor私有仓库所需的认证信息,如用户名和密码。
使用kubectl命令创建一个名为myhabrbor的Secret资源,指定Docker Registry服务器地址、用户名密码和邮箱。
kubectl create secret docker-registry myharbor --docker-server 192.168.170.111 \
--docker-username admin --docker-password Harbor12345 --docker-email [email protected]
⑤-②引用Secret资源拉取私有仓库镜像创建pod
在创建pod时,你需要在pod的配置中引用上面创建的Secret的名称
nodeName: node02
imagePullSecrets:
- name: myharbor
image: /test/nginx-test:v1
dnsPolicy: ClusterFirst
restartPolicy: Always
⑤-③注意
确保Harbor仓库的默认配置为HTTPS,因为Kubernetes默认使用HTTPS与Docker Registry