09. Kubernetes基础篇-配置管理

ConfigMap

简介

什么是ConfigMap

ConfigMap 是一种资源类型,用于存储非敏感性的配置数据,如环境变量、命令行参数、配置文件等。
这些数据可以被 Kubernetes 中的 Pod 使用,用于配置应用程序。
主要用于存储配置,使配置文件与镜像文件分离,使容器化的应用具有可移植性。

主要特点和用途

  1. 存储非敏感数据ConfigMap 用于存储敏感信息以外的配置数据,如环境变量、命令行参数、配置文件等。
  2. 动态配置ConfigMap 允许动态地更新 Pod 的配置,而不需要重新构建镜像或重新部署 Pod。
  3. 集中管理:可以将多个 Pod 的配置集中存储在同一个 ConfigMap 中,便于管理和维护。
  4. 版本控制ConfigMap 支持版本控制,可以为不同的配置版本创建不同的 ConfigMap 对象。
  5. 安全ConfigMap 支持加密敏感数据,如密码、OAuth 令牌等。
  6. 多种使用方式:可以通过多种方式在 Pod 中使用 ConfigMap 中的数据,包括环境变量、命令行参数、配置文件等。

注意事项

  1. ConfigMap 需要在 Pod 启动前创建出来;
  2. 只有当 ConfigMap 和 Pod 处于同一命名空间时,才可以被 Pod 引用;
  3. 当 Pod 挂载 ConfigMap 绑定的目录时,目录并不会挂载到 Pod 内,只有目录下的文件会被挂载;
  4. 使用yaml创建ConfigMap时,如果使用了文件挂载形式,那么VOLUME中不加subPath会以覆盖的形式挂载。

定义ConfigMap

创建ConfigMap–命令创建

通常再用这个方式,将一个配置文件创建成ConfigMap。

  • 创建目录
mkdir -p /root/configmap/
  • 编辑ConfigMap配置文件
cat >> /root/configmap/resolv.conf << EOF
nameserver 8.8.8.8
nameserver 114.114.114.114
EOF

cat >> /root/configmap/redis.conf << EOF
bind 192.168.108.130
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"
dir /usr/local/redis/data/
EOF
  • 创建ConfigMap
#格式
kubectl create configmap configMap名称 --from-file=配置文件路径或目录

#将/root/configmap/下所有文件创建成ConfigMap
kubectl create configmap test-config --from-file=/root/configmap/

#仅针对redis.conf配置文件创建成ConfigMap
kubectl create configmap configmap-redis --from-file=/root/configmap/redis.conf
  • 查看ConfigMap
kubectl get configmaps test-config 
# NAME          DATA   AGE
# test-config   2      2m14s
  • 查看ConfigMap配置内容
kubectl describe configmaps test-config 
# Name:         test-config
# Namespace:    default
# Labels:       <none>
# Annotations:  <none>

# Data
# ====
# redis.conf:
# ----
# bind 192.168.108.130
# port 6379
# requirepass 1qaz!QAZ
# protected-mode yes
# timeout 0
# databases 16
# daemonize yes
# pidfile /usr/local/redis/pid/redis_6379.pid
# loglevel notice
# logfile "/usr/local/redis/logs/redis.log"
# dir /usr/local/redis/data/

# resolv.conf:
# ----
# nameserver 8.8.8.8
# nameserver 114.114.114.114

# Events:  <none>

创建ConfigMap–字面创建

  • 创建ConfigMap
kubectl create configmap key-value-configmap --from-literal=ip=192.168.23.138 --from-literal=port=22
  • 查看ConfigMap
kubectl get configmaps 
# NAME                  DATA   AGE
# configmap-redis       1      29m
# key-value-configmap   2      7s
# kube-root-ca.crt      1      6d23h
  • 查看ConfigMap配置内容
kubectl describe configmaps key-value-configmap 
# Name:         key-value-configmap
# Namespace:    default
# Labels:       <none>
# Annotations:  <none>

# Data
# ====
# ip:
# ----
# 192.168.23.138
# port:
# ----
# 22
# Events:  <none>

创建ConfigMap–yaml创建

  • 编辑yaml-配置文件
apiVersion: v1
kind: ConfigMap                                                       #定义这是一个ConfigMap的资源
metadata:
  name: test-2-configmap                                              #定义ConfigMap的名称
  namespace: default                                                  #指定了ConfigMap所在命名空间
  labels:
    app: test-2-configmap                                             #定义了 ConfigMap 的标签,可以用于选择器。
data:                                                                 #定义ConfigMap所包含的配置资源
  redis.conf: |                                                       #此处定义了一个redis的配置
    bind 192.168.108.130
    port 6379
    requirepass 1qaz!QAZ
    protected-mode yes
    timeout 0
    databases 16
    daemonize yes
    pidfile /usr/local/redis/pid/redis_6379.pid
    loglevel notice
    logfile "/usr/local/redis/logs/redis.log"
    dir /usr/local/redis/data/
  resolv.conf: |
    nameserver 8.8.8.8
    nameserver 114.114.114.114
  • 编辑yaml-KeyValue
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-busybox
  namespace: default
  labels:
    app: configmap-redis

data:
  HOSTNAME: "192.168.23.138"
  PORT: "2222"
  PASSWORD: "WangMingQu@123456"
  USERNAME: "wangmingqu"
  • 创建ConfigMap
kubectl create -f configmap-2.yaml
  • 查看ConfigMap
kubectl get configmaps 
# NAME               DATA   AGE
# kube-root-ca.crt   1      6d22h
# test-2-configmap   2      4s
# test-config        2      7m
  • 查看ConfigMap配置内容
kubectl describe configmaps test-2-configmap 
# Name:         test-2-configmap
# Namespace:    default
# Labels:       app=test-2-configmap
# Annotations:  <none>

