文章目录
- 配置资源管理
- Secret
- 陈述式创建
- 声明式创建
- 存储卷挂载
- 变量引用
- 创建tls类型
- 创建dockerconfigjson类型
- 安装docker,创建 harbor仓库
- pod节点设置
- ConfigMap
- 创建
- 挂载目录
- 挂载文件
- 以环境变量引用
- 通过打补丁的方式修改配置
- 总结
配置资源管理
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 的认证信息。
- kubernetes.io/tls :用来存储 TLS 证书和私钥信息。
-
https://kubernetes.io/docs/concepts/configuration/secret/
陈述式创建
##创建准备文件
echo -n "zhangsan" > username.txt
echo -n "123" > password.txt
##通过文件
##创建secret
kubectl create secret generic secret-demo1 --from-file=username.txt --from-file=password.txt
##查看创建的 secret
kubectl get secrets
##查看信息
kubectl describe secrets secret-demo1
kubectl get secrets secret-demo1 -o yaml
##信息通过 base64转码
echo -n "zhangsan" | base64
##通过 键值对创建
##创建secret
kubectl create secret generic secret-demo2 --from-literal=username=lisi
声明式创建
##先将值进行 base64转码
echo -n zhangsan | base64
echo -n 123 | base64
##利用命令生成yaml文件
kubectl get secrets secret-demo1 -o yaml > secrets-demo.yaml
apiVersion: v1
kind: Secret
metadata:
name: secret-demo3
namespace: default
type: Opaque
data:
username: emhhbmdzYW4=
passwd: MTIz
##利用yaml创建secrets
kubectl apply -f secrets-demo.yaml
##查看创建状态
kubectl describe secrets secret-demo3
存储卷挂载
apiVersion: v1
kind: Pod
metadata:
name: poddemo1
spec:
containers:
- image: nginx:1.14
name: poddemo1
volumeMounts:
- name: secrets
mountPath: "/usr/share/nginx/html"
readOnly: true
volumes:
- name: secrets
secret:
secretName: secret-demo1
##进入pod查看
kubectl exec -it poddemo1 bash
ls /usr/share/nginx/html
变量引用
apiVersion: v1
kind: Pod
metadata:
name: poddemo2
spec:
containers:
- image: nginx:1.14
name: poddemo2
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: secret-demo1
key: username
- name: TEST_PASSWD
valueFrom:
secretKeyRef:
name: secret-demo1
key: password
envFrom:
- secretRef:
name: secret-demo2
##进入pod查看
kubectl exec -it poddemo2 bash
创建tls类型
cd /etc/kubernetes/
cd pki/
cp ca* /opt/
cd /opt/
kubectl create secret tls tls-secret --cert=./ca.crt --key=./ca.key
创建dockerconfigjson类型
安装docker,创建 harbor仓库
##准备 docker harbor的服务器
##首先,先修改 daemon.json 配置文件
vim /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.242.71:80"],
##注意在末尾添加 ,
"registry-mirrors": ["镜像加速URL"]
}
##重启Docker服务
systemctl restart docker
##上传 Docker harbor 安装文件并安装
##安装 Docker-compose 服务
cd /opt/
tar xf harbor-offline-installer-v1.10.18.tgz
chmod +x docker-compose
mv /opt/docker-compose /usr/local/bin/docker-compose
docker-compose --version
##修改 harbor 配置文件
cd /opt/harbor
vim harbor.yml
---第5行---
hostname: 192.168.242.71
---第13行---
注释掉https的配置项
---第27行
harbor_admin_password: Harbor12345
##记住harbor的密码
##先做前其准备或者之间安装 harbor
cd /opt/harbor
./prepare
./install.sh ##自动安装
###查看所有的镜像是否安装成功
docker-compose ps
###在网页中登陆到 harbor
http://192.168.242.67
用户:admin
密码:Harbor12345
##就可以看见页面
##推送镜像到 仓库中
docker tag nginx:1.14 192.168.242.71/test/nginx:1.14
docker login -u admin -p Harbor12345 http://192.168.242.71
docker push 192.168.242.71/test/nginx:1.14
pod节点设置
##所有的node节点修改docker配置文件
##首先,先修改 daemon.json 配置文件
vim /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.242.71:80"],
##注意在末尾添加 ,
"registry-mirrors": ["镜像加速URL"]
}
##重启Docker服务
systemctl restart docker
##创建dockerconfigjson的secret
kubectl create secret docker-registry docker-auth --docker-username=admin --docker-server=http://192.168.242.71:80 --docker-password=Harbor12345 --docker-email=admin@123.com
##创建 pod
vim docker-secret-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: docker-dem02
spec:
nodeSelector:
name: b
imagePullSecrets:
- name: docker-auth
containers:
- image: 192.168.242.71:80/test/nginx:1.14
name: docker-dem02
ports:
- containerPort: 85
volumeMounts:
- name: secrets
mountPath: "/usr/share/nginx/html"
readOnly: true
volumes:
- name: secrets
secret:
secretName: secret-demo1
ConfigMap
- 与Secret类似,区别在于ConfigMap保存的是不需要加密配置的信息。
- ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
创建
##创建准备文件
mkdir /opt/cm
cd /opt/cm
echo -n 'zhangsan' > username
echo -n '123' > password
##利用文件创建
##创建cm
kubectl create cm cm-demo1 --from-file=/opt/cm/username
##查看创建的cm
kubectl get cm
##查看cm 的详细信息
kubectl describe cm cm-demo1
##以yaml格式查看cm配置
kubectl get cm cm-demo1 -o yaml
##利用键值对创建 cm
kubectl create cm cm-demo2 --from-literal=name=lisi
挂载目录
cd /opt/cm
echo '123456' > index.html
##创建cm
kubectl create cm cm-demo3 --from-file=index.html
##创建用于挂载的pod
kubectl run pod_demo1 --image=nginx:1.14 --port=80 -o yaml --dry-run=client > pod-demo1.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: pod-demo1
name: pod-demo1
spec:
volumes:
- name: html
configMap:
name: cm-demo3
containers:
- image: nginx:1.14
name: pod-demo1
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
##访问pod查看
kubectl get pods -o wide
curl 10.244.3.86
##热更新
kubectl edit cm cm-demo3
##修改里面的内容
挂载文件
##进入到pod容器中,导出文件
kubectl exec -it pod-demo1 bash
cd /etc/nginx/
##导出pod容器的文件
kubectl cp default/pod-demo1:/etc/nginx/nginx.conf ./nginx.conf
##创建cm文件
kubectl create cm cm-demo4 --from-file=nginx.conf
apiVersion: v1
kind: Pod
metadata:
labels:
run: pod-demo2
name: pod-demo2
spec:
volumes:
- name: html
configMap:
name: cm-demo4
containers:
- image: nginx:1.14
name: pod-demo2
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf ##挂载的是文件时,要添加的东西
以环境变量引用
kubectl create deployment myapp --image=nginx:1.14 --port=80 --replicas=3 --dry-run=client -o yaml > deploy-demo.yaml
##创建 cm
kubectl create cm cm-demo5 --from-file=username --from-literal=password=123
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-test
spec:
replicas: 3
selector:
matchLabels:
app: deploy-test
template:
metadata:
labels:
app: deploy-test
spec:
containers:
- image: nginx:1.14
name: nginx
ports:
- containerPort: 80
env:
- name: username
valueFrom:
configMapKeyRef:
name: cm-demo5
key: username
- name: password
valueFrom:
configMapKeyRef:
name: cm-demo4
key: password
- image: busybox
name: busybox
command: ["/bin/sh", "-c", "sleep 36000"]
envFrom:
- configMapRef:
name: cm-demo3
##进入到容器中,查看env
kubectl exec -it deploy-test-74ff77bd97-88bhv -c nginx sh
env
通过打补丁的方式修改配置
#修改副本数量
kubectl patch deployments.apps deploy-test --patch '{"spec": {"replicas": 1}}'
##修改镜像
kubectl patch deployments.apps deploy-test --patch '{"spec": {"template": {"spec": {"containers": [{"name": "nginx", "image": "nginx:1.15"}]}}}}'
总结
- ConfigMap 资源 简称 cm 用于保存 配置文件 环境变量 命令行参数 之类的不需要加密的信息
创建 cm资源
kubectl create cm <资源名称> --from-file=文件|目录 --from-literal=<键名>=<键值>
- 查看 cm资源
kubectl get cm <资源名称> -o yaml 或 kubectl describe cm <资源名称>
-
使用 cm资源
-
挂载的方式:
- 在 Pod 资源配置中的 spec.volumes 字段设置 configMap 类型的存储卷
- 在容器配置中用volumeMounts将卷挂载到容器的挂载点目录上,cm资源数据的键名会作为文件名,cm资源数据的键值会作为文件内容(以目录形式挂载的cm卷支持热更新)
- 在容器配置中用volumeMounts.subPath指定文件名,可实现将卷挂载到容器的文件上(以文件形式挂载的cm卷不支持热更新)
-
容器环境变量引用的方式:(不支持热更新)
- 在容器配置中用 env.name 字段自定义容器的环境变量名,在 env.valueFrom.configMapKeyRef.name/key 字段指定自定义的变量的值从哪个 cm资源 的 键 获取 值
在容器配置中用 envFrom.configMapRef.name 字段指定 cm资源的名称,使得 cm资源的 键 和 值 作为容器的环境变量名和环境变量的值
- 在容器配置中用 env.name 字段自定义容器的环境变量名,在 env.valueFrom.configMapKeyRef.name/key 字段指定自定义的变量的值从哪个 cm资源 的 键 获取 值
-
Secret 资源 用于保存密码文件、tls证书/私钥文件、token令牌字符串、镜像私有仓库认证信息 等需要加密的敏感的信息
-
Secret资源的 4 种类型:
- Opaque:默认的Secret资源类型,可以通过选项引用文件、目录、键值对的方式创建Secret资源,并且资源数据的键值会自动转换成base64编码格式
- kubernetes.io/tls:用于存储 tls 证书和私钥文件的信息
- kubernetes.io/dockerconfigjson:用于存储K8S从harbor等镜像私有仓库拉取镜像时做认证的信息
- kubernetes.io/service-account-token:当创建serviceaccount账户资源后K8S会自动创建相关的Secret资源,当Pod访问apiserver时需要使用此Secret资源做认证
-
创建 Secret资源
kubectl create secret generic|tls|docker-registry <资源名称> 选项
generic <资源名称> --from-file=文件|目录 --from-literal=<键名>=<键值>
tls <资源名称> --cert=证书文件路径 --key=私钥文件路径
docker-registry <资源名称> --docker-server=私有仓库URL地址 --docker-username=用户名 --docker-password=密码 --docker-email=邮箱
-
使用 Secret资源
-
挂载的方式:
- 在 Pod 资源配置中的 spec.volumes 字段设置 secret 类型的存储卷
- 在容器配置中用volumeMounts将卷挂载到容器的挂载点目录上,Secret资源数据的键名会作为文件名,Secret资源数据的键值会作为文件内容
-
容器环境变量引用的方式:
- 在容器配置中用 env.name 字段自定义容器的环境变量名,在 env.valueFrom.secretKeyRef.name/key 字段指定自定义的变量的值从哪个 Secret资源 的 键 获取 值
- 在容器配置中用 envFrom.secretRef.name 字段指定 Secret资源的名称,使得 Secret资源的 键 和 值 作为容器的环境变量名和环境变量的值
-
陈述式管理资源的方式 修改或添加 资源对象的配置
kubectl patch deployment myapp-demo1 --patch '{"第一层字段": {"第二层字段": {...}}}'
kubectl patch deployment myapp-demo1 --patch '{"spec": {"template": {"spec": {"containers": [{"name": "myapp", "image": "soscscs/myapp:v2"}]}}}}'