8. 基础篇-K8S配置管理

错误手册

0. Kubernetes-Error

ConfigMap

概念

ConfigMap一般用于管理一些配置文件或者一些环境变量信息。
ConfigMap可以将配置和Pod分开,使配置文件的变更和管理更加便易。
ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

注意事项

  1. ConfigMap 需要在 Pod 启动前创建出来;
  2. 只有当 ConfigMap 和 Pod 处于同一命名空间时,才可以被 Pod 引用;
  3. 当 Pod 挂载 ConfigMap 绑定的目录时,目录并不会挂载到 Pod 内,只有目录下的文件会被挂载;

创建ConfigMap

命令创建ConfigMap

  • 创建configmap
kubectl create configmap nginx-config --from-literal=nginx_pod=80 --from-literal=server_name=test.wang.com

create:创建服务
configmap:指定创建服务类型
nginx-config:指定ConfigMap的名称
–from-literal=:指定配置项

命令指定文件创建ConfigMap

  • 创建key-value目录文件
mkdir -p /root/configmap/
cat >> /root/configmap/nginx.conf << EOF
server {
  server_name test.wang.com;
  listen 80;
}
EOF
cat >> /root/configmap/redis.conf << EOF
listen 6379
daemonize yes
EOF
  • 生成configMap
#将指定一个文件夹下所有配置,创建一个configmap
kubectl create configmap nginx-redis-config --from-file=/root/configmap/
#指定一个文件
kubectl create configmap nginx-redis-config --from-file=/root/configmap/nginx.conf

–from-file=指定某个文件或某个文件夹下的所有文件

yaml创建ConfigMap

  • ConfigMap默认配置文件

configmap.yaml

  • 编辑yaml配置文件
apiVersion: v1
#指定资源类型
kind: ConfigMap
metadata:
  #指定configmap的名称
  name: nginx-config-test
  #支持configmap的标签
  labels:
    app: nginx-config-test
#指定configmap的配置数据
data:
  #指定一段configmap的资源(要注意“|”是必要项)
  nginx.conf: |
    server {
      server_name test.bin.com;
      listen 80;
    }
  #指定另一段configmap的资源(要注意“|”是必要项)
  redis.conf: |
    listen 6379
    daemonize yes
  • 生成ConfigMap
kubectl apply -f /root/configmap-nginx.yaml

查看ConfigMap

查看configmap名称

kubectl get configmaps

查看configmap内容

kubectl describe configmaps nginx-config

configmap内容

Name:         nginx-redis-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx.conf:
----
server {
  server_name test.wang.com;
  listen 80;
}

nginx.properties:
----
servername=www.baidu.com
path=/var/log/nginx/
user=nginx
group=nginx

redis.conf:
----
listen 6379
daemonize yes

Events:  <none>

应用ConfigMap

以变量形式进行挂载

  • 创建yaml文件
apiVersion: v1								# API 版本 (使用 kubectl explain ConfigMap(具体类型) 即可查看到对应版本号)
kind: ConfigMap								# 类型为 ConfigMap
metadata:
  name: configmap-busybox					# ConfigMap 的名称 (绑定时需要用到)
data:
  hostname: "192.169.1.211"					# Key 和 Value
  password: "1qaz!QAZ"
  hostport: "3306"
  describe: "test configmap busybox print"
---
apiVersion: v1
kind: Pod
metadata:
  name: buxybox
spec:
  containers:
  - name: buxybox
    image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
    imagePullPolicy: IfNotPresent
    command: ['/bin/sh','-c','env']
    env:									# 配置环境变量
    - name: HostName						# 变量名
      valueFrom:
        configMapKeyRef:
          name: configmap-busybox			# ConfigMap 名称 (要和上面对应)
          key: hostname						# ConfigMap 里边的 Key (要和上面对应)
    - name: Password
      valueFrom:
        configMapKeyRef:
          name: configmap-busybox
          key: password
    - name: HostPort
      valueFrom:
        configMapKeyRef:
          key: hostport
          name: configmap-busybox
    - name: Describe
      valueFrom:
        configMapKeyRef:
          key: describe
          name: configmap-busybox
  • 生成Pod
kubectl create -f configmap-busybox.yaml
  • 检查变量
