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

image.png

#修改configMap配置
kubectl edit cm redis-config 
#将密码修改为654321

image.png
image.png
注意:虽然容器里面修改了,但是正在运行的pod还未生效
image.png
解决方法:
执行命令kubectl rollout restart deployment/redis
此命令会重建 Pod,确保新的 ConfigMap 内容被加载。
image.png

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

image.png

#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
image.png

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

image.png
image.png

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  # 仅限集群内部访问

image.png

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

image.png


苦逼的小运维
1 声望1 粉丝