🏆 Secret

secret对象类型用来保存铭感信息、密码什么的,它是一种少量包含敏感信息的对象

注意:

kubernetes Secret默认情况下存储为 base64编码的,非加密的字符串。默认情况下,能够访问 API的任何人、或者能够访问 Kubernetes下层数据存储(ETCD)的任何人都可以以明文形式读取这些数据,为了安全要启动静态加密;启用或配 RBAC规则来限制对 Secret的读写操作。要注意、任何被允许创建 Pod的人都默认地具有读取 Secret的权限

🌟 Secret 概览

要使用 Secret,Pod 需要引用 Secret。 Pod 可以用三种方式之一来使用 Secret:

Secret 对象的名称必须是合法的 DNS 子域名。 在为创建 Secret 编写配置文件时,你可以设置 data 与/或 stringData 字段。 datastringData 字段都是可选的。data 字段中所有键值都必须是 base64 编码的字符串。如果不希望执行这种 base64 字符串的转换操作,你可以选择设置 stringData 字段,其中可以使用任何字符串作为其取值。

🌟 sercet的类型

在创建 Secret 对象时,你可以使用 Secret 资源的 type 字段,或者与其等价的 kubectl 命令行参(如果有的话)为其设置类型。 Secret 的类型用来帮助编写程序处理 Secret 数据。

内置类型 用法
Opaque 用户定义的任意数据
kubernetes.io/service-account-token 服务账号令牌
kubernetes.io/dockercfg ~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson ~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth 用于基本身份认证的凭据
kubernetes.io/ssh-auth 用于 SSH 身份认证的凭据
kubernetes.io/tls 用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token 启动引导令牌数据

如果 type字段为空则默认为 opaque

🌟 Opaque secret

1️⃣ 通过命令行创建

[root@master ~]# kubectl create secret generic secret-test1
secret/secret-test1 created
[root@master ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-j5z7h   kubernetes.io/service-account-token   3      3d17h
secret-test1          Opaque                                0      14s

data为0就代表创建了一个空的Secret

2️⃣ 查看secret

[root@master ~]# kubectl get secret  secret-test1 -o yaml
apiVersion: v1
kind: Secret
metadata:
  creationTimestamp: "2021-08-24T02:22:37Z"
  name: secret-test1
  namespace: default
  resourceVersion: "204083"
  selfLink: /api/v1/namespaces/default/secrets/secret-test1
  uid: f1cd2b14-4dd9-410b-8714-87f55983a3f7
type: Opaque

3️⃣使用yaml文件创建

##Opaque类型的数据是一个Map类型,要求Value是base64编码
##先转换
[root@master ~]# echo "tom" | base64
dG9tCg==
[root@master ~]# echo "you" | base64
eW91Cg==
[root@master secret]# cat sercret-test1.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: secret-test1
type: Opaque
data:
  name: dG9tCg==
  like: eW91Cg==
[root@master secret]# kubectl create -f sercret-test1.yaml 
secret/secret-test1 created


##查看
[root@master secret]# kubectl get secret 
NAME                  TYPE                                  DATA   AGE
secret-test1          //-·
Opaque                                2      49s

4️⃣ 将secret挂载到Volume中

[root@master secret]# cat sercret-volume.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: secret-pod-test2
spec:
  volumes: 
  - name: secret-volume
    secret:
       secretName: secret-test1
  containers:
  - image: centos
    name: test
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: secret-volume
      mountPath: /opt/secret-volume
      readOnly: true
    command: ["sh","-c","sleep 700s;"]

[root@master secret]# kubectl exec -it secret-pod-test2 /bin/bash


[root@secret-pod-test2 secret-volume]# ls
like  name
[root@secret-pod-test2 secret-volume]# cat like 
you
[root@secret-pod-test2 secret-volume]# cat name 
tom

5️⃣ secret导入到容器的环境变量中

[root@master secret]# cat env-secret-test3.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: secret-test-deployment
spec:
  replicas: 3 
  selector:
    matchLabels:
      app: secret
  template:
    metadata:
      labels:
        app: secret
    spec:
      containers:
      - image: centos
        name: test2
        imagePullPolicy: IfNotPresent
        command: ["sh","-c","sleep 700;"]
        env:
        - name: LIKE
          valueFrom:
            secretKeyRef: 
              name: secret-test1
              key: like
          

[root@master secret]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
secret-pod-test2                          1/1     Running   2          30m
secret-test-deployment-54bdf6cc9f-49vmp   1/1     Running   0          32s
secret-test-deployment-54bdf6cc9f-nlln2   1/1     Running   0          32s
secret-test-deployment-54bdf6cc9f-pl6xt   1/1     Running   0          32s

[root@master secret]# kubectl exec -it secret-test-deployment-54bdf6cc9f-49vmp -- sh -c "env"
HOSTNAME=secret-test-deployment-54bdf6cc9f-49vmp
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
PWD=/
HOME=/root
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
LIKE=you

TERM=xterm
SHLVL=1
KUBERNETES_SERVICE_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_SERVICE_HOST=10.96.0.1
_=/usr/bin/env
         

🌟kubernetes.io dockerconfigjson

使用Kuberctl创建docker registry认证的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.
在创建Pod的时候,通过imagePul1Secrets 来引用刚创建的、 myregistrykey'
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
name: foo
image: roc/ awangyang:v1
imagePullSecrets:
name: myregistrykey