Skip to content

Secret

说明

  1. Secret
  2. 与 ConfigMap 的用法类似,在 Pod 的 YAML 中可以将 Secret 设置为一个 Volume,然后在容器内通过 volumeMounts 将 Secret 类型的 Volume 挂载到指定目录下
  3. 以下以 Nginx 为例

配置

  1. 创建 Secret:my-secret.yaml

    shell
    cat > my-secret.yaml << EOF
    # https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/
    # 创建 Secret
    apiVersion: v1
    kind: Secret
    metadata:
      # Secret 名称
      # 注意:此处为冗余写法(相同命名空间、相同名称只会存在一个 Secret)
      name: my-secret
      # 命名空间
      # namespace: xuxiaowei-cloud
    # Secret 类型 Opaque 用于存储任何基于字节数组的数据
    type: Opaque
    data:
      # password:Secret 名称为 "my-secret",主键为 "password" 的值
      # 这里的值是经过 base64 编码处理的 MySQL root 用户密码,需要解码才能使用
      # xuxiaowei.com.cn 计算 base64 之后为 eHV4aWFvd2VpLmNvbS5jbg==
      password: eHV4aWFvd2VpLmNvbS5jbg==
    
    EOF
    
    cat my-secret.yaml
    
    kubectl apply -f my-secret.yaml
    
    kubectl get secret
  2. 使用 Secret:nginx-deployment-secret.yaml

    shell
    cat > nginx-deployment-secret.yaml << EOF
    # https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
    # 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      # Deployment 名称
      name: nginx-deployment-secret
      # 命名空间
      # namespace: xuxiaowei-cloud
    spec:
      selector:
        matchLabels:
          app: nginx-secret
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx-secret
        spec:
          containers:
            - name: nginx
              # https://hub.docker.com/_/nginx
              # Nginx 版本
              image: nginx:1.25.0
              ports:
                # 容器开放的端口号
                - containerPort: 80
              volumeMounts:
                # 挂载主机的时区文件
                - name: time-zone
                  mountPath: /etc/localtime
                # 引用 Secret 创建文件
                - name: foo
                  mountPath: /etc/foo
    
          # https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/
          # 配置挂载的数据卷
          volumes:
            # 挂载主机的时区文件
            - name: time-zone
              hostPath:
                path: /etc/localtime
            # 引用 Secret 创建文件
            - name: foo
              secret:
                secretName: my-secret
    
    ---
    
    # https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/
    # 创建 Service
    apiVersion: v1
    kind: Service
    metadata:
      # Service 名称
      name: nginx-service-secret
      # 命名空间
      # namespace: xuxiaowei-cloud
    spec:
      ports:
        # NodePort:集群外部对 Service 访问使用的端口(默认范围:30000~32767)
        # port:Service 内部的端口号
        # targetPort:暴露的 Deployment 中容器的端口号
        # protocol:端口协议,TCP 或 UDP
        # name:仅在存在多个配置时需要填写,如果填写,必须使用字符串(数字需要添加引号)
        - nodePort: 30081
          port: 80
          protocol: TCP
          targetPort: 80
      selector:
        # 将 Service 和 Deployment 关联起来
        app: nginx-secret
      # NodePort 会将该 Service 暴露到整个集群中的节点上,让外部客户端可以通过节点 IP + NodePort 的方式来访问该 Service
      # 还有 ClusterIP 和 LoadBalancer 类型,具体可参考文档
      type: NodePort
    
    EOF
    
    cat nginx-deployment-secret.yaml
    
    kubectl apply -f nginx-deployment-secret.yaml
    
    kubectl get pod
    kubectl get svc
  3. 测试效果

    1. 方法1:进入 pod 内部 kubectl exec -it nginx的pod名称 bash,查看 Secret
      1. cat /etc/foo/password
    2. 方法2:直接使用命令查看日志
      1. kubectl exec -it nginx的pod名称 -- cat /etc/foo/password