Kubernetes进阶之secret及configmap配置管理
nginx
目录:redis
一 从外部访问应用最佳方式 二 配置管理 三 数据卷与数据持久卷 四 再谈有状态应用部署 五 K8S 安全机制
2、配置管理
Pod使用secret两种方式:
• 变量注入 (就是咱们在写yaml的时候直接让它以变量的方式注入进去,注入pod中,去引用这个变量,去作相关的处理)
• 挂载(直接从volume的形式挂载到咱们指定的目录下)
Configmap
与Secret相似,区别在于ConfigMap保存的是不须要加密配置信息。
应用场景:应用配置docker
官方文档使用secret:https://kubernetes.io/docs/concepts/configuration/secret/vim
能够建立secret主要放一些加密数据,不但愿别人看到的,好比用户名密码,保存这样的数据
存储好怎么让用户去访问,能够经过ingress指定一下secret名字,通常状况下建立pod业务容器的话,就须要指定这个secret到哪一个地方或者以volume的方式挂载的
加密数据并存放Etcd中,让Pod的容器以挂载Volume方式访问。
应用场景:凭据
建立资源的时候 , YAML 或 JSON 格式 , 而后建立该对象。在包含两个映射 : stringdata 和数据。该数据字段用于存储任意数据 , 用 Base64 编码。在 stringdata 提供 , 并容许您提供秘密数据为未编码的字符串。
例如 , 两个字符串存储到在yaml的使用 , 将他们转换成 BASE64:
这里的变量转换为编码,提示敏感字符,下面的yaml文件没写上去,抱歉api
[root@k8s-master demo]# echo -n 'root' | base64 [root@k8s-master demo]# echo -n 'zhaocheng' | base64
[root@k8s-master cert]# vim secret.yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: password:
[root@k8s-master cert]# kubectl create -f secret.yaml [root@k8s-master demo]# vim secret-pod1.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
[root@k8s-master demo]# kubectl create -f secret-pod1.yaml [root@k8s-master demo]# kubectl get pod NAME READY STATUS RESTARTS AGE busybox 1/1 Running 35 4d1h mypod 1/1 Running 0 2m27s nginx-5ddcc6cb74-m8dwr 1/1 Running 0 5h47m nginx-5ddcc6cb74-rs8b6 1/1 Running 0 4h34m nginx-5ddcc6cb74-zm7cz 1/1 Running 0 4h34m [root@k8s-master demo]# kubectl exec -it mypod sh ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var echo $SECRET_USERNAME root echo $SECRET_PASSWORD zhaocheng
应用场景:
通常写Dockerfile的时候,或者docker-compose的时候,能自动的去处理这些变量,也就是这个值被k8s进来解码安全
经过volume的形式来挂载
通常使用volume来把一些证书好比https的证书经过变量的形式传入挂载到目录中bash
[root@k8s-master demo]# vim secret-pod2.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
[root@k8s-master demo]# kubectl create -f secret-pod2.yaml [root@k8s-master demo]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 6m1s mypod2 1/1 Running 0 9s nginx-5ddcc6cb74-lplxl 1/1 Running 0 43m [root@k8s-master demo]# kubectl exec -it mypod2 bash root@mypod2:/# ls /etc/foo/ password username root@mypod2:/# cat /etc/foo/password zhaochengroot@mypod2:/# cat /etc/foo/username rootroot@mypod2:/#
Configmap
与Secret相似,区别在于ConfigMap保存的是不须要加密配置信息。
应用场景:应用配置
使用configmap来传入变量
官方文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ide
[root@k8s-master demo]# vim configmap1.yaml apiVersion: v1 kind: ConfigMap metadata: name: myconfig namespace: default data: special.level: info special.type: hello --- apiVersion: v1 kind: Pod metadata: name: mypod 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 [root@k8s-master demo]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 26m mypod2 1/1 Running 0 20m mypod3 0/1 Completed 0 41s nginx-5ddcc6cb74-lplxl 1/1 Running 0 63m [root@k8s-master demo]# kubectl logs mypod3 info hello 使用redis的一个实例 [root@k8s-master demo]# vim configmap2.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: mypod 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
[root@k8s-master demo]# kubectl create -f configmap2.yaml [root@k8s-master demo]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 30m mypod2 1/1 Running 0 24m mypod3 0/1 Completed 0 4m58s mypod4 0/1 Completed 0 15s nginx-5ddcc6cb74-lplxl 1/1 Running 0 68m 验证这里已经将内容发送到控制台 [root@k8s-master demo]# kubectl logs mypod4 redis.host=127.0.0.1 redis.port=6379 redis.password=123456