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中的配置

相关推荐
chuanauc5 小时前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉5 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信5 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记5 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花5 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay5 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu5 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记10 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样14 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家15 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook