K8S配置管理 ConfigMap和Sercret


K8S配置管理 ConfigMap和Sercret

一、ConfigMap

1、ConfigMap的基本介绍

ConfigMap 是 Kubernetes 中的一种资源对象,用于存储应用程序的配置数据。它可以用于将配置信息与应用程序的 Pod 解耦,从而实现配置的动态管理和灵活性。
以下是 ConfigMap 的一些基本介绍和特点:
1、存储配置数据:ConfigMap 可以存储各种类型的配置数据,例如环境变量、命令行参数、配置文件等。它将配置数据以键值对的形式组织,并提供一个唯一的名称供应用程序使用。
2、解耦配置与应用程序:ConfigMap 允许将应用程序的配置从应用程序本身中分离出来,以实现配置和应用程序的解耦。这样,配置可以在不重启应用程序的情况下进行修改和更新,提供了更好的灵活性和可维护性
3、应用程序访问配置:应用程序可以通过环境变量、命令行参数或在容器内挂载配置文件的方式来访问 ConfigMap 中的配置数据。这使得应用程序可以在运行时动态地获取和使用配置信息。
4、容易管理和更新:ConfigMap 的配置数据可以通过命令行工具(如 kubectl)或使用Kubernetes 的 API 进行创建、更新和删除。这使得管理和更新配置变得简单和可扩展,可以与应用程序的部署和扩展自动化流程结合使用。
5、与 Pod 的关联:ConfigMap 可以与 Pod 进行关联,以便将配置数据传递给 Pod 中的容器。您可以通过将 ConfigMap 挂载为容器的卷(Volume)或设置容器的环境变量来实现配置的传递。
总而言之,ConfigMap 是 Kubernetes 中的一种资源对象,用于存储应用程序的配置数据。它通过解耦配置和应用程序,提供了配置的动态管理和灵活性。使用 ConfigMap,您可以轻松地管理和更新应用程序的配置,同时使配置与应用程序的部署和扩展过程解耦。

2、ConfigMap的创建方法

1.直接在命令行创建
kubectl create configmap nginx --from-literal=tomcat_port=90 --from-literal=server_name=myapp.nginx.com
kubectl describe configmap nginx
Name:         nginx
Namespace:    default
Labels:       <none>
Annotations:  <none>
Data
====
tomcat_port:
----
90
server_name:
----
myapp.nginx.com
BinaryData
====
Events:  <none>
2.通过文件创建
vim nginx.conf
server {
 server_name www.nginx.com;
 listen 80;
}
kubectl create configmap nginx --from-file=www=./nginx.conf 
kubectl describe cm nginx
Name:         nginx
Namespace:    default
Labels:       <none>
Annotations:  <none>
Data
====
www:
----
server {
 server_name www.nginx.com;
 listen 80;
}
BinaryData
====
Events:  <none>
3.编写configmap
cat mysql-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysqlconfig
  labels:
    app: mysql
data:
  mysqlConfig: '123'
kubectl apply -f mysql-cm.yaml
kubectl describe cm mysqlconfig
Name:         mysqlconfig
Namespace:    default
Labels:       app=mysql
Annotations:  <none>
Data
====
mysqlConfig:
----
123
BinaryData
====
Events:  <none>

3、使用ConfigMap

1.通过环境变量引入(单个)

创建一个存储MySQL配置的configmap
cat mysql.yaml 
---
apiVersion: v1
kind: ConfigMap
data:
  log: "1"
  lower: "1"
metadata:
  name: mysql-config
  labels:
    app: mysql
创建pod引用Configmap中的内容
cat mysql-pod.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: mysqlpod
  labels:
    app: mysql
spec:
  containers:
  - name: mysql
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    env:
    - name: log_bin    #定义环境变量log_bin
      valueFrom:
        configMapKeyRef: 
          name: mysql-config    #指定configMap的名字
          key: log              #指定ConfigMap中的key
    - name: lower      #定义环境变量lower
      valueFrom:
        configMapKeyRef:
          name: mysql-config    #指定configMap的名字
          key: lower            #指定ConfigMap中的key
进入pod
kubectl exec mysqlpod  -it -- /bin/sh
查看环境变量是否存在
/ # printenv | grep lower
lower=1
/ # printenv | grep log
log_bin=1
2.通过环境变量引入(整个configmap)

cat mysql-pod.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: mysqlpod
  labels:
    app: mysql
spec:
  containers:
  - name: mysql
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    envFrom:
    - configMapRef:
        name: mysql-config
  restartPolicy: Never
测试:
kubectl exec mysqlpod  -it -- /bin/sh
/ # printenv | grep log
log=1
/ # printenv | grep lower
lower=1
/ # exit
3.把ConfigMap做成volume,挂载到Pod

创建ConfigMap
cat mysql-1.yaml 
---
apiVersion: v1
kind: ConfigMap
data:
  log: "1"
  lower: "1"
  my.cnf: |
    [mysqld]
    Welcome=IW
metadata:
  name: mysql-1
  labels:
    app: mysql
创建Pod
cat mysql-pod-volume.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: mysql-pod-volume
  labels:
    name: mysql-pod-volume
spec:
  containers:
  - name: mysql
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    volumeMounts:
    - name: mysql-config
      mountPath: /tmp/config
  volumes:
  - name: mysql-config
    configMap: 
      name: mysql-1
  restartPolicy: Never
测试:
kubectl exec mysql-pod-volume  -it -- /bin/sh
/ # ls /tmp/config/
log     lower   my.cnf
/ # cat /tmp/config/log 
/ # cat /tmp/config/log 
1/ # 
/ # cat /tmp/config/lower 
1/ # 
/ # cat /tmp/config/my.cnf  
[mysqld]
Welcome=IW

4、ConfigMap热更新


kubectl edit cm mysql-1
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  log: "2"         #这里将1修改为2
  lower: "1"
  my.cnf: |
    [mysqld]
    Welcome=IW
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"log":"1","lower":"1","my.cnf":"[mysqld]\nWelcome=liangxi\n"},"kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app":"mysql"},"name":"mysql-1","namespace":"default"}}
  creationTimestamp: "2024-03-01T07:19:22Z"
  labels:
    app: mysql
  name: mysql-1
  namespace: default
  resourceVersion: "435348"
  uid: 9c5plc69-7249-3786-b756-3344ddjgmbc5
测试:
cat /tmp/config/log 
2

#####注意######
更新 ConfigMap 后:
使用该 ConfigMap 挂载的 Env 不会同步更新
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概 10 秒)才能同步更新
ENV 是在容器启动的时候注入的,启动之后 kubernetes 就不会再改变环境变量的值,且同一个namespace 中的 pod 的环境变量是不断累加的,为了更新容器中使用 ConfigMap 挂载的配置,可以通过滚动更新 pod 的方式来强制重新挂载 ConfigMap,也可以在更新了 ConfigMap 后,先将副本数设置为 0,再扩容 pod

二、Secret

1.Secret描述

Kubernetes (k8s) Secrets 是 Kubernetes 集群中的一种资源对象,用于存储和管理敏感信息,例如密码、令牌、API 密钥和证书等。
Kubernetes Secrets 的主要目的是将敏感数据与应用程序代码分离,并提供一种安全的方式来存储和传递这些敏感数据给容器化的应用程序。它们以加密的形式保存,并且只能在需要时才能被解密和使用。
以下是关于 Kubernetes Secrets 的一些基本特点和用法:
1、类型:Kubernetes Secrets 可以存储任意字节的数据,但通常用于存储字符串格式的敏感信息。
2、创建和管理:可以使用 Kubernetes 命令行工具(kubectl)或 Kubernetes API 来创建和管理Secrets。
3、加密和解密:Kubernetes Secrets 会将存储的敏感数据加密,并使用 Base64 编码进行存储。在使用 Secrets 时,Kubernetes 会自动将其解码并将解密的值提供给应用程序。
4、Secret 类型:Kubernetes 提供了几种不同的 Secret 类型,包括:
1)Opaque:适用于存储任意类型的敏感数据,默认情况下以 Base64 编码进行存储。
2)Service Account:用于将 Pod 与 Service Account 关联,并将 Service Account 的 Token注入到 Pod 中,以便 Pod 可以与 Kubernetes API 进行交互。
3)Docker Registry:用于存储与私有 Docker 注册表的认证信息,以便 Kubernetes 可以拉取私有镜像。
4)TLS:用于存储 TLS 证书和私钥。
5、使用 Secrets:在 Kubernetes 中使用 Secrets 时,可以通过环境变量、挂载文件或通过卷的方式将其传递给 Pod 中的应用程序。
1)环境变量:可以将 Secret 的值作为环境变量传递给应用程序。
2)挂载文件:可以将 Secret 中的值以文件的形式挂载到 Pod 中,应用程序可以读取这些文件。
3)通过卷:可以将 Secret 中的值作为卷挂载到 Pod 中,应用程序可以从该卷中读取敏感数据。
Kubernetes Secrets 提供了一种安全和可扩展的方式来管理敏感数据,并帮助将敏感信息与应用程序代码分离,从而更好地保护应用程序和集群的安全性。

2.Secret的创建方式

1.通过命令行创建Secret

kubectl create secret generic mysql-password --from-literal=password=1
kubectl describe secret mysql-password
Name:         mysql-password
Namespace:    default
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
password:  7 bytes
2.编写yaml文件
手动加密,基于base64加密
[root@master configmap]# echo -n 'admin' | base64
YWRtaW4=
[root@master configmap]# echo -n '1' | base64
MQ==
解码:
[root@master configmap]# echo MQ== | base64 -d
1
编写yaml文件
cat secret.yaml 
---
apiVersion: v1
kind: Secret
data:
  username: YWRtaW4=
  password: MQ==
type: Opaque
metadata:
  name: secret
查看资源详细信息
kubectl describe secret secret
Name:         secret
Namespace:    default
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
password:  1 bytes
username:  5 bytes

3.使用secret

1.通过环境变量引入
cat pod-secret.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-secert
spec:
  containers:
  - name: myapp
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-password
          key: password
测试:
kubectl exec -it pod-secert -- /bin/sh
/ # printenv | grep MYSQL
MYSQL_ROOT_PASSWORD=1
2.通过volume挂载Secret
cat pod_secret_volume.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-secret-volume
spec:
  containers:
  - name: myapp
    image: busybox
    command: ["/bin/sh","-c","sleep 3600"]
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: secret
测试:
kubectl exec -it pod-secret-volume -- /bin/sh
/ # ls /etc/secret/
..2024_03_01_09_21_27.3393208461/  password
..data/                            username
/ # cat /etc/secret/password 
1/ # 
/ # 
/ # cat /etc/secret/username 
admin/ # 

文章作者: IW
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 IW !
  目录