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的镜像

k8s redis读取secret密码_kubernetes


验证测试(没有提供私有仓库的认证信息,看看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

查看私有仓库的下载次数

k8s redis读取secret密码_nginx_02