内容预知
1.Secret的资源配置
1.1 Secret配置的相关说明
1.2 陈述式创建Secret配置
1.3 声明式+base64编码创建Secret
1.4 将secret以volume形式挂载到pod中
1.5 将Secret导入到pod中,充当环境变量
1.6 实战运用:使用secret配置免密交互拉取habor私有仓库镜像
进行私有仓库的secret资源创建
引用secret资源拉取私有仓库镜像创建pod
2.ConfigMap资源配置
2.1 使用目录来创建configMap资源
2.2 使用文件创建configMap资源
2.3 直接使用参数创建confidenceMap资源
2.4 pod利用configMap资源
(1)使用 ConfigMap 来替代环境变量
(2)创建pod,并且引用configMap资源
2.5 使用 ConfigMap 设置命令行参数
2.6 通过数据卷插件使用ConfigMap
2.7 configMap的热更新
总结
1.Secret的资源配置
Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。
Secret 有三种类型:
●kubernetes.io/service-account-token:由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;
●Opaque :base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的 Secret 类型;
●kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息。
Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:
●作为挂载到一个或多个容器上的卷 中的文件。
●作为容器的环境变量。
●由 kubelet 在为 Pod 拉取镜像时使用。
应用场景:凭据
https://kubernetes.io/docs/concepts/configuration/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=password.txt
kubectl describe secrets mysecret
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
#创建一个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
#复制上一个模板,进行修改编辑
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
我们在搭建好docker的私有仓库后,在使用私有仓库时需要通过docker login指令来登录到私有仓库中。但同时在使用的过程中也会把habor仓库的用户名和密码暴露在命令行中,存在一定的安全隐患。k8s中的secret配置的运用能够实现并且规避这一问题的存在
#私有仓库的secret配置
kubectl create secret docker-registry myharbor --docker-server=192.168.73.108 --docker-username=admin --docker-password=Harbor12345 [email protected]
vim harbor-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: harbor-pod
spec:
nodeName: node02
imagePullSecrets:
- name: myharbor
containers:
- image: 192.168.73.108/test/nginx-test:v1
name: harbor-pod
dnsPolicy: ClusterFirst
restartPolicy: Always
注意:登录harbor仓库的默认配置为https,所以我们要在配置上修改(所有node节点,如果只是测试,可以在pod中指定node节点,修改一个node即可):
2.ConfigMap资源配置
与Secret类似,区别在于ConfigMap保存的是不需要加密配置的信息。
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
应用场景:应用配置
创建一个目录并且在一个目录中填写两个文件:
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
--from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的
kubectl create configmap game-config2 --from-file=/opt/configmap/game.config --from-file=/opt/configmap/ui.config
#使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次
kubectl create configmap special-config --from-literal=name=zhangsan --from-literal=sex=man
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
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
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,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容
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 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中的配置