一、Secret的资源配置
1.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 拉取镜像时使用。
应用场景:
Secrets | KubernetesA Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key. Such information might otherwise be put in a Pod specification or in a container image. Using a Secret means that you don't need to include confidential data in your application code.Because Secrets can be created independently of the Pods that use them, there is less risk of the Secret (and its data) being exposed during the workflow of creating, viewing, and editing Pods.https://kubernetes.io/docs/concepts/configuration/secret/
1.2 陈述式创建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
1.3 声明式+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
1.4 将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
1.5 将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
1.6 实战运用:使用secret配置免密交互拉取habor私有仓库镜像
我们在搭建好docker的私有仓库后,在使用私有仓库时需要通过docker login指令来登录到私有仓库中。但同时在使用的过程中也会把habor仓库的用户名和密码暴露在命令行中,存在一定的安全隐患。k8s中的secret配置的运用能够实现并且规避这一问题的存在
进行私有仓库的secret资源创建
#私有仓库的secret配置
kubectl create secret docker-registry myharbor --docker-server=192.168.73.108 --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@qq.com
引用secret资源拉取私有仓库镜像创建pod
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即可):
二、ConfigMap资源配置
与Secret类似,区别在于ConfigMap保存的是不需要加密配置的信息。
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
应用场景:应用配置
2.1 使用目录来创建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/cm/
//--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
2.2 使用文件创建configMap资源
#只要指定为一个文件就可以从单个文件中创建 ConfigMap
--from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的
kubectl create configmap game-config2 --from-file=/opt/cm/game.config --from-file=/opt/cm/ui.config
2.3 直接使用参数创建confidenceMap资源
#使用文字值创建,利用 --from-literal 参数传递配置信息,该参数可以使用多次
kubectl create configmap special-config --from-literal=name=zhangsan --from-literal=sex=man
2.4 pod利用configMap资源
(1)使用 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
(2)创建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
kubectl create -f test-pod.yaml
kubectl get pods
2.5 使用 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
2.6 通过数据卷插件使用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
kubectl create -f test-pod3.yaml
kubectl get pods
比如:我想通过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
2.7 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秒)才能同步更新。
总结
ConfigMap资源(简称cm) 用于保存配置文件、环境变量等不需要加密的信息。它可以实现将配置信息与应用程序解耦
创建cm资源
kubectl create cm <资源名称> --from-file=文件|目录 --from-literal=<键名>=<键值>查看cm资源数据
kubectl get -n <命名空间> cm <cm资源名称> -o yaml
kubectl describe -n <命名空间> cm <cm资源名称>使用cm资源
作为存储卷挂载的方式:
在Pod资源配置中用spec.volumes字段设置configMap类型的卷
在容器配置中用volumeMounts将卷挂载到容器的指定的目录,cm资源数据的键名会作为文件名,cm资源数据的键值会作为文件内容(支持热更新)
在容器配置中用volumeMounts.subPath字段指定文件名,实现将卷挂载到容器中指定的文件上(不支持热更新)作为容器环境变量的方式:(不支持热更新)
在容器配置中用env.name字段自定义容器的环境变量名,用env.valueFrom.configMapKeyRef.key/name字段指定环境变量的值从哪个cm资源的键获取
在容器配置中用envFrom.configMapRef.name字段指定cm资源的名称,使得cm资源数据的键名和键值直接作为容器的环境变量名和值
Secret资源 用于保存密码文件、ssl证书/私钥文件、token令牌字符串、镜像私有仓库认证信息等需要加密的敏感信息
Secrets的主要目的是将敏感数据与应用程序代码分离,并提供一种安全的方式来存储和传递这些敏感数据给容器化的应用程序。它们以加密的形式保存,并且只能在需要时才能被解密和使用。Secret的4种类型:
Opaque:默认的Secret资源类型,可以通过选项引用文件、目录、键值对的方式创建Secret资源,并且资源数据的键值会被自动转换为base64编码格式加密
kubernetes.io/service-account-token:当创建serviceaccout账户资源后K8S会自动创建同名的Secert资源,用于Pod访问apiserver时会使用此Secret卷中的token做认证
kubernetes.io/dockerconfigjson:用于存储K8S从Harbor等镜像私有仓库拉取镜像时做认证的信息
kubernetes.io/tls:用于存储tls/ssl证书和私钥文件的信息创建Secret资源
kubectl create secret generic <资源名称> --from-file=文件|目录 --from-literal=<键名>=<键值>
kubectl create secret docker-registry <资源名称> --docker-server=<私有仓库URL路径> --docker-username=<仓库用户名> --docker-password=<用户密码> --docker-email=<邮箱地址>
kubectl create secret tls <资源名称> --cert=证书文件 --key=私钥文件查看Secret资源(键值会以base64编码格式加密显示)
kubectl get -n <命名空间> secret <Secret资源名称> -o yaml
kubectl describe -n <命名空间> secret <Secret资源名称>使用Secret资源
作为存储卷挂载的方式:
在Pod资源配置中用spec.volumes字段设置secret类型的卷
在容器配置中用volumeMounts将卷挂载到容器的指定的目录,Secret资源数据的键名会作为文件名,Secret资源数据的键值会作为文件内容作为容器环境变量的方式:
在容器配置中用env.name字段自定义容器的环境变量名,用env.valueFrom.secretKeyRef.key/name字段指定环境变量的值从哪个Secret资源的键获取
在容器配置中用envFrom.secretRef.name字段指定Secret资源的名称,使得Secret资源数据的键名和键值直接作为容器的环境变量名和值Pod配置从私有仓库拉取镜像:
在Pod资源配置中用spec.imagePullSecrets.name字段指定kubernetes.io/dockerconfigjson类型的Secret资源名称