华子目录
- 2.secrets
- 2.1secrets功能介绍
- 2.2secrets的创建
- 2.2.1从文件创建
- 2.2.2编写yaml文件
- 2.3secret的使用案例
- 2.3.1将secret挂载到volume中
- 2.3.2设置`子目录`映射`secret`密钥
- 2.3.3将secret设置为环境变量
- 2.3.4存储`docker register`的认证信息`spec.imagePullSecrets[]`
2.secrets
2.1secrets功能介绍
-
secret
对象类型用来保存敏感信息
,如密码
,Oauth令牌
和ssh key
-
敏感信息
放在secret
中比放在Pod
的定义
或者容器镜像
中来说更加安全
和灵活
-
Pod
可以用两种
方式使用secret
:- 作为
volume
中的文件
被挂载
到pod
中的一个或者多个容器
里 - 当
kubelet
为pod
拉取镜像
时使用
- 作为
-
secret
的类型
:Service Account
:Kubernetes
自动创建
包含访问api凭据
的secret
,并自动
修改pod
以使用此类型
的secret
Opaque
:使用base64
编码存储信息
,可以通过base64 --decode
解码获得原始数据
,因此安全性弱
。kubernetes.io/dockerconfigjson
:用于存储docker registry
的认证信息
[root@k8s-master ~]# mkdir secret
[root@k8s-master ~]# cd secret/
2.2secrets的创建
在创建secrets
时,我们可以使用create命令的方式创建
或者yaml文件的方式创建
#secret有3中类型
[root@k8s-master secret]# kubectl create secret
docker-registry (创建一个给 Docker registry 使用的 Secret)
generic (Create a secret from a local file, directory, or literal value)
tls (创建一个 TLS secret)
2.2.1从文件创建
先创建文件
#-n取消换行
[root@k8s-master secret]# echo -n huazi > username.txt
[root@k8s-master secret]# echo -n 12345 > password.txt
[root@k8s-master secret]# ls
password.txt username.txt
#创建一个名为userlist的generic类型的secret资源
[root@k8s-master secret]# kubectl create secret generic userlist --from-file username.txt --from-file password.txt
secret/userlist created
#查看
[root@k8s-master secret]# kubectl get secrets
NAME TYPE DATA AGE
userlist Opaque 2 3m13s
[root@k8s-master secret]# kubectl describe secrets userlist
Name: userlist
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 5 bytes
username.txt: 5 bytes
#以yaml格式查看,我们发现文件名作为了键,文件内容作为了值
[root@k8s-master secret]# kubectl get secrets userlist -o yaml
apiVersion: v1
data:
password.txt: MTIzNDU=
username.txt: aHVhemk=
kind: Secret
metadata:
creationTimestamp: "2024-11-02T10:40:13Z"
name: userlist
namespace: default
resourceVersion: "811492"
uid: 198d8aae-b738-4289-bb67-3d23c94ba909
type: Opaque
2.2.2编写yaml文件
#先将内容做base64编码
[root@k8s-master secret]# echo -n huazi | base64
aHVhemk=
[root@k8s-master secret]# echo -n 12345 | base64
MTIzNDU=
#创建一个名为userlist1的generic类型的secret资源
[root@k8s-master secret]# kubectl create secret generic userlist1 --dry-run=client -o yaml > secret-generic.yml
[root@k8s-master secret]# vim secret-generic.yml
[root@k8s-master secret]# cat secret-generic.yml
apiVersion: v1
kind: Secret
metadata:
name: userlist1
type: Opaque
data:
username: aHVhemk=
password: MTIzNDU=
[root@k8s-master secret]# kubectl apply -f secret-generic.yml
secret/userlist1 created
[root@k8s-master secret]# kubectl get secrets
NAME TYPE DATA AGE
userlist Opaque 2 11m
userlist1 Opaque 2 56s
[root@k8s-master secret]# kubectl describe secrets userlist1
Name: userlist1
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 5 bytes
username: 5 bytes
[root@k8s-master secret]# kubectl get secrets userlist1 -o yaml
apiVersion: v1
data:
password: MTIzNDU=
username: aHVhemk=
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"password":"MTIzNDU=","username":"aHVhemk="},"kind":"Secret","metadata":{"annotations":{},"name":"userlist1","namespace":"default"},"type":"Opaque"}
creationTimestamp: "2024-11-02T10:50:32Z"
name: userlist1
namespace: default
resourceVersion: "812512"
uid: b29dc86a-d8f6-4eb3-88ea-11eb3fb707e0
type: Opaque
2.3secret的使用案例
#查看名为userlist1的secret类型
[root@k8s-master ~]# kubectl describe secrets userlist1
Name: userlist1
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 5 bytes
username: 5 bytes
#发现有两个键值对,一个password,一个username
2.3.1将secret挂载到volume中
#创建自主式pod,去使用userlist1
[root@k8s-master secret]# vim pod1.yml
[root@k8s-master secret]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: busyboxplus
name: busyboxplus
command: ["/bin/sh","-c","sleep 10000"]
volumeMounts: ##这是一个列表,定义了Pod中容器要挂载的卷。
- name: secret-volume # #指定了要挂载的卷的名称,这个名称必须与volumes列表中定义的某个卷的名称相匹配。
mountPath: /secret ##卷在容器内的挂载路径。
readOnly: true #/secret这个目录只读权限
volumes: #定义了Pod中可以使用的卷
- name: secret-volume #定义了卷的名称,这个名称将在volumeMounts中被引用
secret: #表示这个卷是由一个secrets支持的
secretName: userlist1 #指定了secrets的名称为userlist1
[root@k8s-master secret]# kubectl apply -f pod1.yml
pod/testpod created
[root@k8s-master secret]# kubectl describe pods testpod
[root@k8s-master secret]# kubectl exec -it pods/testpod -- /bin/sh
/ # ls
bin etc lib linuxrc mnt proc run secret tmp var
dev home lib64 media opt root sbin sys usr
/ # cd secret/
/secret # ls
password username
/secret # ls -l
total 0
lrwxrwxrwx 1 root root 15 Nov 3 02:29 password -> ..data/password
lrwxrwxrwx 1 root root 15 Nov 3 02:29 username -> ..data/username
/secret # cat username
huazi
/secret # cat password
12345
我们发现userlist1
中的键
变成了文件名
,值
变成了文件内容
,其中文件
是一个软连接文件
#回收
[root@k8s-master secret]# kubectl delete -f pod1.yml
pod "testpod" deleted
2.3.2设置子目录
映射secret
密钥
[root@k8s-master secret]# vim pod2.yml
[root@k8s-master secret]# cat pod2.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: busyboxplus
name: busyboxplus
command: ["/bin/sh","-c","sleep 10000"]
volumeMounts: #Pod中容器要挂载的卷
- name: secret-volume #挂载的卷的名称,这个名称必须与volumes列表中定义的某个卷的名称相匹配。
mountPath: /secret #容器中的挂载目录
readOnly: true #只读
volumes: #声明pod的数据卷
- name: secret-volume #数据卷的名字为secret-volume
secret: #表示这个卷是由一个secrets支持的
secretName: userlist1 #指定了secrets的名称为userlist1
items:
- key: username1
path: users/username #username为userlist1中的键,会变为文件名,值会变为文件内容
- key: password1
path: auth/password #password为userlist1中的键,会变为文件名,值会变为文件内容
users
和auth
是/secret
下的子目录
,子目录
下分别有名为username
和password
的文本文件
[root@k8s-master secret]# kubectl apply -f pod2.yml
pod/testpod created
[root@k8s-master secret]# kubectl describe pods testpod
[root@k8s-master secret]# kubectl exec -it pods/testpod -- /bin/sh
/ # ls
bin etc lib linuxrc mnt proc run secret tmp var
dev home lib64 media opt root sbin sys usr
/ # cd secret/
/secret # ls
auth users
/secret # cd auth/
/secret/..2024_11_03_02_57_47.438164553/auth # ls
password
/secret/..2024_11_03_02_57_47.438164553/auth # ls -l
total 4
-rw-r--r-- 1 root root 5 Nov 3 02:57 password
/secret/..2024_11_03_02_57_47.438164553/auth # cat password
12345
/secret/..2024_11_03_02_57_47.438164553/users # cat username
huazi
#回收
[root@k8s-master secret]# kubectl delete -f pod2.yml
pod "testpod" deleted
2.3.3将secret设置为环境变量
[root@k8s-master secret]# vim pod3.yml
[root@k8s-master secret]# cat pod3.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: busyboxplus
name: busyboxplus
command: ["/bin/sh","-c","env"]
env:
- name: Username #容器中的环境变量名
valueFrom: #指定环境变量值的来源
secretKeyRef: #表示环境变量的值是从一个secret中获取的
name: userlist1 #secret资源的名字
key: username #在指定的secret中,username键对应的值将用作环境变量Username的值
- name: Password #容器中的环境变量名
valueFrom: #指定环境变量值的来源
secretKeyRef: #表示环境变量的值是从一个secret中获取的
name: userlist1 #secret资源的名字
key: password #在指定的secret中,password键对应的值将被用作环境变量Password的值
restartPolicy: Never
[root@k8s-master secret]# kubectl apply -f pod3.yml
pod/testpod created
[root@k8s-master secret]# kubectl get pods
NAME READY STATUS RESTARTS AGE
testpod 0/1 Completed 0 7s
[root@k8s-master secret]# kubectl logs pods/testpod -c busyboxplus
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=testpod
SHLVL=1
HOME=/
Username=huazi #我们发现了创建的环境变量
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
Password=12345 #我们发现了创建的环境变量
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
#回收
[root@k8s-master secret]# kubectl delete -f pod3.yml --force
2.3.4存储docker register
的认证信息spec.imagePullSecrets[]
在做这个案例之前,我们先介绍一下docker
的公有仓库
和私有仓库
公有仓库
:上传镜像
需要认证
,下载镜像
不需要认证
私有仓库
:上传
和下载
都需要认证
先在harbor
上创建一个私有仓库
因为node1
主机上,我们之前做过认证
,这里我们先退出登录
[root@k8s-node1 ~]# docker logout harbor.huazi.org
Removing login credentials for harbor.huazi.org
node2
做过认证
,在node2
上传myapp:v1
镜像到huazi
这个私有仓库
中
[root@k8s-node2 ~]# docker images
myapp v1 d4a5e0eaa84f 6 years ago 15.5MB
[root@k8s-node2 ~]# docker tag myapp:v1 harbor.huazi.org/huazi/myapp:v1
[root@k8s-node2 ~]# docker push harbor.huazi.org/huazi/myapp:v1
The push refers to repository [harbor.huazi.org/huazi/myapp]
a0d2c4392b06: Pushed
05a9e65e2d53: Pushed
68695a6cfd7d: Pushed
c1dc81a64903: Pushed
8460a579ab63: Pushed
d39d92664027: Pushed
v1: digest: sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e size: 1569
验证node1
上是否退出成功
#发现下载私有仓库中的myapp:v1镜像失败,说明退出成功
[root@k8s-node1 ~]# docker pull harbor.huazi.org/huazi/myapp:v1
Error response from daemon: unauthorized: unauthorized to access repository: huazi/myapp, action: pull: unauthorized to access repository: huazi/myapp, action: pull
创建名为docker-auth
的类型为docker-registry
的secret资源
#创建名为docker-auth的类型为docker-registry的secret资源
[root@k8s-master secret]# kubectl create secret docker-registry \
> docker-auth \ #secret名字
> --docker-server harbor.huazi.org \
> --docker-username admin \
> --docker-password 123456 \
> --docker-email huazi@huazi.org
secret/docker-auth created
#查看创建的docker-auth
[root@k8s-master secret]# kubectl get secrets
NAME TYPE DATA AGE
docker-auth kubernetes.io/dockerconfigjson 1 112s
userlist Opaque 2 17h
userlist1 Opaque 2 17h
[root@k8s-master secret]# kubectl describe secrets docker-auth
Name: docker-auth
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/dockerconfigjson
Data
====
.dockerconfigjson: 123 bytes
创建pod
去使用名为docker-auth
的secret资源
[root@k8s-master secret]# vim pod4.yml
[root@k8s-master secret]# cat pod4.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1.org #指定让它在node1上运行
containers:
- image: harbor.huazi.org/huazi/myapp:v1 #指定拉取的镜像是huazi这个私有仓库的
name: myappv1
# imagePullSecrets: #我们先把这里注释了
# - name: docker-auth
[root@k8s-master secret]# kubectl apply -f pod4.yml
pod/testpod created
#我们发现这里的状态是ErrImagePull,表示镜像拉取失败
[root@k8s-master secret]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testpod 0/1 ErrImagePull 0 6s 10.244.1.13 k8s-node1.org <none> <none>
#回收
[root@k8s-master secret]# kubectl delete -f pod4.yml
pod "testpod" deleted
再去掉注释
[root@k8s-master secret]# vim pod4.yml
[root@k8s-master secret]# cat pod4.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1.org
containers:
- image: harbor.huazi.org/huazi/myapp:v1 #指定拉取的镜像是huazi这个仓库的
name: myappv1
imagePullSecrets:
- name: docker-auth
#发现运行成功,说明node1上已经成功拉取了私有
[root@k8s-master secret]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testpod 1/1 Running 0 7s 10.244.1.14 k8s-node1.org <none> <none>
#我们发现node1已经成功拉取了私有仓库中myapp:v1这个镜像
[root@k8s-node1 ~]# docker images
harbor.huazi.org/huazi/myapp v1 d4a5e0eaa84f 6 years ago 15.5MB
imagePullSecrets
是一个在Kubernetes
中用于配置Pod
以拉取私有Docker镜像
的字段
。当你在Kubernetes
集群中部署应用时,如果应用依赖于存储在私有Docker仓库
中的镜像
,你就需要配置imagePullSecrets
来确保Kubernetes
能够访问这些私有镜像