# Data
# ====
# redis.conf:
# ----
# bind 192.168.108.130
# port 6379
# requirepass 1qaz!QAZ
# protected-mode yes
# timeout 0
# databases 16
# daemonize yes
# pidfile /usr/local/redis/pid/redis_6379.pid
# loglevel notice
# logfile "/usr/local/redis/logs/redis.log"
# dir /usr/local/redis/data/

# resolv.conf:
# ----
# nameserver 8.8.8.8
# nameserver 114.114.114.114

# Events:  <none>

创建ConfigMap–generate创建

  • 创建目录
mkdir -p /root/configmap/
  • 编译ConfigMap配置文件
cat >> /root/configmap/resolv.conf << EOF
nameserver 8.8.8.8
nameserver 114.114.114.114
EOF

cat >> /root/configmap/redis.conf << EOF
bind 192.168.108.130
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"
dir /usr/local/redis/data/
EOF
  • 创建generate文件
#注意:
#1. 此处只能使用kustomization.yaml的名称,否则将会报错;
#2. kustomization.yaml中
cat >> kustomization.yaml << EOF
configMapGenerator:
  - name: test-configmap-generator              #定义ConfigMap的名称
    files:
      - configmap/redis.conf                    #指定配置文件,只能指定文件不能指定目录;此处路径为相对路径,相对kustomization.yaml文件的路径
EOF
  • 创建ConfigMap
kubectl apply -k .

#注意:-k后一要有“.”
  • 检查ConfigMap
kubectl get configmaps 
# NAME                                  DATA   AGE
# configmap-redis                       1      40m
# key-value-configmap                   2      11m
# kube-root-ca.crt                      1      6d23h
# test-configmap-generator-d7f8f5tt9h   1      9s
  • 检查ConfigMap配置内容
kubectl describe configmaps test-configmap-generator-d7f8f5tt9h 
# Name:         test-configmap-generator-d7f8f5tt9h
# Namespace:    default
# Labels:       <none>
# Annotations:  <none>

# Data
# ====
# redis.conf:
# ----
# bind 192.168.108.130
# port 6379
# requirepass 1qaz!QAZ
# protected-mode yes
# timeout 0
# databases 16
# daemonize yes
# pidfile /usr/local/redis/pid/redis_6379.pid
# loglevel notice
# logfile "/usr/local/redis/logs/redis.log"
# dir /usr/local/redis/data/

# Events:  <none>

应用ConfigMap

以变量形式挂载

  • 编辑yaml
apiVersion: v1
kind: ConfigMap                                                                             #定义了这是一个ConfigMap类型的资源
metadata:
  name: configmap-busybox                                                                   #定义了ConfigMap资源的名称,此名称在Pod引用ConfigMap时起到关联Pod用途
  namespace: default                                                                        #指定ConfigMap所在命名空间
  labels:
    app: configmap-redis                                                                    #指定ConfigMap的标签

data:
  HOSTNAME: "192.168.23.138"                                                                #以KeyValue的形式指定ConfigMap记录的配置,注意此处的Value必须是字符串形式,需要加双引号
  PORT: "2222"
  PASSWORD: "WangMingQu@123456"
  USERNAME: "wangmingqu"

---
apiVersion: apps/v1
kind: Deployment                                                                            #定义了这是一个Deployment类型的资源
metadata:
  name: deployment-busybox                                                                  #定义Deployment的名称
  namespace: default
  labels:
    app: deployment-busybox                                                                 #指定Deployment的标签

spec:
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox

    spec:
      containers:
        - name: busybox                                                                     #定义Pod的名称
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
          command:
            - sleep
            - "3600"
          env:                                                                              #指定ConfigMap的配置以变量的是形式挂载到Pod
            - name: CONTAINER_HOSTNAME                                                      #定义Pod中容器使用的变量名称,使用此名称可以调用对应的值
              valueFrom:
                configMapKeyRef:
                  name: configmap-busybox                                                   #指定Pod从哪个ConfigMap的名称中获取配置,此处要与ConfigMap中metadata.name定义的名称保持一致
                  key: HOSTNAME                                                             #指定获取ConfigMap中的哪个Key,此处与ConfigMap中定义的data中定义的名称要保持一致
            - name: CONTAINER_PORT
              valueFrom:
                configMapKeyRef:
                  name: configmap-busybox
                  key: PORT
            - name: CONTAINER_PASSWORD
              valueFrom:
                configMapKeyRef:
                  name: configmap-busybox
                  key: PASSWORD
            - name: CONTAINER_USERNAME
              valueFrom:
                configMapKeyRef:
                  name: configmap-busybox
                  key: USERNAME
      restartPolicy: Always
  • 创建服务
kubectl create -f configmap-deployment-pod-busybox-env.yaml
  • 验证服务
kubectl exec -it deployment-busybox-77bddf9fcc-rpft2 -- sh
# / # echo $CONTAINER_HOSTNAME
# 192.168.23.138

以变量形式批量挂载

  • 编辑yaml
apiVersion: v1
kind: ConfigMap                                                                             #定义了这是一个ConfigMap类型的资源
metadata:
  name: configmap-busybox                                                                   #定义了ConfigMap资源的名称,此名称在Pod引用ConfigMap时起到关联Pod用途
  namespace: default                                                                        #指定ConfigMap所在命名空间
  labels:
    app: configmap-busybox                                                                    #指定ConfigMap的标签

data:
  busybox: |
    HOSTNAME 192.168.23.138
    PORT 2222
    PASSWORD WangMingQu@123456
    USERNAME wangmingqu

---
apiVersion: apps/v1
kind: Deployment                                                                            #定义了这是一个Deployment类型的资源
metadata:
  name: deployment-busybox                                                                  #定义Deployment的名称
  namespace: default
  labels:
    app: deployment-busybox                                                                 #指定Deployment的标签

