目录

Service Account

Opaque Secret

Ⅰ、创建说明

Ⅱ、使用方式

1、将 Secret 挂载到 Volume 中

2、将 Secret 导出到环境变量中

kubernetes.io/dockerconfigjson


Secret 存在意义

Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret 可以以 Volume 或者环境变量的方式使用。也就意味着我们有一些密码被我们的pod去使用,完全可以先保存在我们的secret里面,然后在我们的pod运行的时候挂载进我们的pod即可。

Secret 有三种类型

Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中。

对于有些pod来说,它需要跟我们的kube-api进行交互,比如说,flannel,coredns,但是kube-api并不是谁都可以进行访问的,因为它是一切访问的入口,它的加密就是集群的加密,要是谁都可以进行访问的话,那就没有什么安全性可言了,所以对于pod来说,它的访问机制就是SA。

Opaque :base64编码格式的Secret,用来存储密码、密钥等。(容易破解,加密程度不高)

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

Service Account

Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的/run/secrets/kubernetes.io/serviceaccount 目录中,下面我们简单看一个之前创建好的pod。

[root@master1 ~]# kubectl get pod 
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-84ff5c99b6-hf4fw   1/1     Running   0          3h57m
[root@master1 ~]# kubectl exec -it my-nginx-84ff5c99b6-hf4fw -- sh 
/ # cd /run/secrets/kubernetes.io/serviceaccount/
/run/secrets/kubernetes.io/serviceaccount # ls -al 
total 0
drwxrwxrwt    3 root     root           140 Sep  4 07:49 .
drwxr-xr-x    3 root     root            28 Sep  4 07:49 ..
drwxr-xr-x    2 root     root           100 Sep  4 07:49 ..2021_09_04_07_49_29.238705065
lrwxrwxrwx    1 root     root            31 Sep  4 07:49 ..data -> ..2021_09_04_07_49_29.238705065
lrwxrwxrwx    1 root     root            13 Sep  4 07:49 ca.crt -> ..data/ca.crt
lrwxrwxrwx    1 root     root            16 Sep  4 07:49 namespace -> ..data/namespace
lrwxrwxrwx    1 root     root            12 Sep  4 07:49 token -> ..data/token
/run/secrets/kubernetes.io/serviceaccount #

ca.crt,namespace ,token 这三个才能够让我们的pod去访问当kube-apiserver

Opaque Secret

Ⅰ、创建说明

Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:

[root@master1 secret]# echo -n "admin"|base
base64    basename  
[root@master1 secret]# echo -n "admin"|base64 
YWRtaW4=
[root@master1 secret]# echo -n "1dsf251dsds"|base64 
MWRzZjI1MWRzZHM=
[root@master1 secret]# 
[root@master1 secret]# echo -n "YWRtaW4="|base64 -d    ##解码
admin[root@master1 secret]#

然后将我们上面创建的用户名和密码的加密之后保存至我们的secret。

secrets.yml

[root@master1 secret]# cat secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: MWRzZjI1MWRzZHM=
  username: YWRtaW4=
[root@master1 secret]# kubectl apply -f  secret.yaml 
secret/mysecret created
[root@master1 secret]#
[root@master1 secret]# kubectl get secrets 
NAME                  TYPE                                  DATA   AGE
basic-auth            Opaque                                1      6d3h
default-token-pd2hb   kubernetes.io/service-account-token   3      7d1h
mysecret              Opaque                                2      27s
tls-secret            kubernetes.io/tls                     2      6d3h
[root@master1 secret]#

分析:如果我们想要以“admin”和"1f2d1e2e67df"进行保存的话,要先以base64进行加密之后,再把加密值保存至secret中,下面就是如何使用

Ⅱ、使用方式

1、将 Secret 挂载到 Volume 中

[root@master1 secret]# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: seret-test
  name: seret-test
spec:
  volumes:
  - name: secrets
    secret:
      secretName: mysecret
  containers:
  - image: nginx:alpine
    name: db
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
[root@master1 secret]# 
[root@master1 secret]# kubectl apply -f  pod1.yaml
pod/seret-test created
[root@master1 secret]#
[root@master1 secret]# kubectl get pod 
NAME         READY   STATUS    RESTARTS   AGE
seret-test   1/1     Running   0          37s
[root@master1 secret]# kubectl exec -it seret-test -- sh 
/ # cd /etc/secrets/
/etc/secrets # ls
password  username
/etc/secrets # cat password 
1dsf251dsds/etc/secrets # 
/etc/secrets # cat username 
admin/etc/secrets # 

虽然以加密的方式导入pod中去了,但是在pod中还是会自动解密。

2、将 Secret 导出到环境变量中

比上面的那种稍微安全一点,其实跟之前的configmap的类似,就是声明一个env,通过valueFrom来赋值,把键名username和password分别赋值给变量TEST_USER和TEST_PASSWORD,这样的方式避免了以明文的方式去赋值。

[root@master1 secret]# kubectl apply -f  pod2.yaml
deployment.extensions/pod-deployment created
[root@master1 secret]# cat pod2.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: pod-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: pod-deployment
    spec:
      containers:
      - name: pod-1
        image: nginx:alpine
        ports:
        - containerPort: 80
        env:
        - name: TEST_USER
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: username
        - name: TEST_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: password
[root@master1 secret]#
[root@master1 secret]# kubectl get pod 
NAME                              READY   STATUS    RESTARTS   AGE
pod-deployment-5845fcb99f-fktr2   1/1     Running   0          2s
pod-deployment-5845fcb99f-qr46x   1/1     Running   0          2s
[root@master1 secret]# kubectl exec -it pod-deployment-5845fcb99f-fktr2 -- sh 
/ # 
/ # echo $TEST_USER
admin
/ # 
/ # echo $TEST_PASSWORD
1dsf251dsds
/ # 
/ # exit
[root@master1 secret]# 

kubernetes.io/dockerconfigjson

对于我们的私有仓库里面的镜像,我们如果没有认证的话就去访问就会出错,

如果我们想要对这些私有仓库进行认证的话,我们可以通过如下的方式,

使用 Kuberctl 创建 docker registry 认证的 secret:

[root@master1 secret]# kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret "myregistrykey" created.

分析:创建的类型为docker-registry,名称为myregistrykey。

后面的就是关键认证信息:

--docker-server=私有仓库地址  --docker-username=私有仓库的用户名  --docker-password=私有仓库的密码 --docker-email=用户邮箱

注意,要想使用这种自动认证方式的话,记得在我们的pod里面添加

[root@master1 secret]# cat  pod3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
    - name: foo
      image: nginx:alpine
  imagePullSecrets:
    - name: myregistrykey
[root@master1 secret]# 

ImagePullScerets 密码下载策略,如果我下载镜像的话,就会用到myregistrykey去进行认证。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