ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 1. 作用 > k8s secret用于存储密码、秘钥等敏感信息,将加密信息存储到etcd中,有三种实现形式 **1. Opaque** base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。Opaque 类型的数据是一个 map 类型,要求value是base64编码。 > 手动创建base64加密 ``` $ echo -n 'admin' | base64 YWRtaW4= ``` ``` $ echo -n '1f2d1e2e67df' | base64 MWYyZDFlMmU2N2Rm ``` 解密 ``` $ echo 'MWYyZDFlMmU2N2Rm' | base64 --decode 1f2d1e2e67df ``` 这里需要注意的是,像这样创建的 Secret 对象,它里面的内容仅仅是经过了转码,而并没有被加密。在真正的生产环境中,你需要在 Kubernetes 中开启 Secret 的加密插件,增强数据的安全性。 **2. Service Account** > 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 **/run/secrets/kubernetes.io/serviceaccount** 目录中。 > Service Account是k8s的一种账户,用于访问Api server时候进行登录和鉴权 **3. kubernetes.io/dockerconfigjson** 用来存储私有docker registry的认证信息。如果想要访问私有镜像仓库 `kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL` ``` apiVersion: v1 kind: Pod metadata: name: foo spec: containers: - name: foo image: 192.168.1.100:5000/test:v1 imagePullSecrets: - name: myregistry ``` # 2. 创建 ## 2.1 通过命令创建 `kubectl create secret` **1. 本地文件** user.txt和password.txt文件内容如下: ``` [root@master secretDir]# echo 'admin' > user.txt [root@master secretDir]# echo 'admin' > password.txt [root@master secretDir]# kubectl create secret generic user --from-file=./user.txt secret/user created [root@master secretDir]# kubectl create secret generic pass --from-file=./password.txt secret/pass created [root@master secretDir]# kubectl get secret NAME TYPE DATA AGE default-token-fb8rp kubernetes.io/service-account-token 3 8d pass Opaque 1 33s user Opaque 1 54s [root@master secretDir]# ``` **2. literal(键值对)** ``` $ kubectl create secret generic user --from-literal=username=admin $ kubectl create secret generic pass --from-literal=password=1f2d1e2e67df ``` **3. 通过yaml文件创建** #secret.yaml ``` apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: user: YWRtaW4= pass: MWYyZDFlMmU2N2Rm ``` > 注:通过yaml创建Opaque类型的Secret值需要base64编码 创建secret `kubectl create -f secret.yaml` # 3. 使用 ## 3.1 通过Volume挂载的方式 ``` #test-projected-volume.yaml apiVersion: v1 kind: Pod metadata: name: test-projected-volume spec: containers: - name: test-secret-volume image: busybox args: - sleep - "86400" volumeMounts: - name: mysql-cred mountPath: "/projected-volume" readOnly: true volumes: - name: mysql-cred projected: sources: - secret: name: user - secret: name: pass ``` 创建pod对象 `$ kubectl create -f test-projected-volume.yaml` 当 Pod 变成 Running 状态之后,我们再验证一下这些 Secret 对象是不是已经在容器里了: ``` $ kubectl exec -it test-projected-volume -- /bin/sh $ ls /projected-volume/ user pass $ cat /projected-volume/user admin $ cat /projected-volume/pass 1f2d1e2e67df ``` ## 3.2 通过环境变量 ``` #pod-secret-env.yaml apiVersion: v1 kind: Pod metadata: name: pod-secret-env spec: containers: - name: myapp image: busybox args: - sleep - "86400" env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: user - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: pass restartPolicy: Never ``` 创建pod $kubectl create -f pod-secret-env.yaml pod运行成功后: $ kubectl exec -it pod-secret-env -- /bin/sh 进入容器中查看环境变量 不同点: Secret 可以被 ServerAccount 关联 Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像 Secret 支持 Base64 加密 Secret 分为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型,而 Configmap 不区分类型