二、Kubernetes 配置管理 Secrets
·
2.1 Secrets 简介
官网: https://kubernetes.io/docs/concepts/configuration/secret/#creating-a-secret
Secrets 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在规约中或者镜像中。 使用 Secrets 意味着你不需要在应用程序代码中包含机密数据。由于创建 Secrets 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secrets(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secrets 采取额外的预防措施, 例如避免将机密数据写入非易失性存储。Secrets 类似于但专门用于保存机密数据。
2.2 Secrets 类型
- Opaque:通用型 Secret ,任意用户定义的数据;
- kubernetes.io/service-account-token:作用于 ServiceAccount,包含一个令牌,用于标识 API 服务账户;
- kubernetes.io/dockerconfigjson:下载私有仓库镜像使用的 Secret;
- kubernetes.io/tls:用于存储 HTTPS 域名证书文件的 Secret ,可以被 Ingress 使用。
2.3 Secrets 类型使用
2.3.1 Opaque 类型使用
# Step 1:命令行方式创建secret资源(以环境变量方式)
$ kubectl create secret generic mysql-secret \
--from-literal=MYSQL_ROOT_PASSWORD=root \
--from-literal=MYSQL_USER=maoxiansheng \
--from-literal=MYSQL_PASSWORD=maoxiansheng \
--dry-run=client -o yaml > mysql-secret.yaml
# Step 2:查看资源清单
$ cat mysql-secret.yaml
apiVersion: v1
data:
MYSQL_PASSWORD: bWFveGlhbnNoZW5n
MYSQL_ROOT_PASSWORD: cm9vdA==
MYSQL_USER: bWFveGlhbnNoZW5n
kind: Secret
metadata:
creationTimestamp: null
name: mysql-secret
# Step 3:查看变量值
$ echo bWFveGlhbnNoZW5n | base64 -d
maoxiansheng
# Step 4:创建资源
$ kubectl create -f mysql-secret.yaml
# Step 5:查看资源
$ kubectl get -f mysql-secret.yaml
NAME TYPE DATA AGE
mysql-secret Opaque 3 38s
# Step 6:创建Pod并注入环境变量(单个变量依次注入)
$ vim mysql-pods.yml
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-pods
spec:
containers:
- name: mysql
image: m.daocloud.io/docker.io/mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_PASSWORD
- name: MYSQL_DATABASE
value: maoxiansheng
# Step 7:创建Pod
$ kubectl create -f mysql-pods.yml
# Step 8:查看Pod内环境变量
$ kubectl exec mysql-pods -- env | grep MYSQL

# Step 9:创建Pod并注入环境变量(多个变量一次注入)
$ vim mysql-pod.yml
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: m.daocloud.io/docker.io/mysql:8.0
envFrom:
- secretRef:
name: mysql-secret
env:
- name: MYSQL_DATABASE
value: maoxiansheng
# Step 10:创建资源
$ kubectl create -f mysql-pod.yml
# Step 11:查看Pod内环境变量
$ kubectl exec mysql-pod -- env | grep MYSQL

2.3.2 dockerconfigjson 类型使用
# Step 1:命令行创建Secrets
$ kubectl create secret docker-registry myregistrykey \
--docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD \
--docker-email=DOCKER_EMAIL
# docker-registry:指定Secret的类型
# myregistrykey: Secret名称
# DOCKER_REGISTRY_SERVER:镜像仓库地址
# DOCKER_USER:镜像仓库用户名,需要有拉取镜像的权限
# DOCKER_PASSWORD:镜像仓库密码
# DOCKER_EMAIL:邮箱信息,可以为空
$ kubectl create secret docker-registry myregistrykey \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username="aliyun6412327368" \
--docker-password="maoxiansheng159" \
--docker-email="22364736365@qq.com"
# Step 2:创建资源清单
$ vim mysql-pod-imagePullSecrets.yml
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
# 添加一下配置参数:
imagePullSecrets:
- name: myregistrykey
containers:
- name: mysql
image: registry.cn-hangzhou.aliyuncs.com/hujiaming-01/mysql:1.0.0
envFrom:
- secretRef:
name: mysql-secret
env:
- name: MYSQL_DATABASE
value: maoxiansheng
# Step 3:创建资源
$ kubectl create -f mysql-pod-imagePullSecrets.yml
2.3.3 ConfigMap 和 Secret 挂载文件覆盖解决
当挂载文件到容器路径时,该容器挂载路径有其他文件会被全部覆盖掉只保留需要挂载的文件。subPath 就会只覆盖这一个文件,而 mountPath 不在指定路径,需要指定文件
#>>> 文件内容
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pods
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0
name: nginx
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/nginx.conf #挂载路径
subPath: nginx.conf # 挂载文件名称
readOnly: true # 只读方式挂载
volumes:
- name: nginxconf
configMap:
name: test-env
items: # 修改挂载容器中文件的名称
- key: nginxconf # 原ConfigMap配置文件的名称
path: nginx.conf # 挂载容器后的名称更多推荐



所有评论(0)