kubernetes配置中心

  • 在K8S中,有两种方式管理资源的配置,分别是configmap和secret,他们的最大区别是:
    • configmap用来管理明文配置
    • secret用来管理密文配置

configmap

  • **Configmap是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存 **
  • 我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。
    • Configmap是k8s中的资源, 相当于配置文件,可以有一个或者多个Configmap;
    • Configmap可以做成Volume,k8s pod启动之后,通过 volume 形式映射到容器内部指定目录上;
    • 容器中应用程序按照原有方式读取容器特定目录上的配置文件。
    • 在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

image.png

configmap的应用场景

  • 使用k8s部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,configmap可以将配置信息和docker镜像解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,可直接注入到Pod中给容器使用。configmap注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中
  • 使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用configmap可以友好的进行配置共享。

configmap的局限性

  • ConfigMap在设计上不是用来保存大量数据的。在ConfigMap中保存的数据不可超过1 MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数据库或者文件服务。

怎么使用configmap

  1. 创建configmap资源
  2. 在deploy中定义congfigmap类型的volumes
  3. 在deoloy的containers中挂载此volumes

configmap创建方法

命令行创建
# 直接在命令行中指定configmap参数创建,通过--from-literal指定参数
kubectl create configmap mysql-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
文件创建
# 通过指定文件创建一个configmap,--from-file=<文件>
# 定义一个key是www,值是nginx.conf中的内容
kubectl create configmap mysql-config --from-file=www=./nginx.conf
指定目录创建
# 指定目录创建configmap
kubectl create configmap mysql-config --from-file=/root/test-a/
编写configmap资源清单
# 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  master.cnf: |
    [mysqld]
    log-bin
    log_bin_trust_function_creators=1
    lower_case_table_names=1
  slave.cnf: |
    [mysqld]
    super-read-only
    log_bin_trust_function_creators=1

pod中引入configmap

volume挂载方式
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  labels:
    app: webserver
  name: webserver
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webserver
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: webserver
    spec:
      volumes:
      - name: config
        configMap:
          name: mysql-config
      containers:
      - image: nginx:1.21
        imagePullPolicy: IfNotPresent
        name: nginx
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d/
        resources: {}
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
环境变量引入方式:使用configMapKeyRef
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: busybox
  name: busybox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  strategy: {}
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - command:
        - sleep
        - "3600"
        image: busybox:1.28
        env: 
        - name: name
          valueFrom:
            configMapKeyRef:
              name: users
              key: name
        - name: pass
          valueFrom:
            configMapKeyRef:
              name: users
              key: pass
        - name: email
          valueFrom:
            configMapKeyRef:
              name: users
              key: email
        name: busybox
        resources: {}

更新configmap配置的方法

单配置更新法:
  1. 修改configmap资源清单并应用
  2. 重启使用该configmap资源的pod
多配置更换法:
  1. 准备多个configmap资源
  2. 修改dp中使用的configmap
  3. 重新apply该dp,pod会自动重启

相关命令

  • 查看默认命名空间下所有的configmaps
    • kubectl get configmaps
  • 查看指定configmap的内容
    • kubectl get configmap test-config -o yaml
  • 查看指定configmap的详细信息
    • kubectl describe configmap test-config
  • 删除configmap
    • 基于configmap文件删除
      • kubectl delete -f test-cfg.yml
    • 直接删除configmap对象
      • kubectl delete configmap test-config

使用ConfigMap的注意事项

  • configmap必须在pod之前创建
  • 只有与当前configmap在同一个namespace内的pod才能使用这个configmap
  • configmap如果发生变更,使用其的pod需要重启或重载
  • ** kubelet只支持可以被api server管理的pod使用configmap。kubelet在本地创建的静态pod将无法使用configmap**

Secret

  • Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。
  • 用户可以创建 secret,同时系统也创建了一些 secret。
  • 要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 pod 拉取镜像时使用

