Kubernetes之Secret详解并配置连接Harbor仓库

Secret详解

官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/

secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。而不需要把这些敏感数据暴露到镜像或者Pod Spec中。

用户可以创建自己的secret,系统也会有自己的secret。Pod需要先引用才能使用某个secret

Secret类型type:

1.kubernetes.io/service-account-token:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的的/run/secrets/kubernetes.io/serviceaccount 目录中。 

2.Opaque:base64编码格式的Secret,用来存储密码、秘钥等。

3.kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息

4.kubernetes.io/tls:此类型仅用于存储私钥和证书

Pod使用secret方式:

作为volume的一个域被一个或多个容器挂载

內建的Secrets:

由ServiceAccount创建的API证书附加的秘钥k8s自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信

创建自己的Secret:

方式1:使用kubectl create secret命令
方式2:yaml文件创建Secret
yaml方式创建Secret

假如某个Pod要访问数据库,需要用户名密码,现在我们分别设置这个用户名和密码

Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码显示的安全隐患。

创建一个secret.yaml文件,内容用base64编码:明文显示容易被别人发现,这里先转码。

[root@kub-k8s-master ~]# echo -n 'admin' | base64
YWRtaW4=
[root@kub-k8s-master ~]# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
-w 0  表示不换行

创建一个secret.yaml文件,内容用base64编码

[root@kub-k8s-master prome]# vim secret.yml
---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque  #模糊
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

创建:

[root@kub-k8s-master prome]# kubectl apply -f secret.yml 
secret/mysecret created

解析Secret中内容,还是经过编码的—需要解码

查看secret
[root@kub-k8s-master ~]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-7vc82   kubernetes.io/service-account-token   3      30h
mysecret              Opaque                                2      6s

查看secret详细信息
[root@kub-k8s-master prome]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2019-10-21T03:07:56Z"
  name: mysecret
  namespace: default
  resourceVersion: "162855"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: 36bcd07d-92eb-4755-ac0a-a5843ed986dd
type: Opaque

手动base64解码方式:

[root@kub-k8s-master ~]# echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
使用Secret
secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用,也可以被系统中的其他资源使用。

一个Pod中引用Secret的列子:

创建一个Secret,多个Pod可以引用同一个Secret

修改Pod的定义,在spec.volumes[]加一个volume,给这个volume起个名字,spec.volumes[].secret.secretName记录的是要引用的Secret名字
[root@kub-k8s-master prome]# vim pod_use_secret.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: testredis
    image: daocloud.io/library/redis
    volumeMounts:    #挂载一个卷
    - name: foo     #这个名字需要与定义的卷的名字一致
      mountPath: "/etc/foo"  #挂载到容器里哪个目录下,随便写
      readOnly: true
  volumes:     #数据卷的定义
  - name: foo   #卷的名字这个名字自定义
    secret:    #卷是直接使用的secret。
      secretName: mysecret   #调用刚才定义的secret
      
创建:
[root@kub-k8s-master prome]# kubectl apply -f pod_use_secret.yaml 
pod/mypod created
[root@kub-k8s-master prome]# kubectl exec -it mypod /bin/bash
root@mypod:/data# cd /etc/foo/
root@mypod:/etc/foo# ls
password  username
root@mypod:/etc/foo# cat password 
1f2d1e2e67df
结果中看到,保存在 Etcd 里的用户名和密码信息,已经以文件的形式出现在了容器的 Volume 目录里。
而这个文件的名字,就是 kubectl create secret 指定的 Key,或者说是 Secret 对象的 data 字段指定的 Key。 
每一个被引用的Secret都要在spec.volumes中定义
 如果Pod中的多个容器都要引用这个Secret那么每一个容器定义中都要指定自己的volumeMounts,但是Pod定义中声明一次spec.volumes就好了。 

以环境变量的形式使用Secret

[root@kub-k8s-master prome]# vim pod_use_secret.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: testredis
    image: daocloud.io/library/redis
    env:  #定义环境变量
     - name: SECRET_USERNAME   #创建新的环境变量名称
       valueFrom:
        secretKeyRef:     #调用的key是什么
         name: mysecret       #变量的值来自于mysecret
         key: username       #username里面的值