spec:
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox

    spec:
      containers:
        - name: busybox                                                                       #定义Pod的名称
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
          command:
            - "sleep"
            - "3600"
          envFrom:
            - configMapRef:
                name: configmap-busybox                                                       #定义Pod引用的ConfigMap配置作为变量
      restartPolicy: Always
  • 创建服务
kubectl create -f configmap-deployment-busybox-envfrom.yaml
  • 验证服务
exec -it deployment-busybox-6947c87fb6-gzfv4 -- sh
# / # env
# KUBERNETES_PORT=tcp://10.96.0.1:443
# KUBERNETES_SERVICE_PORT=443
# HOSTNAME=deployment-busybox-6947c87fb6-gzfv4
# SHLVL=1
# HOME=/root
# busybox=HOSTNAME 192.168.23.138
# PORT 2222
# PASSWORD WangMingQu@123456
# USERNAME wangmingqu

# TERM=xterm
# KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# KUBERNETES_PORT_443_TCP_PORT=443
# KUBERNETES_PORT_443_TCP_PROTO=tcp
# KUBERNETES_SERVICE_PORT_HTTPS=443
# KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
# KUBERNETES_SERVICE_HOST=10.96.0.1
# PWD=/

以文件形式挂载

  • 编辑yaml
apiVersion: v1
kind: ConfigMap                                                                         #定义这是一个ConfigMap类型资源
metadata:
  name: configmap-redis                                                                 #定义ConfigMap资源名称,用于关联Deployment中Pod的容器
  namespace: default
  labels:
    app: configmap-redis

data:
  redis.conf: |                                                                         #将Redis配置文件写入ConfigMap中容器
    dir /data/
    bind 0.0.0.0
    port 6380
    requirepass 1qaz!QAZ
    protected-mode no
    timeout 0
    databases 16
    loglevel notice
    pidfile /data/redis-6380.pid

---
apiVersion: apps/v1
kind: Deployment                                                                        #定义了一个Deployment类型资源
metadata:
  name: deployment-redis                                                                #定义Deployment资源的名称
  namespace: default
  labels:
    app: deployment-redis

spec:
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis-one
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 6380                                                         #由于配置文件定义了Redis的监听端口,此处要与其保持一致
          volumeMounts:                                                                   #定义了容器挂载的卷
            - mountPath: /usr/local/redis/conf/                                           #定义了卷的挂载路径
              name: redis-conf-volumes                                                    #定义了卷的名称,这个卷名称要与 volumes 部分定义的保持一致
          command:                                                                        #定义了容器启动后执行的命令
            - "sh"
            - "-c"
            - "redis-server /usr/local/redis/conf/redis.conf"                             #指定了Redis启动时使用的配置文件
      restartPolicy: Always
      volumes:                                                                            #定义了 Pod 使用的卷信息
        - name: redis-conf-volumes                                                        #定义了卷的名称,与spec.template.spec.containers.volumeMounts.name要保持一致
          configMap:                                                                      #定义了该卷是一个 ConfigMap 类型的卷
            name: configmap-redis                                                         #定义了 ConfigMap 的名称,这个 ConfigMap 中存储了 Redis 配置文件的内容。
  • 创建服务
kubectl create -f configmap-deployment-pod-redis-volume.yaml
  • 验证服务
kubectl exec -it deployment-redis-74bf7fbd7b-stbtn -- /bin/bash
# root@deployment-redis-74bf7fbd7b-stbtn:/data# redis-cli -p 6380
# 127.0.0.1:6380> AUTH 1qaz!QAZ
# OK

以文件形式挂载–subPath

  • 编辑yaml
apiVersion: v1
kind: ConfigMap                                                                         #表示这是一个 ConfigMap 资源。
metadata:
  name: redis-config                                                                    #定义了 ConfigMap 的名称。
  namespace: default
  labels:
    app: redis
data:                                                                                   #包含了一系列键值对,其中键是配置文件的名称,值是文件的内容。
  redis.conf: |
    dir /data/
    port 6380
    bind 0.0.0.0
    appendonly no
    protected-mode no
    pidfile /data/redis-6379.pid

---
apiVersion: apps/v1
kind: Deployment                                                                        #表示这是一个 Deployment 资源。
metadata:
  name: redis                                                                           #定义了 Deployment 的名称。
  namespace: default
  labels:
    app: redis
spec:
  selector:
    matchLabels:
      app: redis                                                                        #使用标签选择器 matchLabels: app: redis 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
  template:
    metadata:
      labels:
        app: redis
    spec:
       containers:                                                                      #定义了容器模板。
        - name: redis                                                                   #定义了容器的名称。
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
          command:
            - "sh"
            - "-c"
            - "redis-server /usr/local/redis/redis.conf"
          ports:
            - containerPort: 6380
          volumeMounts:
            - name: config                                                              #定义了卷的名称。
              mountPath: /usr/local/redis/                                              #定义了卷的挂载路径。
              subPath: redis.conf                                                       #定义了配置文件在卷中的路径,这意味着 ConfigMap 中存储的数据将被挂载到 /usr/local/redis/example.conf
       volumes:                                                                         #定义了 Pod 使用的卷
        - name: config                                                                  #定义了卷的名称。
          configMap:                                                                    #定义了该卷是一个 ConfigMap 类型的卷。
            name: redis-config                                                          #定义了 ConfigMap 的名称,这个 ConfigMap 中存储了 Redis 配置文件的内容。
  • 创建服务
kubectl create -f configmap-deployment-pod-redis-subpath.yaml

Secret

简介

什么是Secret

Secret 是一种资源类型,用于存储敏感信息,如密码、OAuth 令牌、SSH 密钥、证书等。
这些敏感信息在 Kubernetes 集群中以加密的形式存储,以保证安全性。
主要用于存储敏感信息,将这些信息放在Secret中比放在Pod的定义或容器镜像中更加安装、灵活。

