Secret的概述
Secret翻译过来的意思是秘密、保密等意思。Secret主要存储k8s集群中比较敏感的一些文件,通过一些特殊的加密方式将这一些文件进行加密操作,Pod通过volume以及环境变量的方式去引用,确保了数据的安全性。
ConfigMap 没有保密或者加密功能,存储加密数据常用Secret
Secret的类型
Service Account
用于和API进行交互,会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录下Opaque
基于base64编码格式,用于加密以及解密kubernetes.io/dockerconfigjson
主要用于存储docker registry私用仓库的认证信息
测试环境
主机 | IP地址 |
master | 192.168.1.100 |
node1 | 192.168.1.200 |
node2 | 192.168.1.250 |
Secret的创建
Service Account的创建
使用命令行的方式来创建一个Pod
[root@master ~]# kubectl run nginx --image=docker.io/nginx
pod/nginx created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 21s
进入容器操作
[root@master ~]# kubectl exec -it nginx /bin/bash
root@nginx:/# cd /run/secrets/kubernetes.io/serviceaccount/
root@nginx:/run/secrets/kubernetes.io/serviceaccount# ls
ca.crt namespace token
默认状态自动挂载了这三个文件 这就是Service Account类型所具有的
Opaque的创建
手动加密操作(Opaque是基于base64的编码格式)
[root@master ~]# echo -n "admin" | base64
YWRtaW4=
[root@master ~]# echo -n "123456" | base64
MTIzNDU2
解密操作:只需要加入-d参数即可
[root@master ~]# echo -n "MTIzNDU2" | base64 -d
123456
创建secret.yaml文件
[root@master ~]# vi secret.yaml
apiVersion: v1
kind: Secret //资源类型为Secret
metadata:
name: secret-1
type: Opaque //secret的类型为Opaque
data:
user: YWRtaW4= //经过加密的
pass: MTIzNDU2
[root@master ~]# kubectl apply -f secret.yaml
secret/secret-1 created
[root@master ~]# kubectl get secret //查看secret的状态
NAME TYPE DATA AGE
default-token-gwqtq kubernetes.io/service-account-token 3 4d
secret-1 Opaque 2 29s
Pod通过volume的方式引用Secret
[root@master ~]# vi pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: nginx
image: docker.io/nginx:latest
volumeMounts: //挂载到容器里面的指定目录
- name: secret
mountPath: /opt/secret //指定容器里面的目录
volumes:
- name: secret
secret:
secretName: secret-1 //指定secret资源名称
[root@master ~]# kubectl apply -f pod.yaml
pod/pod-1 created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-1 1/1 Running 0 13s
查看效果
[root@master ~]# kubectl exec -it pod-1 /bin/bash
root@pod-1:/# cd /opt/secret/
root@pod-1:/opt/secret# ls
pass user
root@pod-1:/opt/secret# cat pass
123456root@pod-1:/opt/secret# cat user
adminroot@pod-1:/opt/secret#
挂载成功(在我们使用的时候,是会进行自动解密操作的)
Pod通过环境的方式引用Secret
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: nginx
image: docker.io/nginx:latest
env:
- name: TEST_USER //指定变量名称
valueFrom:
secretKeyRef:
name: secret-1 //指定Secret资源名称
key: user //将这个字段的值赋予申明的变量
- name: TEST_PASS
valueFrom:
secretKeyRef:
name: secret-1
key: pass
[root@master ~]# kubectl apply -f pod.yaml
pod/pod-1 created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-1 1/1 Running 0 13s
查看效果
[root@master ~]# kubectl exec -it pod-1 /bin/bash
root@pod-1:/# echo $TEST_USER
admin
root@pod-1:/# echo $TEST_PASS
123456
kubernetes.io/dockerconfigjson的创建
提前搭建好harbor私有仓库,搭建过程可以参考我的这一篇博客:
Centos 7 搭建Docker Harbor私有仓库
创建一个私用仓库上传一个nginx:v1.1的镜像
验证测试(没有提供私有仓库的认证信息,看看Pod会不会正常运行)
[root@master ~]# vi pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: nginx
image: 192.168.1.100/kub/nginx:v1.1
[root@master ~]# kubectl apply -f pod.yaml
pod/pod-1 created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-1 0/1 ErrImagePull 0 9s
这里报错了,镜像下载失败,这是因为我们要提供认证信息才可以从私有仓库中下载镜像
使用kubectl 创建docker registry的认证信息
[root@master ~]# kubectl create secret docker-registry myregistry --docker-server=192.168.1.100 --docker-username=admin --docker-password=12345
secret/myregistry created
在Podl里面应用私有仓库的认证信息
[root@master ~]# vi pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: nginx
image: 192.168.1.100/kub/nginx:v1.1
imagePullSecrets: //添加这个代码来引用即可
- name: myregistry //输入名称
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-1 1/1 Running 0 53s
查看私有仓库的下载次数