2.创建使用secret的pod容器
[root@kub-k8s-master prome]# kubectl apply -f pod_use_secret.yaml 
pod/mypod created
3.连接
[root@kub-k8s-master prome]# kubectl exec -it mypod /bin/bash 
root@mypod:/data# echo $SECRET_USERNAME   #打印一下定义的变量
xiaoming 

secret使用案例-mysql:

1.创建数据库用户的密码secret
[root@master test]# echo -n 'QianFeng@123!' | base64
UWlhbkZlbmdAMTIzIQ==
[root@master test]# cat secret.yml 
apiVersion: v1
kind: Secret
metadata:
 name: mysql-secret
type: Opaque
data:
 password: UWlhbkZlbmdAMTIzIQ==
 
[root@master test]# kubectl apply -f secret.yml

2.创建数据库并使用secret
[root@master test]# cat myslq.yaml 
apiVersion: v1
kind: Pod
metadata:
 name: my-mysql
spec:
 containers:
 - name: mysql
   image: daocloud.io/library/mysql:5.7
   ports:
    - containerPort: 3306
   env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
       secretKeyRef:
        name: mysql-secret
        key: password
[root@master test]# kubectl apply -f myslq.yaml
[root@master test]# kubectl get pod -o wide 
NAME       READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
my-mysql   1/1     Running   0          2m47s   10.244.2.13   node2   <none>           <none>

测试:
[root@master test]# mysql -uroot -p'QianFeng@123!' -h 10.244.2.13 -P3306
k8s配置harbor仓库
192.168.116.141  harbor  --安装harbor仓库

1.首先在集群中的每个节点上配置登陆harbor仓库的地址

[root@master ~]# cat /etc/docker/daemon.json 
{
"insecure-registries": ["192.168.116.141"]
}

[root@node1 ~]# cat /etc/docker/daemon.json 
{
"insecure-registries": ["192.168.116.141"]
}

[root@node2 ~]# cat /etc/docker/daemon.json 
{
"insecure-registries": ["192.168.116.141"]
}

# systemctl restart docker

测试上传镜像

配置k8s集群连接harbor的认证secret

核心思路:拉取私有仓库镜像需要配置私有仓库的登陆信息,用Secret存储,并且定义Deployment或者Pod时,指定imagePullSecret为保存了私有仓库登陆信息的Secret名。

如果使用docker login登陆过私有仓库,那么可以直接使用.docker/config.json文件生成Secret

查看master上面认证的密钥文件
[root@master yaml]# cat /root/.docker/config.json 
{
	"auths": {
		"192.168.116.141": {
			"auth": "YWRtaW46SGFyYm9yMTIzNDU="
		}
	}
}

将密钥文件进行base64的加密
[root@master yaml]# cat /root/.docker/config.json | base64 -w 0
ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjExNi4xNDEiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=

创建k8s连接harbor的secret
#注意:
Secret的data项目key是.dockerconfigjson;
.docker/config.json文件BASE64编码,然后粘贴到data[".dockerconfigjson"]。不要有换行
Secret type必须是kubernetes.io/dockerconfigjson;

[root@master yaml]# cat harbor-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
 name: harbor-login
type: kubernetes.io/dockerconfigjson
data:
 .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjExNi4xNDEiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=
  
[root@master yaml]# kubectl apply -f harbor-secret.yaml 
secret/harbor-login created

查看
[root@master yaml]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-zdkzq   kubernetes.io/service-account-token   3      10h
harbor-login          kubernetes.io/dockerconfigjson        1      18s

测试–创建一个nginx的应用

[root@master yaml]# vim nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
 name: nginx-web
spec:
 containers:
  - name: nginx-1
    image: 192.168.116.141/nginx/nginx:v1.1 #指定镜像仓库地址
 imagePullSecrets:  #指定使用的harbor仓库的secret
  - name: harbor-login

[root@master yaml]# kubectl apply -f nginx-pod.yaml 
pod/nginx-web created

查看
[root@master yaml]# kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
nginx-web   1/1     Running   0          2m47s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值