kubectl logs buxybox | egrep 'HostName|Password|HostPort|Describe'

以变量形式批量挂载

  • 创建yaml文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  MYSQL_ROOT_PASSWORD: wang123
  mysql.conf: |
    [client]
    port = 3306
    socket = /var/run/mysqld/mysqld.sock
    [mysqld]
    port = 3306                       # 监听端口
    datadir = /var/lib/mysql          # 数据库存储目录
    socket = /var/run/mysqld/mysqld.sock
    skip_name_resolve = ON            # 禁用DNS解析,提高查询性能
    max_connections = 1000            # 最大连接数
    max_allowed_packet = 16M          # 最大允许的数据包大小
    innodb_buffer_pool_size = 128M    # InnoDB缓存大小
    [mysqld_safe]
    pid-file=/var/run/mysqld/mysqld.pid
    log-error=/var/log/mysql/mysql-error.log
    [mysql]
    default-character-set=utf8mb4
    [mysqldump]
    default-character-set=utf8mb4
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-dep
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 1 #设置副本数量为1,可以根据需求调整
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql-8 # 容器名称为mysql-container,可以自定义修改成你想要的名字。
          image: registry.cn-beijing.aliyuncs.com/publicspaces/mysql:8.0.27 # 使用 MySQL 镜像
          envFrom:
            - configMapRef:
                name: mysql-cm # 引用上面定义的 ConfigMap
          ports:
            - containerPort: 3306 # 暴露容器端口号为3306,外部应用程序可以通过此端口访问MySQL服务。
  • 生成pod
kubectl create -f /root/mysql/cm-mysql.yaml
  • 检查变量
kubectl exec -it mysql-deployment-585fc8c567-lpbnf -- mysql -uroot -p'wang123'
SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

以volume形式挂载

  • 创建yaml文件
kind: ConfigMap
apiVersion: v1
metadata:
  name: redis-config        # ConfigMap 名称
  namespace: default
  labels:
    app: redis
data:
  redis.conf: |
    dir /data/
    port 6379
    bind 0.0.0.0
    appendonly no
    protected-mode no
    pidfile /data/redis-6379.pid

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: default
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  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/etc/redis/redis.conf"
          ports:
            - containerPort: 6379
          volumeMounts:
            - name: config        # 挂载的目录名称
              mountPath: /usr/local/etc/redis/  #注意此挂载会覆盖整个目录
       volumes:
        - name: config            # 挂载的目录名称 (要和上面对应)
          configMap:
            name: redis-config    # ConfigMap 名称 (要和上面对应)
  • 生成pod
kubectl create -f /root/redis/cm-redis.yaml
  • 检查变量
kubectl exec -it redis-564f9dcf4b-v4ch5 -- redis-cli
127.0.0.1:6379> CONFIG GET bind
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379> 

以volume形式的subpath挂载

  • 注意
  1. 以volume形式挂载会影响整个挂载的目录。
  2. 可以使用subpath参数指定某个文件,从而减少影响范围。
  3. 使用subpath参数挂载的无法实现热更新。
  • 创建yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: redis-config        # ConfigMap 名称
  namespace: default
  labels:
    app: redis
data:
  redis.conf: |
    dir /data/
    port 6379
    bind 0.0.0.0
    appendonly no
    protected-mode no
    pidfile /data/redis-6379.pid

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: default
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  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/etc/redis/redis.conf"
          ports:
            - containerPort: 6379
          volumeMounts:
            - name: config        # 挂载的目录名称
              mountPath: /usr/local/etc/redis/
              subPath: redis.conf
       volumes:
        - name: config            # 挂载的目录名称 (要和上面对应)
          configMap:
            name: redis-config    # ConfigMap 名称 (要和上面对应)
  • 生成pod
kubectl create -f /root/redis/cm-redis.yaml
  • 检查变量
kubectl exec -it redis-564f9dcf4b-v4ch5 -- redis-cli
127.0.0.1:6379> CONFIG GET bind
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379> 

Secret

概念

