K8S笔记-ConfigMap

背景

在使用容器部署时,每次修改配置文件都需要重新构建镜像。当然你也可能会说,我的配置文件很稳定不需要修改,但你又如何确保配置文件中一些机密配置的安全问题呢?比如暴露了你的远程数据库的连接信息。

ConfigMap/Secret

K8S中引入了ConfigMap/Secret来存储配置数据,分别用于存储非敏感信息和敏感信息。其目的在于将应用和配置解耦,以确保容器化应用程序的可移植性。

创建 ConfigMap

ConfigMap的创建很简单,一句命令就可以直接将配置文件(appsettings.json)转换为ConfigMap。 可以通过指定--from-file来从指定文件/目录创建。 Examples:

通过一个目录创建
kubectl create configmap my-config --from-file=path/to/bar    
       
通过文件创建,带特殊的key(从文件创建ConfigMap时,可以不指定Key,默认会以文件名为Key。)
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt

通过env file文件创建
kubectl create configmap my-config --from-env-file=path/to/bar.env    

删除configmap
kubectl delete configmap appsettings -n demo
  1. 先来尝试将appsettings.json转换为ConfigMap:
cd K8S.NETCore.ConfigMap

kubectl create namespace demo

kubectl create configmap appsettings --from-file=appsettings.json=./appsettings.json -n demo

kubectl get configmap appsettings -n demo -o yaml    #查看刚刚创建的configmap,-o指定输出的格式。-n变量指定configmap创建到哪个namespace下

应用 ConfigMap

ConfigMap的应用很简单,只需要将configmap挂载到容器内的独立目录即可。 如果我们需要把ConfigMap挂载到容器中的/app目录下。我们来新建一个configmap-deploy.yaml文件配置如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: k8s-configmap-demo
spec:
  selector:
    matchLabels:
      app: k8s-configmap-demo
  template:
    metadata:
      labels:
        app: k8s-configmap-demo
    spec:
      containers:
      - name: k8s-configmap-demo
        image: k8s.netcore.configmap:dev 
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
        volumeMounts:
          - mountPath: /app/appsettings.json
            name: test
            readOnly: true
            subPath: appsettings.json
          - mountPath: /app/appsettings.Development.json
            name: test
            readOnly: true
            subPath: appsettings.Development.json         
      volumes:
      - configMap:
          defaultMode: 420
          name: appsettings
        name: test  

这里有必要解释两个参数:

volumes:-configMap:指定引用哪个ConfigMap volumeMounts:用来指定将ConfigMap中的配置挂载到容器的哪个路径 subPath:用来指定引用ConfigMap的哪个配置节点。

创建Deployment之前先修改下ConfigMap的配置,以方便确认最终成功从ConfigMap挂载配置。将Logging:LogLevel:Default:节点的默认值改为Error。

kubectl edit configmap appsettings -n demo 修改完毕后,执行后续命令来创建Deployment,并验证。

创建deployment
kubectl apply -f .k8s-deploy.yaml -n demo

获取创建的pod
kubectl get pods -n demo

进入pod内部
kubectl exec -it k8s-configmap-demo-7cfbdfff67-xdrcx /bin/bash -n demo

查看配置文件,默认的配置项已被ConfigMap的配置覆盖。
cat appsettings.json

热更新

以Volume方式挂载的ConfigMap支持热更新(大概需要10s左右)。但一种情况例外,就是指定subPath的情况下,更新ConfigMap,容器中挂载的ConfigMap是不会自动更新的。 对于这种情况,也很好处理,将ConfigMap挂载到/app目录下一个单独目录就好,比如挂载到/app/config目录,然后修改配置文件的加载路径即可。

hostBuilder.ConfigureAppConfiguration((context, builder) =>
{
    builder.SetBasePath(Path.Join(AppContext.BaseDirectory, "config"))
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true, true);
});

参考:https://www.jianshu.com/p/65c2d0212264

原文地址:https://www.cnblogs.com/fanfan-90/p/13456560.html