1Secret介绍

用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了。

注意,数据要进行 Base64 编码。Base64 工具

Secret有三种类型

  • Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
  • Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
  • kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证信息。

1.Opaque类型

Opaque 类型的数据是一个 map 类型,要求value是base64编码。
手动创建base64加密

  1. $ echo -n 'root' | base64
  2. cm9vdA==
  3. $ echo -n '123456' | base64
  4. MTIzNDU2

secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mongo-secret
  namespace: demo
type: Opaque
data:
  mongo-username: cm9vdA==
  mongo-password: MTIzNDU2

# 应用
$ kubectl apply -f secret.yaml

# 查看
$ kubectl get secret mongo-secret -n demo -o yaml
apiVersion: v1
data:
  mongo-password: MTIzNDU2
  mongo-username: cm9vdA==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"mongo-password":"MTIzNDU2","mongo-username":"cm9vdA=="},"kind":"Secret","metadata":{"annotations":{},"name":"mongo-secret","namespace":"demo"},"type":"Opaque"}
  creationTimestamp: "2022-07-05T09:45:55Z"
  name: mongo-secret
  namespace: demo
  resourceVersion: "601756"
  uid: 94da4682-50d6-44ee-9253-47b8456de9a4
type: Opaque

使用方法:作为环境变量使用
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
  namespace: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4.6
          # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
          imagePullPolicy: IfNotPresent
          env:
          - name: MONGO_INITDB_ROOT_USERNAME
            valueFrom:
              secretKeyRef:
                name: mongo-secret
                key: mongo-username
          - name: MONGO_INITDB_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mongo-secret
                key: mongo-password
          # Secret 的所有数据定义为容器的环境变量,Secret 中的键名称为 Pod 中的环境变量名称
          # envFrom:
          # - secretRef:
          #     name: mongo-secret
          volumeMounts:
            - mountPath: /data/db
              name: mongo-data
            - mountPath: /etc/localtime
              name: times
      volumes:
        - name: times
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
  volumeClaimTemplates:
  - metadata:
      name: mongo-data
      namespace: demo
    spec:
      accessModes: ["ReadWriteMany"]
      storageClassName: nfs-client
      resources:
        requests:
          storage: 10Gi
---
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: mongo
  name: mongo
  namespace: demo
spec:
  type: NodePort
  ports:
    - name: web
      port: 27017
      targetPort: 27017
      nodePort: 30017
  selector:
    k8s-app: mongo

2.Service Account类型

Service Account 对象的作用,就是 Kubernetes 系统内置的一种“服务账户”,它是 Kubernetes 进行权限分配的对象。比如, Service Account A,可以只被允许对 Kubernetes API 进行 GET 操作,而 Service Account B,则可以有 Kubernetes API 的所有操作权限。

3.kubernetes.io/dockerconfigjson类型

用来创建用户docker registry认证的Secret,直接使用kubectl create命令创建即可,如下:

$ kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL -n demo

$ kubectl get secret -n demo | grep myregistry
myregistry            kubernetes.io/dockerconfigjson        1      12s

如果我们需要拉取私有仓库中的docker镜像的话就需要使用到上面的myregistry这个Secret:

apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
  - name: foo
    image: 192.168.1.100:5000/test:v1
  imagePullSecrets:
  - name: myregistry