Secret 有三种类型:

  • Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到pod的/run/secrets/kubernetes.io/serviceaccount 目录中。
  • Opaque :是一个map结构(key-value),其中vlaue要求以base64格式编码,也称之为generic类型。以base64编码格式的Secret,用来存储密码、密钥等, **可以通过base64 --decode解码获得原始数据,因此安全性弱 **
  • tls:用于存放tls证书
  • ** dockerconfigjson** :专用于存放私有docker registry的认证信息,所以也称之为docker-registry类型

secret可选参数

secret可选参数有三种

  • generic: 通用类型,通常用于存储密码数据。
  • tls:此类型仅用于存储私钥和证书。
  • docker-registry: 若要保存docker仓库的认证信息的话,就必须使用此种类型来创建。

创建generic secert

命令行方式创建


kubectl create secret generic test-secret --from-literal=username='breeze',password='123456'

yaml文件方式创建

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: test-secret
  data:
    username: YnJlZXpl
    password: MTIzNDU2
kubectl create -f test-sec.yaml

使用generic secert

挂载使用

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  labels:
    app: webserver-secret
  name: webserver-secret
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webserver-secret
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: webserver-secret
    spec:
      volumes:
      - name: config
        secret:
          secretName: test-secret
      containers:
      - image: nginx:1.21
        imagePullPolicy: IfNotPresent
        name: nginx
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d/
        resources: {}
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

环境变量使用

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: busybox-secret
  name: busybox-secret
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox-secret
  strategy: {}
  template:
    metadata:
      labels:
        app: busybox-secret
    spec:
      containers:
      - command:
        - sleep
        - "3600"
        image: busybox:1.28
        env: 
        - name: name
          valueFrom:
            secretKeyRef:
              name: users
              key: user
        - name: pass
          valueFrom:
            secretKeyRef:
              name: users
              key: pass
        - name: email
          valueFrom:
            configMapKeyRef:
              name: users
              key: email
        name: busybox
        resources: {}

创建tls secert

命令行方式创建


kubectl create secret tls example.com --cert=./example.com.crt --key=./example.com.key 

yaml文件方式创建

apiVersion: v1
kind: Secret
metadata:
  name: example.com
  namespace: cka