主要特点和用途

  1. 存储敏感信息Secret 用于存储敏感信息,如密码、OAuth 令牌、SSH 密钥、证书等。
  2. 加密存储Secret 中的数据会被加密存储,以保证敏感信息的安全性。
  3. 版本控制Secret 支持版本控制,你可以为不同的配置版本创建不同的 Secret 对象。
  4. 多种使用方式:你可以通过多种方式在 Pod 中使用 Secret 中的数据,包括环境变量、命令行参数、配置文件等。
  5. 安全引用:在 Pod 中引用 Secret 时,Kubernetes 会自动解密数据,并在 Pod 中以安全的方式使用。

特别注意事项

  1. 使用yaml创建Secret时,如果同时有data和stringData,则只使用stringData。
  2. 使用yaml创建Secret时,如果使用stringData,则Value必须是字符串形式。
  3. 使用yaml创建Secret时,如果使用了文件挂载形式,那么VOLUME中不加subPath会以覆盖的形式挂载。

存储类型拓展

  1. Opaque
    • 这是默认类型,用于存储任何类型的数据。
    • 数据会被 Base64 编码,但不会被加密。
    • 适用于存储非敏感信息,如环境变量或配置文件。
  2. kubernetes.io/service-account-token
    • 用于存储 Kubernetes 服务账户的令牌。
    • 数据会被加密存储。
  3. kubernetes.io/dockercfgkubernetes.io/dockerconfigjson
    • 用于存储 Docker 认证信息,如登录凭据。
    • 数据会被加密存储。
  4. kubernetes.io/basic-authkubernetes.io/tls
    • 用于存储基本认证凭据和 TLS 证书。
    • 数据会被加密存储。
  5. bootstrap.kubernetes.io/token
    • 用于存储集群引导令牌。
    • 数据会被加密存储。
  6. bootstrap.kubernetes.io/kubeconfig
    • 用于存储 kubeconfig 文件,用于访问 Kubernetes API。
    • 数据会被加密存储。
  7. bootstrap.kubernetes.io/signer
    • 用于存储签名密钥,用于对 Pod 进行签名。
    • 数据会被加密存储。
  8. bootstrap.kubernetes.io/token
    • 用于存储集群引导令牌。
    • 数据会被加密存储。
  9. bootstrap.kubernetes.io/kubeconfig
    • 用于存储 kubeconfig 文件,用于访问 Kubernetes API。
    • 数据会被加密存储。
  10. bootstrap.kubernetes.io/signer
  • 用于存储签名密钥,用于对 Pod 进行签名。
  • 数据会被加密存储。

定义Secret

创建Secret–命令创建

  • 创建目录
mkdir -p /root/secret
  • 编辑Secret配置文件
#注意:此处一个文件一个账号或密码
echo "wangmingqu" > /root/secret/username.txt

echo "WangMingQu@123" > /root/secret/password.txt
  • 创建Secret
kubectl create secret generic username-password-test --from-file=/root/secret/username.txt --from-file=/root/secret/password.txt
  • 查看Secret
kubectl get secrets 
# NAME                     TYPE                                  DATA   AGE
# default-token-vrnhx      kubernetes.io/service-account-token   3      7d16h
# username-password-test   Opaque                                2      20s
  • 查看Secret内容
kubectl get secrets username-password-test -o yaml
# apiVersion: v1
# data:
#   password.txt: d2FuZ0AxMjMKbWluZ0AxMjMKcXVAMTIzCg==
#   username.txt: d2FuZwptaW5nCnF1Cg==
# kind: Secret
# metadata:
#   creationTimestamp: "2024-07-18T01:58:05Z"
#   managedFields:
#   - apiVersion: v1
#     fieldsType: FieldsV1
#     fieldsV1:
#       f:data:
#         .: {}
#         f:password.txt: {}
#         f:username.txt: {}
#       f:type: {}
#     manager: kubectl-create
#     operation: Update
#     time: "2024-07-18T01:58:05Z"
#   name: username-password-test
#   namespace: default
#   resourceVersion: "431219"
#   uid: 9db93e93-fe78-4f7a-8c03-db9b92b6af1b
# type: Opaque

创建Secret–字面创建

  • 创建Secret
kubectl create secret generic username-password-db --from-literal=username=WangMingQu --from-literal=password=WangMingQu@123
  • 查看Secret
kubectl get secrets 
# NAME                     TYPE                                  DATA   AGE
# default-token-vrnhx      kubernetes.io/service-account-token   3      7d16h
# username-password-db     Opaque                                2      18s
# username-password-test   Opaque                                2      7m13s
  • 查看Secret内容
kubectl get secrets username-password-db -o yaml
# apiVersion: v1
# data:
#   password: V2FuZ01pbmdRdUAxMjM=
#   username: V2FuZ01pbmdRdQ==
# kind: Secret
# metadata:
#   creationTimestamp: "2024-07-18T02:05:00Z"
#   managedFields:
#   - apiVersion: v1
#     fieldsType: FieldsV1
#     fieldsV1:
#       f:data:
#         .: {}
#         f:password: {}
#         f:username: {}
#       f:type: {}
#     manager: kubectl-create
#     operation: Update
#     time: "2024-07-18T02:05:00Z"
#   name: username-password-db
#   namespace: default
#   resourceVersion: "431716"
#   uid: 2b5b30cf-c281-4cff-b86b-adf3031982a5
# type: Opaque

创建Secret–yaml创建(手动转译账号密码)

  • 加密账号和密码
#加密账号
echo WangMingQu | base64
# V2FuZ01pbmdRdQo=

#加密密码
echo WangMingQu@123456 | base64
# V2FuZ01pbmdRdUAxMjM0NTYK
  • 编辑yaml
apiVersion: v1
kind: Secret                                #表示这是一个 Secret 资源
metadata:
  name: secret-up                           #定义了 Secret 的名称
  namespace: default
  labels:
    app: username-password

