k8s配置资源管理

Secret的资源配置

Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。

Secret 有三种类型:

  1. kubernetes.io/service-account-token:由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;

  2. Opaque :base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的 Secret 类型;

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

Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:

  1. 作为挂载到一个或多个容器上的卷 中的文件。

  2. 作为容器的环境变量。

  3. 由 kubelet 在为 Pod 拉取镜像时使用。

陈述式创建Secret配置

Secret 的创建是根据文件中保存到相应信息,进行。例如我们要通过一个用户名文件和密码文件来创建具体的Secret资源配置。

#首先准备好相对应的用户和密码文件

#echo 中 "-n" 选项为不换行

echo -n 'zhangsan'>username.txt

echo -n 'abc1234'>passwd.txt

#进行陈述创建secret配置

kubectl create secret generic mysecret --from-file=username.txt --from-file=passwd.txt

kubectl describe secrets mysecret

声明式+base64编码创建Secret

echo zhangsan|base64

echo abc1234|base64

#对已存在的secret资源进行模板导入yaml文件

kubectl get secrets mysecret -o yaml >secrets-demo.yaml

#对模板进行修改编辑

vim secrets-demo.yaml

apiVersion: v1

kind: Secret

metadata:

name: mysecret1

namespace: default

type: Opaque

data:

username: emhhbmdzYW4K

passwd: YWJjMTIzNAo=

kubectl apply -f secrets-demo.yaml

将secret以volume形式挂载到pod中

#创建一个pod模板,对其进行修改编辑

kubectl run nginx --image=nginx:1.14 --dry-run=client -o yaml > secret-test.yaml

vim scret-test.yaml

apiVersion: v1

kind: Pod

metadata:

name: mypod

spec:

containers:

  • image: nginx:1.14

name: nginx

volumeMounts:

  • name: secrets

mountPath: "/opt/secrets"

readOnly: true

volumes:

  • name: secrets

secret:

secretName: mysecret1

kubectl creat -f scret-test.yaml

将Secret导入到pod中,充当环境变量

#复制上一个模板,进行修改编辑

cp secret-test.yaml secret-env.yaml

#进行编辑修改

vim secret-env.yaml

apiVersion: v1

kind: Pod

metadata:

name: mypod

spec:

containers:

  • image: nginx:1.14

name: nginx

env:

  • name: TEST_USER

valueFrom:

secretKeyRef:

name: mysecret1

key: username

  • name: TEST_PASSWD

valueFrom:

secretKeyRef:

name: mysecret1

key: passwd

envFrom:

  • secretRef:

name: mysecret1

kubectl create -f secret-env.yaml

ConfigMap资源配置

使用目录来创建configMap资源

创建一个目录并且在一个目录中填写两个文件:

mkdir /opt/configmap/

vim /opt/configmap/game.config

enemy.types=aliens,monsters

player.maximum-lives=5

vim /opt/configmap/ui.config

color.good=purple

color.bad=yellow

allow.textmode=true

ls /opt/configmap/

kubectl create configmap game-config --from-file=/opt/configmap/

//--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容

使用文件创建configMap资源

#只要指定为一个文件就可以从单个文件中创建 ConfigMap

--from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的

kubectl create configmap game-config2 --from-file=/opt/configmap/game.config --from-file=/opt/configmap/ui.config

直接使用参数创建confidenceMap资源

#使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次

kubectl create configmap special-config --from-literal=name=zhangsan --from-literal=sex=man

pod利用configMap资源

使用 ConfigMap 来替代环境变量

vim env.yaml

apiVersion: v1

kind: ConfigMap

metadata:

name: special-config

namespace: default

data:

special.how: very

special.type: good


apiVersion: v1

kind: ConfigMap

metadata:

name: env-config

namespace: default

data:

log_level: INFO

kubectl create -f env.yaml

创建pod,并且引用configMap资源

vim test-pod.yaml

apiVersion: v1

kind: Pod

metadata:

name: test-pod

spec:

containers:

  • name: busybox

image: busybox:1.28.4

command: [ "/bin/sh", "-c", "env" ]

env:

  • name: SPECIAL_HOW_KEY

valueFrom:

configMapKeyRef:

name: special-config

key: special.how

  • name: SPECIAL_TYPE_KEY

valueFrom:

configMapKeyRef:

name: special-config

key: special.type

envFrom:

  • configMapRef:

name: env-config

restartPolicy: Never

使用 ConfigMap 设置命令行参数

vim test-pod2.yaml

apiVersion: v1

kind: Pod

metadata:

name: test-pod2

spec:

containers:

  • name: busybox

image: busybox:1.28.4

command:

  • /bin/sh

  • -c

  • echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"

env:

  • name: SPECIAL_HOW_KEY

valueFrom:

configMapKeyRef:

name: special-config

key: special.how

  • name: SPECIAL_TYPE_KEY

valueFrom:

configMapKeyRef:

name: special-config

key: special.type

envFrom:

  • configMapRef:

name: env-config

restartPolicy: Never

kubectl create -f test-pod2.yaml

通过数据卷插件使用ConfigMap

在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容

vim test-pod3.yaml

apiVersion: v1

kind: Pod

metadata:

name: test-pod3

spec:

containers:

  • name: busybox

image: busybox:1.28.4

