1.Secret
常见的应用配置方式
- 镜像
- 配置中心
- 配置文件
- 共享存储
- 放到git 仓库
配置文件分类:
- 敏感信息
- 非敏感信息 如账号密码 服务器地址
Secret再k8s中 的使用方式
加密数据并存放Etcd中,让Pod的容器以挂载Volume方式访问。
应用场景:凭据
Pod使用secret两种方式:
- 变量注入
- 挂载
例:现在一对 用户名 密码 pod在运行的时候需要加载 注入到pod 中
假如现在 用户名:admin 密码:password
echo -n "admin" |base64 YWRtaW4= echo -n "password" |base64 cGFzc3dvcmQ=
passwdAndusername-secret.yaml
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: cGFzc3dvcmQ=
pod怎样注入secret中的变量
secret-var-use.yaml
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: nginx image: nginx env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password
将secret挂载到pod文件中
secret-volume.yaml
apiVersion: v1 kind: Pod metadata: name: mypod2 spec: containers: - name: nginx image: nginx volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret
三种类型secret
[root@k8s-master1 ~/learn]# kubectl create secret -h Create a secret using specified subcommand. Available Commands: docker-registry Create a secret for use with a Docker registry generic Create a secret from a local file, directory or literal value tls Create a TLS secret
docker-registry 是配置docker私有仓库的认证信息,当yaml中指定了相应的secret 就可以获取到对应的变量值
kubectl create secret docker-registry myregistry --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=benjami n7788 --docker-password=a7260488
imagePullSecrets: - name: myregistry
generic 通过传值 或者 指定本地文件的方式 创建secret
传值:
kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456
传文件:
echo -n admin > ./username echo -n 123456 > ./password kubectl create secret generic mysecret --from-file=./username --from-file=./password
tls 创建证书型secret一般用于 ingress 配置https 场景中
kubectl create secret tls secret-tls --cert=/root/learn/ssl/example.ctnrs.com.pem --key=/root/learn/ssl/example.ctnrs.com-ke y.pem
tls: - hosts: - example.ctnrs.com secretName: secret-tls
Secret官网:https://kubernetes.io/docs/concepts/configuration/secret/
2.ConfigMap
与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。
应用场景:应用配置
引用变量方式
configmap-string.yaml
apiVersion: v1 kind: ConfigMap metadata: name: myconfig namespace: default data: special.level: info special.type: hello
config-var.yaml
apiVersion: v1 kind: Pod metadata: name: mypod3 spec: containers: - name: busybox image: busybox command: ["/bin/sh","-c","echo $(LEVEL) $(TYPE)"] env: - name: LEVEL valueFrom: configMapKeyRef: name: myconfig key: special.level - name: TYPE valueFrom: configMapKeyRef: name: myconfig key: special.type restartPolicy: Never
挂载数据卷方式
cat config-volume.yaml
--- apiVersion: v1 kind: ConfigMap metadata: name: redis-config data: redis.properties: | redis.host=127.0.0.1 redis.port=6379 redis.password=123456 --- apiVersion: v1 kind: Pod metadata: name: mypod4 spec: containers: - name: busybox image: busybox command: ["/bin/sh","-c","cat /etc/config/redis.properties"] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: redis-config restartPolicy: Never
应用程序动态更新配置
ConfigMap更新时,业务也随之更新的方案:
- 当ConfigMap发生变更时,应用程序动态加载
- 触发滚动更新,即重启服务
但是问题是,如何触发应用reload?如何周期性的检查文件是否变化?
比如 我将configMap中定义的密码 由 123456 改为 password
然后重新应用程序,发现应用并未使用更新后的配置
只有将pod 进行重建后,才能加载到修改后的配置
kubectl delete po mypod4
kubectl apply -f config-volume.yaml
ConfigMap 官网:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
来源:https://www.cnblogs.com/benjamin77/p/12446761.html