一、Secret
secrets资源,类似于configmap资源,只是secrets资源是用来传递重要的信息的;
secret资源就是将value的值使用base64编译后传输,当pod引用secret后,k8s会自动将其base64的编码,反编译回正常的字符串;
- Secret 用于保存机密数据的对象。一般由于保存密码、令牌或密钥等。
data
字段用来存储 base64 编码数据。stringData
存储未编码的字符串。
- Secret 意味着你不需要在应用程序代码中包含机密数据,减少机密数据(如密码)泄露的风险。
- Secret 可以用作环境变量、命令行参数或者存储卷文件。
二、创建secrets资源
1.创建工作目录
[root@k8s1 k8s]# mkdir secrets
[root@k8s1 k8s]# cd secrets/
2.尝试使用base64进行编码
# 编码
[root@k8s1 secrets]# echo oslee | base64
b3NsZWUK# 解码
[root@k8s1 secrets]# echo b3NsZWUK | base64 -d
oslee
3.声明式创建secrets资源
# 编辑secrets资源清单
vi 01-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: s1
#用户自定义的类型(Opaque为自定义类型;generic为)
type: Opaque
data:
k8s: b3NsZWUK
oslee: b3NsZWUK
# 创建secret资源
[root@k8s1 secrets]# kubectl apply -f 01-secret.yaml
secret/s1 created# 查看
[root@k8s1 secrets]# kubectl get secrets
NAME TYPE DATA AGE
default-token-xwhzs kubernetes.io/service-account-token 3 23h
s1 Opaque 2 2m46s
[root@k8s1 secrets]# kubectl describe secret s1
Name: s1
Namespace: default
Labels: <none>
Annotations: <none>Type: Opaque
Data
====
k8s: 6 bytes
oslee: 6 bytes
4.响应式创建secret
[root@k8s1 secrets]# kubectl create secret generic secret-02 --from-literal=school=os --from-literal=class=lee
- docker-registry:创建一个给Docker registry容器镜像仓库使用的secret
- generic: 从本地file, directory或者literal value创建一个 secret(这是大多数情况使用的)也就是资源清单中的type:Opaque是一个意思;
- tls: 创建一个TLS secret
三、pod引用secret资源
1.pod资源env环境变量引用
# 创建pod资源
[root@k8s1 secrets]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: m13
spec:
containers:
- image: nginx:1.20.1-alpine
name: nginx
env:
- name: secret-env01
valueFrom:
#声明引用sercet
secretKeyRef:
#声明secret名称
name: s1
#声明secret的key
key: oslee
- name: secret-env02
valueFrom:
secretKeyRef:
name: secret-02
key: class
# 创建资源
[root@k8s1 secrets]# kubectl apply -f pod.yaml
pod/m13 created
# 登录pod资源查看env变量
[root@k8s1 secrets]# kubectl exec m13 -it -- sh
/ # envsecret-env01=oslee
secret-env02=lee
2.pod资源volume存储卷引用secret资源
# 编辑资源清单
[root@k8s1 secrets]# vi pod-env-volume.yaml
#pod资源env环境变量方式引用secret
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-01
spec:
containers:
- name: c1
image: nginx:1.20.1-alpine
env:
- name: k8s
valueFrom:
#声明引用secret资源
secretKeyRef:
name: s1
#声明使用secret资源中的那一个key
key: k8s
---
#vomlume方式引用
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-02
spec:
#声明存储卷
volumes:
- name: vol-secret
#声明存储卷的类型是secret
secret:
#指定secret资源的名称(使用哪个secret资源?)
secretName: s1
containers:
- name: c2
image: nginx:1.24.0-alpine
volumeMounts:
- name: vol-secret
#挂载到容器的哪个位置路径
mountPath: /secret/
# 创建资源
[root@k8s1 secrets]# kubectl apply -f pod-env-volume.yaml
pod/pod-secret-01 created
pod/pod-secret-02 created
# 查看挂载
[root@k8s1 secrets]# kubectl exec pod-secret-01 -it -- sh
[root@k8s1 secrets]# kubectl exec pod-secret-02 -it -- sh
3.pod资源清单指定key引用secret
[root@k8s1 secrets]# kubectl apply -f pod-path.yaml
pod/pod-secret-03 created
[root@k8s1 secrets]# cat pod-path.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-03
spec:
#声明存储卷
volumes:
- name: vol-secret
#声明存储卷的类型是secret
secret:
#1,指定secret资源的名称(使用哪个secret资源?)
secretName: s1
#2,指定secret资源中要引用的key
items:
- key: k8s
path: oslee.path
containers:
- name: c2
image: nginx:1.24.0-alpine
volumeMounts:
- name: vol-secret
#挂载到容器的哪个位置路径?
mountPath: /secret/oslee.path
#只挂在文件,不清空容器原有文件夹
subPath: oslee.path
# 进入pod查看
[root@k8s1 secrets]# kubectl exec -it pod-secret-03 -- sh
四、secret类型之-私有镜像仓库使用
- docker-registry:创建一个给Docker registry容器镜像仓库使用的secret
- generic: 从本地file, directory或者literal value创建一个 secret(这是大多数情况使用的)也就是资源清单中的type:Opaque是一个意思;
- tls: 创建一个TLS secret
创建Docker harbor的secret信息:
因为,k8s拉取镜像与Docker拉取镜像是不同的方式,所以k8s需要创建一个属于自己的拉取镜像的方式;
1.harbor创建私有仓库
2.推送镜像到私有仓库
[root@k8s2 ~]# docker login harbor.oslee.com
[root@k8s2 ~]# docker tag nginx:1.20.1-alpine harbor.oslee.com/oslee-private/nginx:1.20.1-alpine
[root@k8s2 ~]# docker push harbor.oslee.com/oslee-private/nginx:1.20.1-alpine
3.响应式创建拉取镜像的secret资源
[root@k8s1 ~]# kubectl create secret docker-registry oslee-harbor --docker-username=admin --docker-password=harbor123 --docker-email=oslee@qq.com --docker-server=harbor.oslee.com
secret/oslee-harbor created
4.创建pod引用拉取镜像的secret资源
[root@k8s1 secrets]# cat pod-harbor-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-harbor-01
spec:
#指定镜像拉取的secret资源(secret的拉取镜像类型);
imagePullSecrets:
- name: oslee-harbor
containers:
- name: c3
image: harbor.oslee.com/oslee-private/nginx:1.20.1-alpine
5.声明式创建docker registry类型的secret资源
5.1.【-o yaml】模仿系统声明式的写法
[root@k8s1 secrets]# kubectl get secrets oslee-harbor -oyaml
5.2.base64解码查看内容
[root@k8s1 secrets]# echo eyJhdXRocyI6eyJoYXJib3Iub3NsZWUuY29tIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6ImhhcmJvcjEyMyIsImVtYWlsIjoib3NsZWVAcXEuY29tIiwiYXV0aCI6IllXUnRhVzQ2YUdGeVltOXlNVEl6In19fQ== | base64 -d
{"auths":{"harbor.oslee.com":{"username":"admin","password":"harbor123","email":"oslee@qq.com","auth":"YWRtaW46aGFyYm9yMTIz"}}}[root@k8s1 secrets]#
[root@k8s1 secrets]# echo YWRtaW46aGFyYm9yMTIz | base64 -d
admin:harbor123
5.3根据上述信息,自己编辑secret声明式资源清单
[root@k8s1 secrets]# cat harbor-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: oslee-harbor02
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJoYXJib3Iub3NsZWUuY29tIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6ImhhcmJvcjEyMyIsImVtYWlsIjoib3NsZWVAcXEuY29tIiwiYXV0aCI6IllXUnRhVzQ2YUdGeVltOXlNVEl6In19fQ==
[root@k8s1 secrets]# kubectl apply -f harbor-secret.yaml
secret/oslee-harbor02 created
[root@k8s1 secrets]# cat pod-harbor-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-harbor-01
spec:
#指定镜像拉取的secret资源(secret的拉取镜像类型);
imagePullSecrets:
- name: oslee-harbor02
containers:
- name: c3
image: harbor.oslee.com/oslee-private/nginx:1.20.1-alpine
[root@k8s1 secrets]# kubectl apply -f pod-harbor-secret.yaml
pod/pod-harbor-01 created
[root@k8s1 secrets]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-harbor-01 1/1 Running 0 6s