data:                                       #包含了一系列键值对,其中键是 Secret 的键名,值是加密后的敏感信息。
  username: V2FuZ01pbmdRdQo=                #base64加密过的账号
  password: V2FuZ01pbmdRdUAxMjM0NTYK        #base64加密过的密码

type: Opaque                                #表示 Secret 中的数据是原始的,没有被特别处理或加密
  • 创建Secret
kubectl create -f secret-m.yaml
  • 查看Secret
kubectl get secrets 
# NAME                  TYPE                                  DATA   AGE
# default-token-vrnhx   kubernetes.io/service-account-token   3      7d16h
# secret-up             Opaque                                2      8s
  • 查看Secret内容
kubectl get secrets secret-up -o yaml
# apiVersion: v1
# data:
#   password: V2FuZ01pbmdRdUAxMjM0NTYK
#   username: V2FuZ01pbmdRdQo=
# kind: Secret
# metadata:
#   creationTimestamp: "2024-07-18T02:28:27Z"
#   labels:
#     app: username-password
#   managedFields:
#   - apiVersion: v1
#     fieldsType: FieldsV1
#     fieldsV1:
#       f:data:
#         .: {}
#         f:password: {}
#         f:username: {}
#       f:metadata:
#         f:labels:
#           .: {}
#           f:app: {}
#       f:type: {}
#     manager: kubectl-create
#     operation: Update
#     time: "2024-07-18T02:28:27Z"
#   name: secret-up
#   namespace: default
#   resourceVersion: "433405"
#   uid: d19e12a5-19c3-4e10-b7a1-4ed246215294
# type: Opaque

创建Secret–yaml创建(自动转译账号密码)

  • 编辑yaml
apiVersion: v1
kind: Secret                          #表示这是一个 Secret 资源
metadata:
  namespace: default
  name: secret-up-auth                #定义了 Secret 的名称
  labels:
    app: secret-up-auth

stringData:                           #包含了一系列键值对,其中键是 Secret 的键名,值是加密后的敏感信息。可以自动转译账号密码
  username: "wangmingqu"              #直接填入账号
  password: "WangMingQu@1234567890"   #直接写入密码

type: Opaque													#这是默认类型,用于存储任何类型的数据
  • 创建Secret
kubectl create -f secret-a.yaml
  • 查看Secret
kubectl get secrets 
# NAME                  TYPE                                  DATA   AGE
# default-token-vrnhx   kubernetes.io/service-account-token   3      7d16h
# secret-up             Opaque                                2      4m28s
# secret-up-auth        Opaque                                2      9s
  • 查看Secret内容
kubectl get secrets secret-up-auth -o yaml
# apiVersion: v1
# data:
#   password: V2FuZ01pbmdRdUAxMjM0NTY3ODkw
#   username: d2FuZ21pbmdxdQ==
# kind: Secret
# metadata:
#   creationTimestamp: "2024-07-18T02:32:46Z"
#   labels:
#     app: secret-up-auth
#   managedFields:
#   - apiVersion: v1
#     fieldsType: FieldsV1
#     fieldsV1:
#       f:data:
#         .: {}
#         f:password: {}
#         f:username: {}
#       f:metadata:
#         f:labels:
#           .: {}
#           f:app: {}
#       f:type: {}
#     manager: kubectl-create
#     operation: Update
#     time: "2024-07-18T02:32:46Z"
#   name: secret-up-auth
#   namespace: default
#   resourceVersion: "433713"
#   uid: 8d8d7aec-eafb-40c4-bafd-afd9e276adb0
# type: Opaque

创建Secret–generate创建

注意:用法与ConfigMap一致。

  • 创建目录
mkdir -p /root/secret/mysql
  • 创建Secret文件
echo "ChangMengKa" > /root/secret/mysql/username.txt
echo "ChangMengKa@123456789" > /root/secret/mysql/password.txt
  • 创建generate文件
cat >> kustomization.yaml << EOF
secretGenerator:
  - name: secret-mysql
    files:
      - secret/mysql/username.txt
      - secret/mysql/password.txt
EOF
  • 创建Secret
kubectl apply -k .
  • 查看Secret
kubectl get secrets 
# NAME                      TYPE                                  DATA   AGE
# default-token-vrnhx       kubernetes.io/service-account-token   3      7d16h
# secret-mysql-8hm549672d   Opaque                                2      2m23s
# secret-up                 Opaque                                2      21m
# secret-up-auth            Opaque                                2      16m
  • 查看Secret内容
kubectl get secrets secret-mysql-8hm549672d -o yaml
# apiVersion: v1
# data:
#   password.txt: Q2hhbmdNZW5nS2FAMTIzNDU2Nzg5Cg==
#   username.txt: Q2hhbmdNZW5nS2EK
# kind: Secret
# metadata:
#   annotations:
#     kubectl.kubernetes.io/last-applied-configuration: |
#       {"apiVersion":"v1","data":{"password.txt":"Q2hhbmdNZW5nS2FAMTIzNDU2Nzg5Cg==","username.txt":"Q2hhbmdNZW5nS2EK"},"kind":"Secret","metadata":{"annotations":{},"name":"secret-mysql-8hm549672d","namespace":"default"},"type":"Opaque"}
#   creationTimestamp: "2024-07-18T02:47:10Z"
#   managedFields:
#   - apiVersion: v1
#     fieldsType: FieldsV1
#     fieldsV1:
#       f:data:
#         .: {}
#         f:password.txt: {}
#         f:username.txt: {}
#       f:metadata:
#         f:annotations:
#           .: {}
#           f:kubectl.kubernetes.io/last-applied-configuration: {}
#       f:type: {}
#     manager: kubectl-client-side-apply
#     operation: Update
#     time: "2024-07-18T02:47:10Z"
#   name: secret-mysql-8hm549672d
#   namespace: default
#   resourceVersion: "434748"
#   uid: 18afa634-38bc-4b98-ba52-6bb102401b1e
# type: Opaque

加密&解密

  • 说明