type: kubernetes.io/tls
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNzakNDQVpvQ0NRQ1lwbWo5cG15bDNUQU5CZ2txaGtpRzl3MEJBUXNGQURBVk1STXdFUVlEVlFRREV3cHIKZFdKbGNtNWxkR1Z6TUI0WERUSXhNVEl4T0RBNE1ERTFNVm9YRFRJek1EVXdNakE0TURFMU1Wb3dJVEVRTUE0RwpBMVVFQXd3SFpYaGhiWEJzWlRFTk1Bc0dBMVVFQ2d3RVpHWnlkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTHdVYTFWYjQ0MmhINzZIWXVEekpjcGZkRTkzNjduaUR0VngxYThjaDRvSEMvNUkKRXoyVFlhYkNEZHA5d0ZDT25LRitmYWFLVk9kak1qTVF4ZDZhK0xHdVF0aXMrL3NMQmorb3QzeGtzMjM1cWptZAprUjRrVlg5bzd1Z0p1a1VIWUxRU3FacXdDWWFjZkFFY0pLOW9nZ1FnaTNINXRrRGlGNFZJSmdXeXVrNWdNZEtUCjVoUkRPeWxhZXhCeUJKQUlqMVBhMDFvMDJpR1J5MnhIVnlGb29nRHova1NvcXQ1YjZ6bnV5MjB6UFNIUFN1a0EKTmg3L1hsY1A1anZoWmk1aFZxNFVlVFVxeVVPZmwrai9xNGVuSzFnTE8waWt1dE1hbTBpRzlmQkpsZWRiZVlXUwo5amxTKzMxWVBzeFNvTjJyeXcwTzF3T1dLK2lzUTlXZDAweGw1dEVDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBUUVBa25hcXdHNytDZnBXSUpDWkE5cXhsZmtuWWY0ZDVkYXR3MGMyN3lHZmdCbElJRnlCd0pid0NIajMKVmdJVU1NQllWQk5rS1JBRnczUmc2d1h5dnJINjJ3SmJBdTNpSDQ3enVRQU5panpxSFFDRkFiS3dPejl2VXNyeQp0NWRRUnJpMTlkaEFDQ25uVHg4OUFIMldyeC9WMEUxdFNXejZxODhmaVNXZktFZzdGenRFZnlSK0ZYajZEd3hWClU3VEZpZHJEWHpiY3VZREZNZytvMm94TTN6VlF3Q0JnczJNbHNaMXZRbXVjYVg2KzNRaTVLK2Y2MXNTenBqSzEKSWQ1NXhkRy8zYUVZa3liaS80V2w2RXl4b0xoY242Z1Ivc1hVZXJESGtnRXZDa0c4ZUYvUmtlV3BwQzBVbmFhNQpvZFJJNnh1QUZwL1FCOUJjWkVTTlRvWVRCeVpUdEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBdkJSclZWdmpqYUVmdm9kaTRQTWx5bDkwVDNmcnVlSU8xWEhWcnh5SGlnY0wva2dUClBaTmhwc0lOMm4zQVVJNmNvWDU5cG9wVTUyTXlNeERGM3ByNHNhNUMyS3o3K3dzR1A2aTNmR1N6YmZtcU9aMlIKSGlSVmYyanU2QW02UlFkZ3RCS3BtckFKaHB4OEFSd2tyMmlDQkNDTGNmbTJRT0lYaFVnbUJiSzZUbUF4MHBQbQpGRU03S1ZwN0VISUVrQWlQVTlyVFdqVGFJWkhMYkVkWElXaWlBUFArUktpcTNsdnJPZTdMYlRNOUljOUs2UUEyCkh2OWVWdy9tTytGbUxtRldyaFI1TlNySlE1K1g2UCtyaDZjcldBczdTS1M2MHhxYlNJYjE4RW1WNTF0NWhaTDIKT1ZMN2ZWZyt6RktnM2F2TERRN1hBNVlyNkt4RDFaM1RUR1htMFFJREFRQUJBb0lCQUFOQVl4NmxxUWh3eWFpMApsSHdKR0JVb2swMHdhSTNkSDU2SENrZXR1WllrU3d2SldUUE9VWGpkai9uQUJNd2Z1d3Q3c1Zab3U5RUlRUHpyCkJGQzE0eWpITjNhaGZ2VzNHaE9OcWlablkwYTZjenZ0d20xLytVNXJsUDNEOVVsdU9EakV2ZFBqeVRaZmpERkUKdUVta0IrTmtZS1RHeVdUVHc4NVZFZnMxUE0xUUN0WXZjeHNoSEgwSXFSUC9lTUNIN1FXdk1iUWlCcDhiYkIwNQppR0lZNjVBd0dtbXdmQmZJNDhjSk5CM1c5OEJzUFJWUk43RVdnVG1jUmpRbGg3RmxnQlBNWDlkV25yY0UvRFFaCmVmS0tNVVpZU1VyTDU3WitxaUxDb0VDR3d3ZnZ0V1pibXpLUkJzTjZJRmczaFJYR1BNVkRTeXRobURHM3dxa1kKMVNaczcwRUNnWUVBMjNxRTJ5ZjJBRzJlOXZNck9iZURsTmg3bGpyVWNTL3BJRms1MjIzc2xqOEgrcHF0eE9ycQpaK1VVRDBxYVhkRVg1YUkrbGR3dytNcTlJaGg2Y1QyY1lMSDZvRlhFYVEzU29kQVB1UTlpdG1MU2xLRFVaMHh0CnlubjRUUENaM1Bqa1JGdUhFbmFPdm9MTGFQTXNqaXlRK3FHNFpKTWZBY3NiZnAwWEl1ck10VWtDZ1lFQTIyQmEKcTNFY1NPOXc3WHZUS2I1aDFOWW5rVlBibTRiR2NZbUhsWXI0bnRObE5veWhQdW4xSFRncHlGT2I1dWpJT2poMApINkNIMUhhRStBTHMrdzdHNHluZDA0UEpWRkQ3ZE5YbkgrSEEveDM5d3FlTEVpTHlRL0hiN281N29OSzdtQjFrClZnMUhjSnR6VityTnFLZkVtc0dpdUZTNkpDdVZwK0V5emwvRmpVa0NnWUJqbGtjOFRmaVFueXozTHNWWlRneTEKZURrenBJUUt5OHVETXhsT21LVTJVMmxpYTljWE4rU2V1ZElOVWpPVENESklyd0tvNngySmRpeTFrTmZXRkRlbApwSHh0VGgxdDhhaTJaWHNNNUk5TTVMQmFZbE9lZjQ1OXhqUkZiUkxUc2xlWk1OS3NMUUYrTGtqdjJROUpmNjFWCkhCWllCRzJZV2JtakROS1h0R1NvaVFLQmdGb0dLbThjVmEwZ2hVa1BmVkl1REZ1WkhsZW5BQUhNeHZha3AzMFkKc0hvTTZnWCtvOVQ3a1ZqU1NXTXAzRnBmd0hzVDI2TjI3d2FqTkdIS1laR05PTlRUdzNJZkxLbHJLaVdCK2Z5OQpXY1BYZk9FNmUvbVBXYmZFTXFxczBkTG5aNUErejRQNG93NTAzRnFCd3ErcFdTYmd1M1BGWVRXaXBTRmxhc0lCCnowSHhBb0dBUEZxNllKZTFjV1p3Tm9KU09kN2g2Nld1V2ZzeTZ2SFBDZXRxWjIwT3ZuaGdtMXlzVlFWSzRlRi8KUFZ3UVdYYkNkRU82ODZxd2VoOUZCdm1XVUtuMWVYajJoMlIvMHdJU0lhcE5oVms4MUFuM2JwYlNjSkFyNnZQdQpkSkhBTWtoOW53ZEVXb29ZeXFpK3MybHBQSnhpY21YQ2JXUEFjdHp3OEtzZWw0cWxxcDA9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