command: [ "/bin/sh", "-c", "sleep 36000" ]

volumeMounts:

  • name: config-volume

mountPath: /etc/config

volumes:

  • name: config-volume

configMap:

name: special-config

restartPolicy: Never

##volumes字段中如果configMap中我们只想指定其中的一部分配置

可以通过:

items:

  • key: xx

path: xxx/xxxx

  • key: xxx

path: xxxx/xxxx

通过configMap实现单独挂载pod中的nginx.conf配置

#首先获取nginx.conf 下载或则之前保存都可以
#nginx.conf 在/opt/conf/ 下
kubectl create cm mycm-nginx --from-file=/opt/conf

vim pod-demo1.yaml

apiVersion: v1

kind: Pod

metadata:

name: mypod

spec:

volumes:

  • name: nginx

configMap:

name: mycm-nginx

containers:

  • image: nginx:1.14

name: nginx

volumeMounts:

  • name: nginx

mountPath: /etc/nginx/nginx.conf

subPath: nginx.conf #subPath 可以实现只覆盖修改该文件,而不影响目录

kubectl apply -f pod-demo1.yaml

volume挂载的configMap的热更新

#创建一个cm资源

kubectl create configmap name-config --from-literal=name=zhangsan

#创建一个pod,并且通过volume的方式挂载configMap中的name-config

vim pod-demo1.yaml

apiVersion: v1

kind: Pod

metadata:

name: namepod

spec:

volumes:

  • name: update-test

configMap:

name: name-config

containers:

  • image: nginx:1.14

name: mypod

volumeMounts:

  • name: update-test

mountPath: /opt/name.txt

kubectl apply -f pod-demo1.yaml

进行实时更新修改(开启另一个终端):

kubectl edit cm name-config

PS:更新 ConfigMap 后:
●使用该 ConfigMap 挂载的 Env 不会同步更新。
●使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。

总结

使用 Secret 资源

挂载的方式

在 pod.spec.volumes 字段中定义卷类型为 secret

在 pod.spec.containers.volumeMounts 字段中把存储卷挂载到指定的容器目录,secret资源数据的key将以文件名的形式存在,value为文件内容

容器环境变量引用的方式

pod.spec.containers.env.name 字段中自定义容器的环境变量名

在.containers.env.valueFrom.secretKeyRef.name字段中指定secret资源的名称,.containers.env.valueFrom.secretKeyRef.key字段中指定这个secret资源数据的key, 从而确定引用那个secret资源的key的value作为这个环境变量的值

在 .containers.envFrom.secretRef.name 字段中指定secret资源的名称,可实现使用secret资源数据的key作为容器环境变量名,value作为这个环境变量的值

K8S从私有仓库拉取镜像时使用

在 pod.spec.imagePullSecrets 字段中指定 kubernetes.io/dockerconfigjson 类型的 secret 资源来作为连接私有仓库的认证信息

ConfigMap 简称 cm ,保存配置文件 环境变量 命令行参数 之类的不需要加密的信息

创建 cm 资源

kubectl create cm XXX --from-file=文件/目录 --from-literal=变量的键值对(key=value)

查看cm资源的数据,数据以明文格式显示key的value

kubectl describe cm XXX 或 kubectl get cm XXX -o yaml

使用 cm 资源

容器环境变量引用的方式

env 指定自定义的环境变量名,通过指定的cm资源名称和key来给这个变量赋值

envFrom 直接使用cm资源的key作为容器的环境变量名,key的value作为这个变量的值

挂载的方式

volumes 定义卷类型为 configMap ,使用 items 字段可以自定义挂载的文件的子目录和文件名

volumeMounts 把卷挂载到容器目录。cm资源数据中的key以文件名的形式存在,value为文件内容

使用 subPath 指定文件名,实现只把卷挂载到指定的文件名上

cm资源热更新

更新cm资源的数据可以同步更新通过挂载的方式使用cm资源数据的Pod中的配置(注:使用subPath挂载的文件不会更新)

如果使用env或envFrom引用环境变量的方式,是不会同步更新Pod中的配置

相关推荐
秀儿y5 分钟前
单机服务和微服务
java·开发语言·微服务·云原生·架构
运维&陈同学5 小时前
【Beats01】企业级日志分析系统ELK之Metricbeat与Heartbeat 监控
运维·elk·elasticsearch·云原生·kibana·heartbeat·metricbeat
AKA小徐6 小时前
Debian12使用RKE2离线部署3master2node三主两从的k8s集群详细教程
kubernetes·rancher·rke2
老大白菜13 小时前
Windows 11 安装 Dify 完整指南 非docker环境
windows·docker·容器
tntlbb17 小时前
Ubuntu20.4 VPN+Docker代理配置
运维·ubuntu·docker·容器
Gabriel_liao17 小时前
Docker安装Neo4j
docker·容器·neo4j
有一个好名字17 小时前
zookeeper分布式锁模拟12306买票
分布式·zookeeper·云原生
Anna_Tong20 小时前
云原生大数据计算服务 MaxCompute 是什么?
大数据·阿里云·云原生·maxcompute·odps
豆豆豆豆变20 小时前
Docker轻量级可视化工具Portainer
docker·容器·自动化运维
花晓木20 小时前
k8s etcd 数据损坏处理方式
容器·kubernetes·etcd