zoukankan      html  css  js  c++  java
  • 应用配置管理Secret&ConfigMap

    1.Secret

    常见的应用配置方式

    • 镜像
    • 配置中心
    • 配置文件
    • 共享存储
    • 放到git 仓库

    配置文件分类:

    • 敏感信息    
    • 非敏感信息 如账号密码 服务器地址

    Secret再k8s中 的使用方式

    加密数据并存放Etcd中,让Pod的容器以挂载Volume方式访问。

    应用场景:凭据

    Pod使用secret两种方式: 

    • 变量注入
    • 挂载

    例:现在一对  用户名  密码  pod在运行的时候需要加载 注入到pod 中 

    假如现在 用户名:admin  密码:password

    echo -n "admin" |base64
    YWRtaW4=
    
    echo -n "password" |base64
    cGFzc3dvcmQ=

    passwdAndusername-secret.yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data: 
      username: YWRtaW4=
      password: cGFzc3dvcmQ=

    image.png

    pod怎样注入secret中的变量

    secret-var-use.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: nginx
        image: nginx
        env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: mysecret
                key: username
          - name: SECRET_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysecret
                key: password

    image.png

    将secret挂载到pod文件中

    secret-volume.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod2
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: foo
          mountPath: "/etc/foo"
          readOnly: true
      volumes:
      - name: foo
        secret:
          secretName: mysecret

    image.png

    三种类型secret

    [root@k8s-master1 ~/learn]#  kubectl create secret -h
    Create a secret using specified subcommand.
    
    Available Commands:
      docker-registry Create a secret for use with a Docker registry
      generic         Create a secret from a local file, directory or literal value
      tls             Create a TLS secret

    docker-registry 是配置docker私有仓库的认证信息,当yaml中指定了相应的secret 就可以获取到对应的变量值

    kubectl create secret docker-registry myregistry --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=benjami
    n7788 --docker-password=a7260488
    imagePullSecrets:
    - name: myregistry

    generic 通过传值 或者 指定本地文件的方式 创建secret

    传值:

    kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456

    传文件:

    echo -n admin > ./username
    echo -n 123456 > ./password
    kubectl create secret generic mysecret --from-file=./username --from-file=./password

    tls 创建证书型secret一般用于 ingress 配置https 场景中

    kubectl create secret tls secret-tls --cert=/root/learn/ssl/example.ctnrs.com.pem --key=/root/learn/ssl/example.ctnrs.com-ke
    y.pem
    tls:
      - hosts:
        - example.ctnrs.com
        secretName: secret-tls

    Secret官网:https://kubernetes.io/docs/concepts/configuration/secret/

    2.ConfigMap

    与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。

    应用场景:应用配置

    引用变量方式

    configmap-string.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: myconfig
      namespace: default
    data:
      special.level: info
      special.type: hello

    image.png

     config-var.yaml 

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod3
    spec:
      containers:
        - name: busybox
          image: busybox
          command: ["/bin/sh","-c","echo $(LEVEL) $(TYPE)"]
          env:
            - name: LEVEL
              valueFrom:
                configMapKeyRef:
                  name: myconfig
                  key: special.level
            - name: TYPE
              valueFrom:
                configMapKeyRef:
                  name: myconfig
                  key: special.type
      restartPolicy: Never

    image.png

    挂载数据卷方式

    cat config-volume.yaml 

    ---
    
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: redis-config
    data:
      redis.properties: |
        redis.host=127.0.0.1
        redis.port=6379
        redis.password=123456
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod4
    spec:
      containers:
        - name: busybox
          image: busybox
          command: ["/bin/sh","-c","cat /etc/config/redis.properties"]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
      volumes:
          - name: config-volume
            configMap:
              name: redis-config
      restartPolicy: Never

    image.png

    应用程序动态更新配置

    ConfigMap更新时,业务也随之更新的方案:

    • 当ConfigMap发生变更时,应用程序动态加载 
    • 触发滚动更新,即重启服务

     但是问题是,如何触发应用reload?如何周期性的检查文件是否变化?

    比如 我将configMap中定义的密码 由 123456 改为 password

    然后重新应用程序,发现应用并未使用更新后的配置

    image.png

    只有将pod 进行重建后,才能加载到修改后的配置

    kubectl delete po mypod4

    kubectl apply -f config-volume.yaml 

    image.png

    ConfigMap 官网:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

  • 相关阅读:
    第二章 Flask——Flask中的request
    第一章 Flask——Flask简介
    第四章 Linux——Nginx环境部署指南
    众测平台
    jmeter进阶
    adb命令对app进行测试
    众测平台
    selenium
    java基础知识
    接口测试工具对比
  • 原文地址:https://www.cnblogs.com/benjamin77/p/12446761.html
Copyright © 2011-2022 走看看