使用tls

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webserver-deploy-ing
  namespace: cka 
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - www.example.com
    secretName: example.com
  rules:
  - host: www.example.com
    http:
      paths:
      - backend:
          service:
            name: webserver-deploy-svc
            port:
              number: 80
        path: /
        pathType: Prefix

创建dockerconfigjson secret

命令行方式创建


kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email [--docker-server=string] [--from-file=[key=]source] [--dry-run=server|client|none] [options]

kubectl create secret docker-registry cka-hub --docker-username=yanruogu@gmail.com --docker-password=cka123456 --docker-email=yanruogu@gamil.com --docker-server=registry.cn-zhangjiakou.aliyuncs.com 


yaml文件方式创建

apiVersion: v1
kind: Secret
metadata:
  name: cka-hub
  namespace: default
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5jbi16aGFuZ2ppYWtvdS5hbGl5dW5jcy5jb20iOnsidXNlcm5hbWUiOiJ5YW5ydW9ndUBnbWFpbC5jb20iLCJwYXNzd29yZCI6ImNrYTEyMzQ1NiIsImVtYWlsIjoieWFucnVvZ3VAZ2FtaWwuY29tIiwiYXV0aCI6ImVXRnVjblZ2WjNWQVoyMWhhV3d1WTI5dE9tTnJZVEV5TXpRMU5nPT0ifX19

使用dockerconfigjson secret

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  labels:
    app: webserver-pri
  name: webserver-pri
  namespace: cka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webserver-pri
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: webserver-pri
    spec:
      imagePullSecrets:
      - name: cka-hub
      containers:
      - image: registry.cn-zhangjiakou.aliyuncs.com/cka-test/nginx:latest
        imagePullPolicy: Always
        name: nginx
        resources: {}
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

查看secret

  • 列出默认命名空间下的secret
    • kubectl get secret
  • 以yaml的形式获取指定的secret
    • kubectl get secret test-secret -o yaml
  • 查看指定secret的详细信息
    • kubectl describe secret test-secret

Secret使用的注意事项

  • Secret需要先于pod创建
  • 只有与当前secret在同一个namespace内的pod才能使用这个secret
  • secret如果发生变更,使用其的pod需要重启或重载
  • kubelet只支持可以被api server管理的pod使用secret。kubelet在本地创建的静态pod将无法使用secert
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

班婕妤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值