secret用于存储和管理一些敏感数据,比如密码、token、秘钥等。
secret有三种类型:

  1. Opaque:base64编码格式的secret,主要用于存储密码、秘钥等。数据可以通过base64-decode解码得到原始数据。
  2. Service Account:用于访问kubernetes api,是由kubernetes自动创建的,并会自动挂载到pod的/run/secrets/kubernetes.io/serviceaccount 目录中。
  3. Kubernetes.io/dockerconfigjson:用于存储私有docker registry的认证信息。

secret有三种加密方式:

  1. generic(通用的):保存密码数据等用它就可以;
  2. tls:保存私钥和证书;
  3. docker-registry:保存docker-registry的认证信息;

注意事项

  • Opaque:可以解密,解密方式如:echo “MXFhekBXU1gzZWRjCg==” | base64 -d;可以加密,加密方式如:echo -n ‘wang123’ | base64
  • 通过volume使用时可以在线更新,通过env不能在线更新。

创建Secret

命令创建Secret

  • 创建Secret
kubectl create secret generic admin-sc --from-literal=password='1qaz!QAZ'

create:创建资源
secret:指定创建资源的类型
generic:指定secret使用的密码保存方式
admin-sc:指定secret的名称
–from-literal=:指定密码

命令指定文件创建Secret

  • 创建key-value目录文件
mkdir /root/secret-password
echo "1qaz@WSX3edc$RFV" > /root/secret-password/admin.password
echo "Wang@ming_Qu123" > /root/secret-password/user.password
  • 生成Secret
#将指定一个文件夹下所有配置,创建一个secret
kubectl create secret generic all-user --from-file=/root/secret-password/
#指定一个文件
kubectl create secret generic admin-user --from-file=/root/secret-password/admin.password

–from-file=指定某个文件或某个文件夹下的所有文件

yaml创建Secret

  • Secret默认配置文件

secret.yaml

  • 编辑yaml配置文件
apiVersion: v1
#手动加密方式
data:
  wang.password: d2FuZzEyMw==
  ming.password: bWluZzEyMw==
  qu.password: cXUxMjM=
# #自动加密方式
# stringData:
#   username: administrator
#   password: Yl5t2mt
kind: Secret
metadata:
  name: admin-sec
  namespace: default
type: Opaque

注意:data和stringData同时出现时,仅stringData生效,因为stringData的优先级更高。

  • 生成Secret
kubectl create -f /root/secret-user.yaml

查看Secret

查看Secret名称

kubectl get secrets

查看Secret内容

kubectl describe secrets admin-sc

查看Secret的yaml

kubectl get secrets admin-sc -o yaml

Secret内容

Name:         admin-sc
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  8 bytes

应用Secret

以变量的形式进行挂载

  • 创建yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret-nginx
  namespace: default
stringData:
  username: wangmingqu
  password: "1234567890"
type: Opaque

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: default
  name: redis-dev
spec:
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
          imagePullPolicy: IfNotPresent
          env:
            - name: UserName
              valueFrom:
                secretKeyRef:
                  key: username
                  name: secret-nginx
            - name: Password
              valueFrom:
                secretKeyRef:
                  key: password
                  name: secret-nginx
  • 生成pod
kubectl create -f /root/secret-password/redis.yaml
  • 检查密码
kubectl exec -it redis-dev-5597b7c5c8-9kcr8 -- /bin/bash
echo $UserName
echo $Password

以volume形式挂载

  • 创建yaml
kind: Secret
apiVersion: v1
metadata:
  name: redis-secret        # Secret 名称
  namespace: default
  labels:
    app: redis
stringData:
  username: wangmingqu
  password: 12qwas!@QWAS

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: default
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
       containers:
        - name: redis
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
          ports:
            - containerPort: 6379
          volumeMounts:
            - name: secret        # 挂载的目录名称
              mountPath: /etc/redis/  #注意此挂载会覆盖整个目录
       volumes:
        - name: secret            # 挂载的目录名称 (要和上面对应)
          secret:
            secretName: redis-secret   # Secret 名称 (要和上面对应)
  • 生成pod
kubectl create -f /root/redis/redis.yaml
  • 检查密码
kubectl exec -it redis-595765bb79-v6rcr -- cat /etc/redis/password
kubectl exec -it redis-595765bb79-v6rcr -- cat /etc/redis/username
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值