管理应用程序配置
769字约3分钟
2024-09-29
ConfigMap
创建ConfigMap后,数据实际会存储在K8s中Etcd,然后通过创建Pod时引用该数据。
应用场景:应用程序配置
Pod使用configmap数据有两种方式:
- 变量注入 
- 数据卷挂载 
两种数据类型:
- 键值 
- 多行数据 
#解释
apiVersion: v1
kind: Pod
metadata:
  #pod的名字
  name: configmap-demo-pod   
spec:
  containers:
    - name: demo
      image: alpine
      #用进程夯筑容器不让它退出
      command: ["sleep", "3600"]   
      env:
        # 定义环境变量
        # 请注意这里和 ConfigMap中的键名是不一样的(自定义键的名字)
        - name: ABC 
          valueFrom:
            configMapKeyRef:
              # 这个值来自 ConfigMa(comfigmap的名字)
              name: configmap-demo     
              # 需要取值的键          
              key: abc                       
        - name: CDE
          valueFrom:
            configMapKeyRef:
              name: configmap-demo
              key: cde
      volumeMounts:
      #引用下面数据卷的名字
      - name: config     
        #挂载到容器中哪个目录下(一般是指你的应用程序配置文件存放目录)
        mountPath: "/config"            
        readOnly: true
  volumes:
    # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
    - name: config     #数据卷的名字
      configMap:
        # 提供你想要挂载的 ConfigMap 的名字
        name: configmap-demo
        # 来自 ConfigMap 的一组键,将被创建为文件
        items:
        - key: "redis.properties"     
          path: "redis.properties"   #挂载到/config目录下的文件名vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-demo
data:
  abc: "123"
  cde: "456"
  redis.properties: |
    port: 6379
    host: 192.168.0.11vim configmap-demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: nginx
      env:
        - name: ABC
          valueFrom:
            configMapKeyRef:
              name: configmap-demo
              key: abc
        - name: CDE
          valueFrom:
            configMapKeyRef:
              name: configmap-demo
              key: cde
      volumeMounts:
      - name: config
        mountPath: "/config"
        readOnly: true
  volumes:
    - name: config
      configMap:
        name: configmap-demo
        items:
        - key: "redis.properties"
          path: "redis.properties"验证查看
kubectl apply -f configmap.yaml
kubectl apply -f configmap-demo-pod.yaml 
kubectl get configmaps 
kubectl exec -it configmap-demo-pod -- bash   #进入pod中测试是否注入变量和挂载
#echo $ABC
#echo $CDE
#ls /config/参考链接:https://kubernetes.io/zh/docs/concepts/configuration/configmap/
Secret
与ConfigMap类似,区别在于Secret主要存储敏感数据,所有的数据要经过base64编码。
应用场景:凭据
kubectl create secret 支持三种数据类型:
- docker-registry(kubernetes.io/dockerconfigjson):存储镜像仓库认证信息 
- generic(Opaque):存储密码、密钥等 
- tls(kubernetes.io/tls):存储TLS证书 
Pod使用Secret数据与ConfigMap方式一样。
第一步:将用户名密码进行编码
[root@k8s-node1 ~]# echo -n 'admin' |base64 
YWRtaW4=
[root@k8s-node1 ~]# echo -n '123.com' |base64 
MTIzLmNvbQ==第二步:将编码后值放到Secret
vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-user-pass
type: Opaque
data:
  username: YWRtaW4=
  password: MTIzLmNvbQ==vim secret-demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-demo-pod
spec:
  containers:
  - name: demo
    image: nginx
    env:
    - name: USER
      valueFrom:
        secretKeyRef:
          name: db-user-pass
          key: username
    - name: PASS
      valueFrom:
        secretKeyRef:
          name: db-user-pass
          key: password
    volumeMounts:
    - name: config
      mountPath: "/config"
      readOnly: true
  volumes:
  - name: config
    secret:
      secretName: db-user-pass
      items:
      - key: username
        path: my-username
      - key: password
        path: my-password验证查看
kubectl apply -f secret.yaml 
kubectl apply -f secret-demo-pod.yaml 
kubectl get secrets 
kubectl exec -it secret-demo-pod -- bash     #进入pod中测试是否注入变量和挂载
#echo $USER
#echo $PASS 
#ls /config/参考链接:https://kubernetes.io/zh/docs/concepts/configuration/secret/
应用程序如何动态更新配置
应用程序动态更新配置方案:
- 当ConfigMap发生变更时,应用程序自动感知动态加载(需要程序自身支持) 
- 触发滚动更新,即重启服务 
