k8s配置管理--configmap与secret

configmap

概述

定义:
Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的
形式保存,也可通过文件的形式保存。

作用:
我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache 等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s 中引入了 Configmap资源对象,可以当成 volume 挂载到 pod 中,实现统一的配置管理。

特点:
1、Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;
2、Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上;
3、容器中应用程序按照原有方式读取容器特定目录上的配置文件;
4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

知识结构图:
在这里插入图片描述

创建方法

命令行直接创建

直接在命令行中指定 configmap 参数创建,通过–from-literal 指定参数
例:

 kubectl create configmap tomcat-config from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
 kubectl describe configmap tomcat-config                            # 查看configmap内容

在这里插入图片描述

通过文件创建

通过指定文件创建一个 configmap,–from-file=<文件>

vim nginx.conf

server {
 server_name www.nginx.com;
 listen 80;
 root /home/nginx/www/
}
 kubectl create configmap www-nginx --from-file=www=./nginx.conf     # 定义一个 key 是 www,值是 nginx.conf 中的内容
 kubectl describe configmap www-nginx                                # 查看

在这里插入图片描述

指定目录创建 configmap

 mkdir test-a 
 cd test-a/
 cat my-server.cnf
 
 server-id=1
 cat my-slave.cnf

 server-id=2
kubectl create configmap mysql-config --from-file=/root/test-a/     # 指定目录创建 configmap
kubectl describe configmap mysql-config

在这里插入图片描述

编写 configmap 资源清单 YAML 文件

cat mysql-configmap.yaml
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

使用 Configmap

通过环境变量引入:使用 configMapKeyRef

vim mysql-configmap.yaml                                            # 创建一个存储 mysql 配置的 configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  log: "1"
  lower: "1"
kubectl apply -f mysql-configmap.yaml                              # 应用configmap

创建 pod,引用 Configmap 中的内容,yaml文件内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: busybox
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    env:
    - name: log_bin                                                # 定义环境变量 log_bin
      valueFrom: 
        configMapKeyRef:
        name: mysql                                                # 指定 configmap 的名字
        key: log                                                   # 指定 configmap 中的 key
    - name: lower                                                  # 定义环境变量 lower
      valueFrom:
        configMapKeyRef:
          name: mysql
          key: lower
  restartPolicy: Never
kubectl apply -f mysql-pod.yaml                                    # 应用pod

通过环境变量引入:使用 envfrom

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-envfrom
spec:
  containers:
  - name: mysql
    image: busybox
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    envFrom: 
    - configMapRef:
      name: mysql                                                   # 指定 configmap 的名字
  restartPolicy: Never
kubectl apply -f mysql-pod-envfrom.yaml                             # 应用pod

把 configmap 做成 volume,挂载到 pod

cat mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
  app: mysql
data:
  log: "1"
  lower: "1"
  my.cnf: |
    [mysqld]
    Welcome=hello
kubectl apply -f mysql-configmap.yaml                               # 更新资源清单

创建pod,将configmap做成volume并挂载。

vim mysql-pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  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
  restartPolicy: Never

Secret

概述

Secret 解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。

secret 可选参数有三种:

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

Secret 类型:

  1. Service Account:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中。

  2. Opaque:base64 编码格式的 Secret,用来存储密码、秘钥等。可以通过 base64 --decode 解码
    获得原始数据,因此安全性弱。

  3. kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息。

创建及使用

通过环境变量引入 Secret

把 mysql 的 root 用户的 password 创建成 secret

kubectl create secret generic mysql-password --from-literal=password=pod**lucky66
kubectl describe secret mysql-password                              # 查看secret详细信息

创建 pod,引用 secret

vim pod-secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    env:
    - name: MYSQL_ROOT_PASSWORD                                     # 它是 Pod 启动成功后,Pod 中容器的环境变量名.
      valueFrom:
        secretKeyRef:
          name: mysql-password                                      # 这是 secret 的对象名
          key: password                                             # 它是 secret 中的 key 名

进入pod查看环境变量 MYSQL_ROOT_PASSWORD 的值为 pod**lucky66

通过 volume 挂载 Secret

创建 Secret

手动加密,基于 base64 加密

 echo -n 'admin' | base64
 YWRtaW4=
 echo -n 'xuegod123456f' | base64
 eHVlZ29kMTIzNDU2Zg==

解码:

echo eHVlZ29kMTIzNDU2Zg== | base64 -d
创建 yaml 文件
vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: eHVlZ29kMTIzNDU2Zg==
kubectl apply -f secret.yaml                                        # 更新资源清单
将 Secret 挂载到 Volume 中
vim pod_secret_volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-secret-volume
spec:
  containers:
  - name: myapp
    image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: mysecret
kubectl apply -f pod_secret_volume.yaml

进入pod可以看到/etc/secret下有password和username两个文件,查看内容和我们创建的secret内容吻合。

私有镜像仓库secret

创建
kubectl create secret docker-registry registry-pull-secret --docker-server=192.168.1.62 --docker-username=admin --docker-password=Harbor12345
# docker-registry                    为secret参数,指定创建的secret用于docker仓库的认证
# registry-pull-secret               为创建的secret名称
# --docker-server=192.168.1.62       指定私有仓库地址
# --docker-username=admin            指定私有仓库用户名
# --docker-password=Harbor12345      指定私有仓库密码
使用

/etc/docker/daemon.json添加如下内容:

 "insecure-registries":["192.168.1.62","harbor"]

重启 docker 使配置生效

systemctl daemon-reload && systemctl restart docker && systemctl status docker

登录到私有仓库,输入账号、密码。(前提是私有仓库已搭建好,并创建了项目、上传了镜像)

docker login 192.168.1.62                   

创建pod,使用仓库中的镜像,并指定拉取镜像时用的secret。

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
spec:
  containers:
  - name: myapp
    image: 192.168.1.62/test/myapp:v1                              # 指定私有仓库中的镜像
    imagePullPolicy: IfNotPresent
  volumes:
  - name: secret-volume
    secret:
      secretName: mysecret
  imagePullSecrets:                                                # 指定拉取镜像用到的secret
  - name: registry-pull-secret
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值