Secret的用户和密码是采用Base64加密算法加密,可以被正常解密;
密码有特殊字符时,可以使用单引号(‘’)将密码括起来,这样不用进行转译;

  • 加密
echo "WangMingQu" | base64
# V2FuZ01pbmdRdQ==

echo "WangMingQu@123" | base64
# V2FuZ01pbmdRdUAxMjM=
  • 解密
echo V2FuZ01pbmdRdQ== | base64 --decode
# WangMingQu

echo V2FuZ01pbmdRdUAxMjM= | base64 --decode
# WangMingQu@123

应用Secret

以变量形式挂载

  • 编辑yaml
apiVersion: v1
kind: Secret                                                                      #表示这是一个 Secret 资源。
metadata:
  name: secret-busybox                                                            #定义了 Secret 的名称。
  namespace: default
  labels:
    app: secret-busybox

stringData:                                                                       #包含了一系列键值对,其中键是 Secret 的键名,值是字符串形式的敏感信息。
  username: "wangmingqu"
  password: "wangmingqu@1234567890"

type: Opaque                                                                      #表示 Secret 中的数据是原始的,没有被特别处理或加密。

---
apiVersion: apps/v1
kind: Deployment                                                                  #表示这是一个 Deployment 资源。
metadata:
  name: deployment-busybox                                                        #定义了 Deployment 的名称。
  namespace: default
  labels:
    app: deployment-busybox

spec:
  selector:                                                                        #使用标签选择器 matchLabels: app: busybox 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:                                                                   #定义了容器模板。
        - name: busybox                                                             #定义了容器的名称。
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
          command:
            - sleep
            - "3600"
          env:                                                                      #定义了容器环境变量。
            - name: envsecretusername                                             #定义了一个环境变量,其值从 secret-busybox Secret 中的 username 键获取。
              valueFrom:
                secretKeyRef:
                  name: secret-busybox
                  key: username

            - name: envsecretpassword                                             #定义了一个环境变量,其值从 secret-busybox Secret 中的 password 键获取。
              valueFrom:
                secretKeyRef:
                  key: password
                  name: secret-busybox
      restartPolicy: Always
  • 创建服务
kubectl create -f secret-busybox-env.yaml
  • 查看Secret内容
kubectl get secrets secret-busybox -o yaml
# apiVersion: v1
# data:
#   password: d2FuZ21pbmdxdUAxMjM0NTY3ODkw
#   username: d2FuZ21pbmdxdQ==
# kind: Secret
# metadata:
#   creationTimestamp: "2024-07-18T05:10:22Z"
#   labels:
#     app: secret-busybox
#   managedFields:
#   - apiVersion: v1
#     fieldsType: FieldsV1
#     fieldsV1:
#       f:data:
#         .: {}
#         f:password: {}
#         f:username: {}
#       f:metadata:
#         f:labels:
#           .: {}
#           f:app: {}
#       f:type: {}
#     manager: kubectl-create
#     operation: Update
#     time: "2024-07-18T05:10:22Z"
#   name: secret-busybox
#   namespace: default
#   resourceVersion: "445012"
#   uid: 49f06a64-a0b0-4826-8852-2980dd5c7f2c
# type: Opaque
  • 验证服务
kubectl exec -it deployment-busybox-6f7cb9cc9f-wrndz -- sh
# / # echo $envsecretusername
# wangmingqu
# / # echo $envsecretpassword
# wangmingqu@1234567890

以变量形式批量挂载

  • 编辑yaml
apiVersion: v1
kind: Secret                                                                      #表示这是一个 Secret 资源。
metadata:
  name: secret-busybox                                                            #定义了 Secret 的名称。
  namespace: default
  labels:
    app: secret-busybox

stringData:                                                                       #包含了一系列键值对,其中键是 Secret 的键名,值是字符串形式的敏感信息。
  username: "wangmingqu"
  password: "wangmingqu@1234567890"

type: Opaque                                                                      #表示 Secret 中的数据是原始的,没有被特别处理或加密。

---
apiVersion: apps/v1
kind: Deployment                                                                  #表示这是一个 Deployment 资源。
metadata:
  name: deployment-busybox                                                        #定义了 Deployment 的名称。
  namespace: default
  labels:
    app: deployment-busybox

spec:
  selector:                                                                        #使用标签选择器 matchLabels: app: busybox 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:                                                                   #定义了容器模板。
        - name: busybox                                                             #定义了容器的名称。
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
          command:
            - sleep
            - "3600"
          envFrom:
            - secretRef:
                name: secret-busybox
      restartPolicy: Always

  • 创建服务
kubectl create -f secret-depolyment-busybox-envfrom.yaml
  • 查看Secret内容
kubectl get secrets secret-busybox -o yaml
# apiVersion: v1
# data:
#   password: d2FuZ21pbmdxdUAxMjM0NTY3ODkw
#   username: d2FuZ21pbmdxdQ==
# kind: Secret
# metadata:
#   creationTimestamp: "2024-07-18T05:25:18Z"
#   labels:
#     app: secret-busybox
#   managedFields:
#   - apiVersion: v1
#     fieldsType: FieldsV1
#     fieldsV1:
#       f:data:
#         .: {}
#         f:password: {}
#         f:username: {}
#       f:metadata:
#         f:labels:
#           .: {}
#           f:app: {}
#       f:type: {}
#     manager: kubectl-create
#     operation: Update
#     time: "2024-07-18T05:25:18Z"
#   name: secret-busybox
#   namespace: default
#   resourceVersion: "446194"
#   uid: 95ac4bbe-19bb-4f80-8631-5a46845f0375
# type: Opaque
  • 验证服务
