尝试编写deploy使用configmap以及serct进行重要消息存储的卷挂载

实践策划

  1. 目标设定
    • 在Kubernetes中使用ConfigMap和Secret存储重要的配置数据和敏感信息。
    • 将这些数据以卷的形式挂载到Pod中,使其在容器内可用。
    • 通过实际操作掌握如何管理和使用ConfigMap和Secret,并了解它们的权限控制和安全性。
    • 验证在容器内的读取和修改操作,以及了解ConfigMap和Secret的更新机制对Pod的影响。
  2. 内容规划
    • 创建ConfigMap和Secret资源。
    • 使用ConfigMap和Secret挂载卷到Pod中。
    • 验证挂载成功以及在容器内读取数据。
    • 测试ConfigMap和Secret的更新机制。
    • 讨论ConfigMap和Secret的最佳实践与安全管理。
创建命名空间
kubectl create namespace config-secret-practice

image-20240813102335321

创建ConfigMap
apiVersion: v1                # 指定Kubernetes API版本为v1
kind: ConfigMap # 定义资源类型为ConfigMap
metadata:
name: app-config # ConfigMap的名称
namespace: config-secret-practice # ConfigMap所在的命名空间
data:
config.json: | # 使用多行文本格式存储名为config.json的配置信息
{
"setting1": "value1", # JSON格式的配置,包含多个键值对
"setting2": "value2",
"setting3": "value3"
}
database_url: "mongodb://mongo-svc:27017" # 另一个键值对,存储数据库URL

image-20240813102910539

创建Secret
apiVersion: v1                # 指定Kubernetes API版本为v1
kind: Secret # 定义资源类型为Secret
metadata:
name: db-secret # Secret的名称
namespace: config-secret-practice # Secret所在的命名空间
type: Opaque # Secret的类型为Opaque,用于存储任意二进制数据或字符串
data:
db-password: bXlwYXNzd29yZA== # Base64编码的敏感信息,这里是数据库密码'mypassword'的编码形式

image-20240813103145177

创建deploy
apiVersion: apps/v1           # 定义API版本为apps/v1,这是Deployment的API组
kind: Deployment # 资源类型为Deployment
metadata:
name: app-deployment # Deployment的名称
namespace: config-secret-practice # Deployment所在的命名空间
spec:
replicas: 2 # 定义Pod副本的数量,设为2个
selector:
matchLabels: # 用于选择标签匹配的Pod
app: my-app # 这里定义标签app=my-app
template:
metadata:
labels:
app: my-app # Pod模板的标签,与selector中的标签匹配
spec:
containers:
- name: my-app-container # 容器名称
image: docker.m.daocloud.io/library/busybox # 容器使用的镜像,这里是busybox适合进行简单的命令执行
command: ["/bin/sh", "-c", "while true; do sleep 3600; done"] # 让容器保持运行,方便测试
volumeMounts: # 定义容器内的卷挂载
- name: config-volume # ConfigMap卷挂载的名称
mountPath: /etc/config # 挂载路径,容器内的文件系统路径
- name: secret-volume # Secret卷挂载的名称
mountPath: /etc/secret # 挂载路径,容器内的文件系统路径
env:
- name: DB_PASSWORD # 定义一个环境变量
valueFrom:
secretKeyRef: # 从Secret引用获取值
name: db-secret # Secret名称
key: db-password # Secret中的键,指向数据库密码
volumes:
- name: config-volume # 定义一个卷,来源于ConfigMap
configMap:
name: app-config # 关联的ConfigMap的名称
- name: secret-volume # 定义一个卷,来源于Secret
secret:
secretName: db-secret # 关联的Secret的名称

验证卷挂载

image-20240813104055190

查看环境变量

image-20240813104136482

修改configmap测试是否实时更新

image-20240813104806428

更新secret:
echo -n 'newpassword' | base64   # 使用echo命令和base64编码工具对新密码进行编码
kubectl apply -f db-secret.yaml # 重新应用Secret,以测试其在Pod中的更新

image-20240813105107739

这里为什么没有被修改到,因为secret作为环境变量时候需要重新启动pod

启动自动滚动更新

我们在deploy选项下面添加serect的optinal为true

image-20240813105622261

apply后直接

kubectl rollout status deployment/app-deployment -n config-secret-practice

image-20240813105934430

使用RBAC,限制对ConfigMap和Secret的访问
kubectl create serviceaccount app-user -n config-secret-practice
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: config-secret-practice
name: config-secret-role
rules:
- apiGroups: [""]
resources: ["configmaps", "secrets"]
resourceNames: ["app-config", "db-secret"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: config-secret-rolebinding
namespace: config-secret-practice
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: config-secret-role
subjects:
- kind: ServiceAccount
name: app-user
namespace: config-secret-practice
kubectl auth can-i get configmap/app-config --as=system:serviceaccount:config-secret-practice:app-user -n config-secret-practice

image-20240813110615550

使用一个带有serviceAccount的pod验证
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: config-secret-practice
spec:
serviceAccountName: app-user # 指定使用的ServiceAccount
containers:
- name: test-container
image: docker.m.daocloud.io/library/busybox
command: ["/bin/sh", "-c", "sleep 3600"] # 让容器保持运行