ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # Secret管理敏感信息 Secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 Secret有三种类型: * **Service Account**用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中 * **Opaque**base64编码格式的Secret,用来存储密码、密钥等 * **kubernetes.io/dockerconfigjson**用来存储私有docker registry的认证信息 ## Opaque Secret Opaque类型的数据是一个map类型,要求value是base64编码格式 创建base64文本 ~~~ echo -n "admin" | base64 YWRtaW4= echo -n "1f2d1e2e67df" | base64 MWYyZDFlMmU2N2Rm ~~~ 创建 secrets.yml 文件 ~~~ apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm ~~~ ~~~ kubectl create -f secrets.yml ~~~ ![](https://img.kancloud.cn/0a/cd/0acdd8bc8011350fc04206f19fb124ae_612x75.png) 创建好secret之后,有两种方式来使用它: * 以Volume方式 * 以环境变量方式 #### 将Secret挂载到Volume字段中 继续拿之前 http 测试时候的镜像来做实验 ~~~ apiVersion: v1 kind: Pod metadata: labels: name: secret-test name: secret-test spec: volumes: - name: secrets secret: secretName: mysecret containers: - image: registry.cn-shenzhen.aliyuncs.com/zwh-kubea/http:v1 name: secret-test volumeMounts: - name: secrets mountPath: "/etc/secrets" readOnly: true ~~~ ![](https://img.kancloud.cn/2f/e5/2fe5187e4f44271ced5c75241823c105_538x124.png) 进入到 Pod 内,进行验证 ![](https://img.kancloud.cn/ad/97/ad97115dd976ae1a97226c4611f14179_672x231.png) ##### 小结 通过 Volume 的方式,会在指定挂载的 Pod 目录下,生成包含密码的文件,直接读取就行 #### 通过环境变量导入 继续拿之前 http 测试时候的镜像来做实验 ~~~ apiVersion: extensions/v1beta1 kind: Deployment metadata: name: secrets-deployment spec: replicas: 2 strategy: type: RollingUpdate #滚动升级的方式 template: metadata: labels: app: secrets spec: containers: - name: http-secret image: registry.cn-shenzhen.aliyuncs.com/zwh-kubea/http:v1 env: - name: MYSECRET_USER valueFrom: secretKeyRef: name: mysecret key: username - name: MYSECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password ~~~ ![](https://img.kancloud.cn/f2/12/f21246e6205c43ea99c15d1075410572_587x156.png) 查看环境变量 ![](https://img.kancloud.cn/18/67/186769856a5c77ed4bf6dce85848cb78_602x85.png) ## kubernetes.io/dockerconfigjson 可以直接用kubectl命令来创建用于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 ~~~ 也可以直接读取`~/.docker/config.json`的内容来创建: ~~~ $ cat ~/.docker/config.json | base64 $ cat > myregistrykey.yaml <<EOF apiVersion: v1 kind: Secret metadata: name: myregistrykey data: .dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== type: kubernetes.io/dockerconfigjson EOF $ kubectl create -f myregistrykey.yaml ~~~ 在创建Pod的时候,通过imagePullSecrets来引用刚创建的myregistrykey: ~~~ apiVersion: v1 kind: Pod metadata: name: foo spec: containers: - name: foo image: janedoe/awesomeapp:v1 imagePullSecrets: - name: myregistrykey ~~~ ## Service Account Service Account用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中。 ~~~ $ kubectl run nginx --image nginx deployment "nginx" created $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-3137573019-md1u2 1/1 Running 0 13s $ kubectl exec nginx-3137573019-md1u2 ls /run/secrets/kubernetes.io/serviceaccount ca.crt namespace token ~~~