kubectl exec -it deployment-busybox-5bf79c7654-r48p9 -- sh
# / # env
# KUBERNETES_SERVICE_PORT=443
# KUBERNETES_PORT=tcp://10.96.0.1:443
# HOSTNAME=deployment-busybox-5bf79c7654-r48p9
# SHLVL=1
# username=wangmingqu
# HOME=/root
# TERM=xterm
# KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# KUBERNETES_PORT_443_TCP_PORT=443
# password=wangmingqu@1234567890
# KUBERNETES_PORT_443_TCP_PROTO=tcp
# KUBERNETES_SERVICE_PORT_HTTPS=443
# KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
# KUBERNETES_SERVICE_HOST=10.96.0.1
# PWD=/
# / # 

以文件形式挂载

  • 编辑yaml
apiVersion: v1
kind: Secret                                                                        #表示这是一个 Secret 资源。
metadata:
  name: secret-file                                                                 #定义了 Secret 的名称。
  namespace: default
  labels:
    app: secret-file

stringData:                                                                         #包含了一系列键值对,其中键是 Secret 的键名,值是字符串形式的敏感信息。
  username: "wangmingqu"
  password: "wangminbqu@123"

type: Opaque

---
apiVersion: apps/v1
kind: Deployment                                                                    #表示这是一个 Deployment 资源。
metadata:
  name: deployment-file                                                             #定义了 Deployment 的名称。
  namespace: default
  labels:
    app: deployment-file

spec:
  selector:
    matchLabels:
      app: busybox                                                                  #使用标签选择器 matchLabels: app: busybox 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:                                                                   #定义了容器模板。
        - name: busybox                                                             #定义了容器的名称。
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
          command:
            - sleep
            - "3600"
          volumeMounts:                                                             #定义了容器挂载的卷。
            - mountPath: /usr/local/                                                #定义了卷的挂载路径。
              name: volume-file                                                     #定义了卷的名称,这个卷将在 volumes 部分定义。
      volumes:                                                                      #定义了 Pod 使用的卷。
        - name: volume-file                                                         #定义了卷的名称。
          secret:                                                                   #定义了该卷是一个 Secret 类型的卷。
            secretName: secret-file                                                 #定义了 Secret 的名称,这个 Secret 中存储了用户名和密码。
      restartPolicy: Always
  • 创建服务
kubectl create -f secret-depolyment-busybox-volume.yaml
  • 查看Secret内容
kubectl get secrets 
# NAME                  TYPE                                  DATA   AGE
# default-token-vrnhx   kubernetes.io/service-account-token   3      7d20h
# secret-file           Opaque                                2      10m
  • 验证服务
kubectl exec -it deployment-file-75bd86d4bc-ql27p -- sh
# / # cat /usr/local/password 
# wangminbqu@123/ # 
# / # cat /usr/local/username 
# wangmingqu/ # 

以文件形式挂载–subPath

  • 编辑yaml
apiVersion: v1
kind: Secret                                                                        #表示这是一个 Secret 资源。
metadata:
  name: secret-file                                                                 #定义了 Secret 的名称。
  namespace: default
  labels:
    app: secret-file

stringData:                                                                         #包含了一系列键值对,其中键是 Secret 的键名,值是字符串形式的敏感信息。
  username: "wangmingqu"
  password: "wangminbqu@123"

type: Opaque

---
apiVersion: apps/v1
kind: Deployment                                                                    #表示这是一个 Deployment 资源。
metadata:
  name: deployment-file                                                             #定义了 Deployment 的名称。
  namespace: default
  labels:
    app: deployment-file

spec:
  selector:
    matchLabels:
      app: busybox                                                                  #使用标签选择器 matchLabels: app: busybox 来选择与 Deployment 模板中的 Pod 标签匹配的 Pod。
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:                                                                   #定义了容器模板。
        - name: busybox                                                             #定义了容器的名称。
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
          command:
            - sleep
            - "3600"
          volumeMounts:                                                             #定义了容器挂载的卷。
            - mountPath: /usr/local/                                                #定义了卷的挂载路径。
              name: volume-file                                                     #定义了卷的名称,这个卷将在 volumes 部分定义。
              subPath: username-passowrd.txt                                        #定义了配置文件在卷中的路径,这意味着 Secret 中存储的数据将被挂载到 /usr/local/username-passowrd.txt
      volumes:                                                                      #定义了 Pod 使用的卷。
        - name: volume-file                                                         #定义了卷的名称。
          secret:                                                                   #定义了该卷是一个 Secret 类型的卷。
            secretName: secret-file                                                 #定义了 Secret 的名称,这个 Secret 中存储了用户名和密码。
      restartPolicy: Always
  • 创建服务
kubectl create -f secret-depolyment-busybox-subpath.yaml

Pod拉取私有镜像–ImagePullSecret(命令行)

  • 说明
    • ImagePullSecret可以在Pod拉取私有镜像仓库时使用的账号密码;
    • ImagePullSecret里面的账号信息会传递给kubectl,然后kubectl就可以拉取有账号密码的私有仓库中的镜像;
  • 创建服务
#格式
kubectl create secret docker-registry Secret名称 --docker-server=私有仓库地址 --docker-username=私有仓库账号 --docker-password=私有仓库密码 --docker-email=私有仓库邮箱

#举例
kubectl create secret docker-registry secret-ali-registry --docker-server=registry.cn-beijing.aliyuncs.com/publicspaces/nginx --docker-username=15515190288 --docker-password=cmk521cmk --docker-email=15515190288@163.com
  • 查看Secret
kubectl get secrets 
# NAME                  TYPE                                  DATA   AGE
# default-token-vrnhx   kubernetes.io/service-account-token   3      7d20h
# secret-ali-registry   kubernetes.io/dockerconfigjson        1      6s
# secret-file           Opaque                                2      26m
  • 应用Secret
apiVersion: apps/v1
kind: Deployment                                                                #定义Deployment资源类型
metadata:
  name: deployment-nginx                                                        #定义Deployment的名称
  namespace: default                                                            #定义Deployment所在命名空间
  labels:                                                                       #定义Deployment的标签信息
    app: nginx
    type: web

