1. ConfigMap
在 Kubernetes 中,ConfigMap 是一个用于管理应用程序配置数据的 API 对象。它允许你将配置数据(如配置文件、环境变量、命令行参数等)与容器镜像分离,从而提高应用的可移植性和灵活性。ConfigMap 可以被 Pod 直接使用,而无需将配置信息硬编码到镜像中。一般用于存储非敏感信息(如键值对、配置文件或JSON数据等)。
ConfigMap可以通过三种方式进行配置数据的注入
- 环境变量注入:将配置数据注入到Pod中的容器环境变量中。
- 配置文件注入:将配置数据注入搭配Pod中的容器文件系统中,容器可以读取这些文件。
- 将配置数据注入到容器的命令行中。
优点
- 避免了硬代码,将配置数据与应用代码分离。
- 便于维护更新,可以单独修改ConfigMap而不需要重新构建镜像。
- 可以通过多种方式注入配置数据,更加灵活。
- 可以通过k8s的自动化机制对ConfigMap进行版本控制和回滚。
- ConfigMap可以被多个Pod共享,减少配置数据的重复存储。
1.1示例
#创建redis.conf
vim redis.conf
daemonize yes
requirepass 123456
#创建redis并使用redis.conf的配置
kubectl create configmap redis-config --from-file=redis.conf
#查看cm
kubectl get configmap
#查看资源清单,验证 ConfigMap
kubectl get configmap redis-config -o yaml
#创建Redis Deployment
vim redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7.0
command: ["redis-server", "/etc/redis/redis.conf"] # 指定使用自定义配置文件
ports:
- containerPort: 6379
volumeMounts:
- name: redis-config-volume
mountPath: /etc/redis # 配置文件挂载路径
- name: redis-data-volume
mountPath: /data # 数据存储路径
volumes:
- name: redis-config-volume
configMap:
name: redis-config # 引用 ConfigMap
- name: redis-data-volume
emptyDir: {} # 临时存储(生产环境建议使用 PVC)
#部署Redis Deployment
kubectl apply -f redis-deployment.yaml
验证 Redis 配置
kubectl exec -it <redis-pod-name> -- sh
# 查看配置文件
cat /etc/redis/redis.conf
# 退出容器
exit
#修改configMap配置
kubectl edit cm redis-config
#将密码修改为654321
注意:虽然容器里面修改了,但是正在运行的pod还未生效
解决方法:
执行命令kubectl rollout restart deployment/redis
此命令会重建 Pod,确保新的 ConfigMap 内容被加载。
2. Secret
在 Kubernetes 中,Secret 是一种用于存储敏感信息(如密码、令牌、证书等)的资源对象。它允许你在不暴露敏感信息的情况下,将这些数据提供给Pod使用。Secret 的值以 base64 编码的形式存储,确保了数据的安全性。
Secret 的类型
Kubernetes 支持多种类型的 Secret:
- Opaque:用于存储任意二进制数据(默认类型)。
- kubernetes.io/dockerconfigjson:用于存储 Docker 配置(如镜像拉取凭证)。
- kubernetes.io/tls:用于存储 TLS 证书和密钥。
- 其他第三方类型:如用于存储 SSH 密钥等。
示例
2.1 通过命令行创建 Secret
#mysql-root-password:MySQL 的 root 用户密码
#mysql-password:普通用户(可选)的密码
kubectl create secret generic mysql-secret \
--from-literal=mysql-root-password=lyw123456 \
--from-literal=mysql-password=lyw654321
#验证 Secret
kubectl get secret mysql-secret -o yaml
#yaml文件创建示例
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
mysql-root-password: bHl3MTIzNDU2 # "your-root-password" 的 base64 编码
mysql-password: bHl3NjU0MzIx # "your-user-password" 的 base64 编码
2.2 创建PV和PVC(可选)
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
storageClassName: nfs # 必须与 PVC 的 storageClassName 一致
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
server: 10.10.2.242
path: /home/nfs/01
kubectl apply -f my-pv.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi # 不超过 PV 的容量(10Gi)
storageClassName: nfs # 必须与 PV 的 storageClassName 一致
kubectl apply -f mysql-pvc.yaml
2.3 创建 MySQL Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
# 从 Secret 中获取 root 密码
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
# 可选:创建普通用户和密码
- name: MYSQL_USER
value: "myuser"
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-password
- name: MYSQL_DATABASE
value: "mydb"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumes:
# 持久化存储(如果使用 emptyDir,则替换为 emptyDir: {})
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
2.4 创建 Service 暴露 MySQL
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
type: ClusterIP # 仅限集群内部访问
2.5 进入 MySQL 容器测试连接
# 进入 MySQL Pod 的 Shell
kubectl exec -it mysql-d9bf965b9-9ct8s -- bash
# 在容器内使用 root 用户登录 MySQL
mysql -u root -plyw123456
# 执行 SQL 命令验证数据库和用户
SHOW DATABASES; # 应看到 mydb
SELECT user FROM mysql.user; # 应看到 root 和 myuser
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。