spec:                                                                           #定义ReplicaSet的信息
  replicas: 3                                                                   #定义Pod中容器的副本数量
  strategy:                                                                     #定义升级、回滚、部署的策略
    type: RollingUpdate                                                         #定义更新策略为滚动更新策略
    rollingUpdate:                                                              #定义更新的策略
      maxSurge: 25%                                                             #定义滚动更新时,一次添加副本数为25%,也可以设置为数字;如果设置为0,那么maxSurge就不能为0
      maxUnavailable: 25%                                                       #定义滚动更新时,最大不可用副本数为25%,也可以设置为数字;如果设置为0,那么maxUnavailable就不能为0
  revisionHistoryLimit: 10                                                      #定义留存副本的历史记录个数,设置为0表示不保留历史数据
  minReadySeconds: 30                                                           #定义在滚动更新时,新Pod在准备就绪后等待30秒后才会开始接收流量,常与探针配合使用
  progressDeadlineSeconds: 600
  selector:                                                                     #selector下的labels要与template的labels保持一致,否则无法管理Pod
    matchLabels:
      app: nginx                                                                #指定标签要与template中标签保持一致,新版本中一旦定义标签后无法修改
  template:                                                                     #template下的labels要与selector的labels保持一致,否则无法管理Pod
    metadata:
      labels:
        app: nginx                                                              #指定标签要与selector中标签保持一致,新版本中一旦定义标签后无法修改
    spec:                                                                       #定义Pod的容器信息
      imagePullSecrets:                                                         #定义使用Secret写入私有仓库账号密码
        - name: secret-ali-registry                                             #指定使用的Secret名称
      containers:                                                               #定义一个Pod的容器
        - name: nginx-web                                                       #定义Pod中容器名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1     #定义Pod中容器拉取的镜像
          imagePullPolicy: IfNotPresent                                         #定义Pod中容器拉取镜像策略
      restartPolicy: Always                                                     #定义Pod中容器的启动策略

热更新

注意事项

  1. ConfigMap和Secret如果是以subPath的形式挂载的,那么Pod不会感知到ConfigMap和Secret的更新;
  2. 如果Pod的变量来自于ConfigMap和Secret中定义的内容,那么ConfigMap和Secret更新后也不会更新Pod中的变量;

ConfigMap热更新

在大多数情况下,使用 kubectl apply 命令是更好的选择,因为它可以自动处理资源版本的更新,而 kubectl set 命令需要你手动指定资源版本。

edit更新

使用edit编辑后等待约10s后将会完成更新,推荐使用apply

#格式
kubectl edit configmap ConfigMap的名称 -n 命名空间

#举例
kubectl edit configmap configmap.yaml -n <namespace>

apply更新

#格式
kubectl apply -f ConfigMap文件 -n 命名空间

#举例
kubectl apply -f configmap.yaml -n <namespace>

replace更新

先调整配置文件,然后将其导出成yaml文件显示在屏幕上,最后将其replace

#格式
kubectl create configmap ConfigMap名称 --from-file=配置文件路径 --dry-run -o yaml | kubectl replace -f 

#举例
kubectl create configmap test-configmap --from-file=/root/configmap/redis.conf --dry-run -o yaml | kubectl replace -f-

Secret热更新

在大多数情况下,使用 kubectl apply 命令是更好的选择,因为它可以自动处理资源版本的更新,而 kubectl set 命令需要你手动指定资源版本。

edit更新

使用edit编辑后等待约10s后将会完成更新,推荐使用apply

#格式
kubectl edit secrets Secret的名称 -n 命名空间

#举例
kubectl edit secrets secret.yaml -n <namespace>

apply更新

#格式
kubectl apply -f Secret文件 -n 命名空间

#举例
kubectl apply -f secret.yaml -n <namespace>

replace更新

先调整配置文件,然后将其导出成yaml文件显示在屏幕上,最后将其replace

#格式
kubectl create secret ConfigMap名称 --from-file=配置文件路径 --dry-run -o yaml | kubectl replace -f-

#举例
kubectl create secret test-configmap --from-file=/root/secret/password.txt --dry-run -o yaml | kubectl replace -f-

不可变(immutable)

概念

容器挂载了ConfigMap或Secret,如果配置出现错误就会更新到容器中导致故障发生。这就需要将ConfigMap和Secret设置成不可变的,所以引入了immutable。

应用

ConfigMap应用immutable

apiVersion: v1
kind: ConfigMap                                                       #定义这是一个ConfigMap的资源
metadata:
  name: test-2-configmap                                              #定义ConfigMap的名称
  namespace: default                                                  #指定了ConfigMap所在命名空间
  labels:
    app: test-2-configmap                                             #定义了 ConfigMap 的标签,可以用于选择器。
data:                                                                 #定义ConfigMap所包含的配置资源
  redis.conf: |                                                       #此处定义了一个redis的配置
    bind 192.168.108.130
    port 6379
    requirepass 1qaz!QAZ
    protected-mode yes
    timeout 0
    databases 16
    daemonize yes
    pidfile /usr/local/redis/pid/redis_6379.pid
    loglevel notice
    logfile "/usr/local/redis/logs/redis.log"
    dir /usr/local/redis/data/
  resolv.conf: |
    nameserver 8.8.8.8
    nameserver 114.114.114.114

immutable: true                                                        #设置ConfigMap不可变

Secret应用immutable

apiVersion: v1
kind: Secret                          #表示这是一个 Secret 资源
metadata:
  namespace: default
  name: secret-up-auth                #定义了 Secret 的名称
  labels:
    app: secret-up-auth

stringData:                           #包含了一系列键值对,其中键是 Secret 的键名,值是加密后的敏感信息。可以自动转译账号密码
  username: wangmingqu                #直接填入账号
  password: WangMingQu@1234567890     #直接写入密码

type: Opaque
immutable: true                       #开启Secret不可变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值