一.ConfigMap
传统的配置文件管理:配置文件放在本地服务器,在本地修改。
ConfigMap:ConfigMap将配置和Pod分开,一般用ConfigMap去管理一些配置文件、或者一些大量的环境变量信息。
当设置了ConfigMap的配置文件挂载到pod指定目录时,当修改了配置文件后,pod里面的配置文件也会修改,不需要重启等操作就能加载新配置文件。
ConfigMap中文地址:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-pod-configmap/
1.创建ConfigMap的几种形式
常用命令:
kubectl create configmap -h //通过以下命令查看创建configmap的几种形式 kubectl create cm cmfromdir --from-file=conf/ //基于目录 kubectl create cm cmfromfile --from-file=conf/redis.conf //基于文件 kubectl create cm cmspecialname --from-file=game-conf=game.conf //基于文件+自定义文件名 kubectl create cm cmspecialname2 --from-file=game-conf=game.conf --from-file=redis-conf=redis.conf kubectl create cm gameenvcm --from-env-file=game.conf //基于环境变量1 kubectl create cm envfromliteral --from-literal=level=INFO --from-literal=PASSWORD=redis123 ////基于环境变量 kubectl create -f cm.yaml2 //通过yaml创建
a.基于目录创建
[root@k8s-master01 ~]# mkdir configmap //创建configmap/conf/nginx.conf1/2 [root@k8s-master01 configmap]# mkdir conf [root@k8s-master01 configmap]# vim conf/nginx.conf test123 ver:1 [root@k8s-master01 configmap]# vim conf/nginx2.conf test:123 ver:2 [root@k8s-master01 configmap]# kubectl create cm cmfromdir --from-file=conf/ //以conf为目录创建configmap configmap/cmfromdir created [root@k8s-master01 configmap]# kubectl get cm //通过get查看 NAME DATA AGE cmfromdir 2 2m1s kube-root-ca.crt 1 111d [root@k8s-master01 conf]# kubectl describe cm //查看详细信息 [root@k8s-master01 configmap]# kubectl get cm cmfromdir -oyaml //查看详细内容,发现和之前一样 apiVersion: v1 data: nginx.conf: | test123 ver:1 nginx2.conf: | test:123 ver:2 kind: ConfigMap metadata: creationTimestamp: "2021-07-27T11:21:18Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:nginx.conf: {} f:nginx2.conf: {} manager: kubectl-create operation: Update time: "2021-07-27T11:21:18Z" name: cmfromdir namespace: default resourceVersion: "190305" uid: 295f7550-f532-4621-afc0-296a5e1629df
b.基于文件创建(自定义名称)
文件名称一致创建:
[root@k8s-master01 configmap]# vim conf/redis.conf //另外创建一个配置文件 [root@k8s-master01 configmap]# kubectl create cm cmfromfile --from-file=conf/redis.conf //以某文件的形式创建configmap configmap/cmfromfile created [root@k8s-master01 configmap]# kubectl get cm //查看configmap NAME DATA AGE cmfromdir 2 12m cmfromfile 1 50s kube-root-ca.crt 1 111d [root@k8s-master01 configmap]# kubectl get cm -oyaml cmfromfile //yaml查看新创建的configmap apiVersion: v1 data: redis.conf: | passwd qw23523 kind: ConfigMap metadata: creationTimestamp: "2021-07-27T11:32:41Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:redis.conf: {} manager: kubectl-create operation: Update time: "2021-07-27T11:32:41Z" name: cmfromfile namespace: default resourceVersion: "191631" uid: 87c65642-02ee-44cf-a5f3-59703eaae275
自定义名称(改变配置文件名称):
[root@k8s-master01 conf]# kubectl create cm cmspecialname --from-file=game.conf=redis.conf //指定redis.conf为配置文件,但名称改为game.conf configmap/cmspecialname created [root@k8s-master01 conf]# kubectl get cm cmspecialname -oyaml apiVersion: v1 data: game.conf: | //名称已改变 passwd qw23523 //发现和redis.conf的内容一致 kind: ConfigMap [root@k8s-master01 conf]# kubectl describe cm cmspecialname //查看详细信息 ....
c.基于环境变量文件的形式
通过在同一配置文件里面定义多个环境变量,配置好后可以通过在pod引用需要的环境变量。
[root@k8s-master01 conf]# vim game.conf //创建文件 ver=3 test=123456 pre_env=yan [root@k8s-master01 conf]# kubectl create cm game-env --from-env-file=game.conf //基于变量文件创建 configmap/game-env created [root@k8s-master01 conf]# kubectl get cm game-env -oyaml //查看 apiVersion: v1 data: pre_env: yan //三个变量 test: "123456" ver: "3" kind: ConfigMap metadata: creationTimestamp: "2021-07-27T12:03:57Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:pre_env: {} f:test123456: {} f:ver: {} manager: kubectl-create operation: Update time: "2021-07-27T12:03:57Z" name: game-env namespace: default resourceVersion: "195282" uid: 4648dad8-343a-4661-895f-179120a971c4
2.使用valueFrom定义环境变量
a.生成deploy的yaml文件
[root@k8s-master01 ~]# kubectl create deploy dp-cm \ > --image=registry.cn-beijing.aliyuncs.com/dotbalo/nginx \ > --dry-run=client -oyaml > dp-cm.yaml
b.修改yaml文件
[root@k8s-master01 ~]# vim dp-cm.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: dp-cm name: dp-cm spec: replicas: 1 selector: matchLabels: app: dp-cm template: metadata: labels: app: dp-cm spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx name: nginx env: //新增环境变量 - name: TEST_ENV //自定义环境变量 value: testven - name: LIVE //引用configMap的环境变量 valueFrom: configMapKeyRef: name: game-env //引用configMap的名称 key: ver //此名称下的key
c.创建deployment验证
[root@k8s-master01 ~]# kubectl create -f dp-cm.yaml deployment.apps/dp-cm created [root@k8s-master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE dp-cm-677db66d-mvns9 1/1 Running 0 42s [root@k8s-master01 ~]# kubectl exec -it dp-cm-677db66d-mvns9 -- bash //进入容器 root@dp-cm-677db66d-mvns9:/# env //查看变量 KUBERNETES_SERVICE_PORT_HTTPS=443 LIVE=3 //引用configMap的一个环境变量 KUBERNETES_SERVICE_PORT=443 HOSTNAME=dp-cm-677db66d-mvns9 PWD=/ PKG_RELEASE=1~buster HOME=/root KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 NJS_VERSION=0.5.0 TERM=xterm TEST_ENV=testven //自定义的变量 SHLVL=1 KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBERNETES_SERVICE_HOST=10.96.0.1 KUBERNETES_PORT=tcp://10.96.0.1:443 KUBERNETES_PORT_443_TCP_PORT=443 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.19.6 _=/usr/bin/env [root@k8s-master01 ~]# kubectl exec dp-cm-677db66d-mvns9 -- env //无需进容器,直接查看命令
d.引用多个环境变量
[root@k8s-master01 ~]# vim dp-cm.yaml .... spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx name: nginx env: - name: TEST_ENV value: testven - name: LIVE valueFrom: configMapKeyRef: name: game-env key: ver - name: home01 valueFrom: configMapKeyRef: name: game-env key: pre_env [root@k8s-master01 ~]# kubectl apply -f dp-cm.yaml //更新deploy [root@k8s-master01 ~]# kubectl exec dp-cm-6f4d4d67b7-5vhzk -- env //查看已经添加了环境变量 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=dp-cm-6f4d4d67b7-5vhzk TEST_ENV=testven LIVE=3 home01=yan KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBERNETES_SERVICE_HOST=10.96.0.1 KUBERNETES_SERVICE_PORT=443 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT=tcp://10.96.0.1:443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 NGINX_VERSION=1.19.6 NJS_VERSION=0.5.0 PKG_RELEASE=1~buster HOME=/root
3.使用envfrom批量生成环境变量
可以通过K8S的envFrom自动引用某一个configMap文件下的所有环境变量
具体yaml如下:
[root@k8s-master01 ~]# vim dp-cm.yaml //修改,添加三行 apiVersion: apps/v1 kind: Deployment metadata: labels: app: dp-cm name: dp-cm spec: replicas: 1 selector: matchLabels: app: dp-cm template: metadata: labels: app: dp-cm spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx name: nginx envFrom: //添加envFrom三行,直接引用configMap的game-env - configMapRef: name: game-env env: - name: TEST_ENV value: testven [root@k8s-master01 ~]# kubectl replace -f dp-cm.yaml //replace更新 deployment.apps/dp-cm replaced [root@k8s-master01 ~]# kubectl exec dp-cm-5d664dff58-mwp5m -- env //查看新更新后的pod的变量 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=dp-cm-5d664dff58-mwp5m ver=3 //发现configmap配置下的所有变量都在上面 pre_env=yan TEST_ENV=testven test=123456 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBERNETES_SERVICE_HOST=10.96.0.1 KUBERNETES_SERVICE_PORT=443 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT=tcp://10.96.0.1:443 NGINX_VERSION=1.19.6 NJS_VERSION=0.5.0 PKG_RELEASE=1~buster HOME=/root
可以增加前缀识别变量是通过configmap添加的
[root@k8s-master01 ~]# vim dp-cm.yaml ... envFrom: - configMapRef: name: game-env prefix: fromCM //增加前缀 ... [root@k8s-master01 ~]# kubectl exec dp-cm-85fd5db98b-tlj5d -- env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=dp-cm-85fd5db98b-tlj5d fromCMtest=123456 //查看到通过configmap添加的环境变量都有前缀 fromCMver=3 fromCMpre_env=yan
4.以文件的形式挂载configmap
创建两个configmap
[root@k8s-master01 conf]# kubectl create cm redisfile --from-file=redis2.conf //创建redisfile configmap/redisfile created [root@k8s-master01 conf]# kubectl create cm redisfile2 --from-file=redis.conf //创建redisfile2 configmap/redisfile2 created [root@k8s-master01 conf]# kubectl get cm NAME DATA AGE cmfromdir 2 65m cmfromfile 1 64m game-env 3 62m kube-root-ca.crt 1 112d redisfile 1 27s redisfile2 1 2s
修改deploy的yaml文件,通过修改挂载config到deploy的pod上。
在containers:下添加volumes,平级对齐。
[root@k8s-master01 ~]# vim dp-cm.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: dp-cm name: dp-cm spec: replicas: 1 selector: matchLabels: app: dp-cm template: metadata: labels: app: dp-cm spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx name: nginx volumeMounts: //此镜像调用的挂载 - name: redis1 //引用下面redis1 mountPath: /etc/config //挂载的文件,不存在则自动创建 - name: redis2 mountPath: /etc/config2 volumes: - name: redis1 //volume名,最好不要与下面的configmap名称一样,容易区分 configMap: //设置configmap name: redisfile //存在的configmap名称 - name: redis2 configMap: name: redisfile2
验证:
[root@k8s-master01 ~]# kubectl replace -f dp-cm.yaml //更新 [root@k8s-master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE dp-cm-5c66686556-xwzht 1/1 Running 0 6s [root@k8s-master01 ~]# kubectl exec -it dp-cm-5c66686556-xwzht -- bash root@dp-cm-5c66686556-xwzht:/# cd /etc/config root@dp-cm-5c66686556-xwzht:/etc/config# cat redis2.conf //查看挂载文件 password redis789 root@dp-cm-5c66686556-xwzht:/etc/config# cd .. root@dp-cm-5c66686556-xwzht:/etc# cat config2/redis.conf //查看挂载文件 passwd qw23523
5.自定义挂载权限和名称
修改deploy文件,加上items和defaultMode参数可以自定义名称和权限。
[root@k8s-master01 ~]# ........ spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx name: nginx volumeMounts: - name: redis1 mountPath: /etc/config - name: redis2 mountPath: /etc/config2 volumes: - name: redis1 configMap: name: redisfile - name: redis2 configMap: name: redisfile2 items: //自定义挂载名称 - key: redis.conf //原始名称 path: redis.conf.bak //修改后名称 defaultMode: 0666 //自定义挂载权限
验证
[root@k8s-master01 ~]# kubectl replace -f dp-cm.yaml //更新deploy [root@k8s-master01 ~]# kubectl exec -it dp-cm-6c675b4775-jqnsc -- bash //进入容器 root@dp-cm-6c675b4775-jqnsc:/# cd /etc/config2/ //查看文件名称已改变 root@dp-cm-6c675b4775-jqnsc:/etc/config2# ls redis.conf.bak root@dp-cm-6c675b4775-jqnsc:/etc/config2# ls -lh total 0 lrwxrwxrwx 1 root root 21 Jul 28 10:50 redis.conf.bak -> ..data/redis.conf.bak root@dp-cm-6c675b4775-jqnsc:/etc/config2# ls -lh ..data/redis.conf.bak //查看挂载文件的权限 -rw-rw-rw- 1 root root 16 Jul 28 10:50 ..data/redis.conf.bak
二.Secret
Secret中文社区: https://kubernetes.io/zh/docs/concepts/configuration/secret/
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。 参阅 Secret 设计文档 获取更多详细信息。
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。
0.Secret的类型
Opaque:通用型Secret,默认类型; kubernetes.io/service-account-token:作用于ServiceAccount,包含一个令牌,用于标识API服务账户; kubernetes.io/dockerconfigjson:下载私有仓库镜像使用的Secret, 和宿主机的/root/.docker/config.json一致,宿主机登录后即可产生该文件; kubernetes.io/basic-auth:用于使用基本认证(账号密码)的Secret,可以使用Opaque取代; kubernetes.io/ssh-auth:用于存储ssh密钥的Secret; kubernetes.io/tls:用于存储HTTPS域名证书文件的Secret,可以被Ingress使用; bootstrap.kubernetes.io/token:一种简单的 bearer token, 用于创建新集群或将新节点添加到现有集群,在集群安装时可用于自动颁发集群的证书
1.Secret的几种形式&使用Secret
Secret和configmap创建方法类似,多了一个类型
a.基于文件
[root@k8s-master01 secret]# echo -n 'admin' > ./username.txt //创建两个文件 [root@k8s-master01 secret]# echo -n '1Fd3432srr34' > ./password.txt 基于文件创建 1Fd3432srr34[root@k8s-master01 secret]# kubectl create secret generic db-user-pass \ //创建名为db-user-pass的secret > --from-file=./username.txt \ > --from-file=./password.txt secret/db-user-pass created [root@k8s-master01 secret]# kubectl get secret //类型Opaque,默认类型 NAME TYPE DATA AGE db-user-pass Opaque 2 57s default-token-d99w5 kubernetes.io/service-account-token 3 119d secret通过base64加密,可以进行解密 [root@k8s-master01 secret]# kubectl get secret db-user-pass -oyaml apiVersion: v1 data: password.txt: MUZkMzQzMnNycjM0 //发现已做加密 username.txt: YWRtaW4= kind: Secret metadata: ............. root@k8s-master01 secret]# echo 'YWRtaW4=' | base64 -d //base64解密 admin
b.通过literal直接设置
还可以使用 –from-literal== 标签提供 Secret 数据。 可以多次使用此标签,提供多个键值对。 请注意,特殊字符(例如:$,\,*,= 和 !)由你的 shell 解释执行,而且需要转义。
在大多数 shell 中,转义密码最简便的方法是用单引号括起来。 比如,如果你的密码是 S!B\*d$zDsb=, 可以像下面一样执行命令:
[root@k8s-master01 secret]# kubectl create secret generic db-user-pass-dev \ //创建名为db-user-pass-dev的secret > --from-literal=username=devuser \ > --from-literal=password='S!B\*d$zDsb=' secret/db-user-pass-dev created [root@k8s-master01 secret]# kubectl get secrets NAME TYPE DATA AGE db-user-pass Opaque 2 11m db-user-pass-dev Opaque 2 8s default-token-d99w5 kubernetes.io/service-account-token 3 119d [root@k8s-master01 secret]# kubectl get secrets db-user-pass-dev -oyaml apiVersion: v1 data: password: UyFCXCpkJHpEc2I9 username: ZGV2dXNlcg== kind: Secret metadata: ........... [root@k8s-master01 secret]# echo 'UyFCXCpkJHpEc2I9' | base64 -d //base64解析 S!B\*d$zDsb= [root@k8s-master01 secret]# echo 'ZGV2dXNlcg==' | base64 -d devuser
c.通过配置文件yaml创建
可以先用 JSON 或 YAML 格式在文件中创建 Secret,然后创建该对象。 Secret 资源包含2个键值对: data 和 stringData。 data 字段用来存储 base64 编码的任意数据。 提供 stringData 字段是为了方便,它允许 Secret 使用未编码的字符串。 data 和 stringData 的键必须由字母、数字、-,_ 或 . 组成。
[root@k8s-master01 secret]# vim Secret.yaml //编写yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm [root@k8s-master01 secret]# kubectl create -f Secret.yaml //创建 secret/mysecret created [root@k8s-master01 secret]# kubectl get secret mysecret -oyaml //查看 apiVersion: v1 data: password: MWYyZDFlMmU2N2Rm //发现已经加密了 username: YWRtaW4= kind: Secret metadata: ...............
对于某些场景,可能希望使用 stringData 字段。 这字段可以将一个非 base64 编码的字符串直接放入 Secret 中, 当创建或更新该 Secret 时,此字段将被编码。
上述用例的实际场景可能是这样:当你部署应用时,使用 Secret 存储配置文件, 你希望在部署过程中,填入部分内容到该配置文件。
[root@k8s-master01 secret]# apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque stringData: //修改下面三行 username: admin password: passwd123 [root@k8s-master01 secret]# kubectl apply -f ./Secret.yaml //更新 [root@k8s-master01 secret]# kubectl get secret mysecret -oyaml apiVersion: v1 data: password: cGFzc3dkMTIz username: YWRtaW4= kind: Secret metadata: ................. [root@k8s-master01 secret]# echo 'YWRtaW4=' | base64 -d //解密 admin
d.使用secret
方法和configmap类似,只介绍如何挂载到deployment上
[root@k8s-master01 ~]# vim dp-cm.yaml //使用上面用过的dp-cm.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: dp-cm name: dp-cm spec: replicas: 1 selector: matchLabels: app: dp-cm template: metadata: labels: app: dp-cm spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx name: nginx volumeMounts: //调用挂载的名称和路径 - name: foo mountPath: /etc/foo volumes: - name: foo //设置挂载的名称和secret secret: secretName: mysecret [root@k8s-master01 ~]# kubectl apply -f dp-cm.yaml //更新 [root@k8s-master01 ~]# kubectl exec -ti dp-cm-f7b56dff5-nvpc9 bash //进容器验证 root@dp-cm-f7b56dff5-nvpc9:/# cd /etc/foo && cat password username passwd123adminroot
2.Secret拉取镜像仓库
通常在用k8s拉取镜像仓库的镜像时,如果是私有的镜像仓库,需要通过配置secret把私有仓库的密码设置在上面,再挂载到deployment或者其他pod资源中。
这边通过使用阿里云作为私有镜像仓库
a.阿里云创建一个私有镜像仓库
回到系统登录到阿里云私有仓库
[root@k8s-master01 ~]# docker login --username=a123297510 registry.cn-shenzhen.aliyuncs.com Password: Login Succeeded
由于镜像是空的,这边先推送一个镜像到私有仓库
[root@k8s-master01 ~]# docker push registry.cn-shenzhen.aliyuncs.com/yanjing123/k8s-example:needlogin //docekr push推送 地址在阿里云介绍那里获取 The push refers to repository [registry.cn-shenzhen.aliyuncs.com/yanjing123/k8s-example] 85fcec7ef3ef: Pushed 3e5288f7a70f: Pushed 56bc37de0858: Pushed 1c91bf69a08b: Pushed cb42413394c4: Pushed needlogin: digest: sha256:0b159cd1ee1203dad901967ac55eee18c24da84ba3be384690304be93538bea8 size: 1362 //成功推送 [root@k8s-master01 ~]# docker pull registry.cn-shenzhen.aliyuncs.com/yanjing123/k8s-example:needlogin //测试下载无误 needlogin: Pulling from yanjing123/k8s-example Digest: sha256:0b159cd1ee1203dad901967ac55eee18c24da84ba3be384690304be93538bea8 Status: Image is up to date for registry.cn-shenzhen.aliyuncs.com/yanjing123/k8s-example:needlogin registry.cn-shenzhen.aliyuncs.com/yanjing123/k8s-example:needlogin
b.镜像仓库密码挂载到deploy
[root@k8s-master01 ~]# kubectl create secret -h //先看下怎么使用命令 .... Usage: //根据帮助使用命令 kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email [--docker-server=string] [--from-literal=key1=value1] [--dry-run=server|client|none] [options] ...... 根据帮助创建secret [root@k8s-master01 ~]# kubectl create secret docker-registry myregistry --docker-username=a123297510 --docker-password=****** --docker-email=609346246@qq.com --docker-server=registry.cn-shenzhen.aliyuncs.com secret/myregistry created [root@k8s-master01 ~]# kubectl get secret //查看 NAME TYPE DATA AGE db-user-pass Opaque 2 95m db-user-pass-dev Opaque 2 83m default-token-d99w5 kubernetes.io/service-account-token 3 119d myregistry kubernetes.io/dockerconfigjson 1 11s //已创建 mysecret Opaque 2 64m
挂载
[root@k8s-master01 ~]# vim dp-cm.yaml //还是修改之前的名称为dp-cm.yaml的deploy apiVersion: apps/v1 kind: Deployment metadata: labels: app: dp-cm name: dp-cm spec: replicas: 1 selector: matchLabels: app: dp-cm template: metadata: labels: app: dp-cm spec: imagePullSecrets: //添加挂载的名叫myregistry的secret - name: myregistry containers: - image: registry.cn-shenzhen.aliyuncs.com/yanjing123/k8s-example:needlogin //更换为阿里私有镜像 name: nginx volumeMounts: - name: foo mountPath: /etc/foo volumes: - name: foo secret: secretName: mysecret [root@k8s-master01 ~]# kubectl replace -f dp-cm.yaml //replace更新deploy deployment.apps/dp-cm replaced [root@k8s-master01 ~]# kubectl get po //查看POD,运行7s说明已经更换了新的镜像 NAME READY STATUS RESTARTS AGE dp-cm-6f98c85ff5-pxhbc 1/1 Running 0 7s
3.Secret管理https的证书
临时生成一个证书文件(测试用),生成环境需要到颁发机构申请。
[root@k8s-master01 configmap]# openssl req -x509 -nodes -days 365 \ > -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=test.com" Generating a 2048 bit RSA private key .......................................................................................................................................+++ .................................................+++ writing new private key to 'tls.key' ----- [root@k8s-master01 configmap]# ls dp-cm.yaml game.conf tls.crt tls.key [root@k8s-master01 configmap]# cat tls.crt -----BEGIN CERTIFICATE----- MIIC+TCCAeGgAwIBAgIJAMrQcb29IquJMA0GCSqGSIb3DQEBCwUAMBMxETAPBgNV BAMMCHRlc3QuY29tMB4XDTIxMDgwNDE4MzQ0MloXDTIyMDgwNDE4MzQ0MlowEzER MA8GA1UEAwwIdGVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDjv0GFLe/bw4cE+Kf0SwutDpzBnkZiodnXlgT65kGLI1XFE7s4ast9Z8/sNM84 U+N89YzB/2YIYipldYGzMwtMBlrgTOMnigAvwPXLnEsbt2LGLhZNdG9inqpXtXYK uUTBtEZUy0AdWUwODtIb1nv8pA8edXCKxGmQrqRGNKYYKEZe9qjTvfqzMh7Z5g4a LMqG3Ix16LqCm/VTRWye9tYNl1Bgy70VSOLPu8awDCrUuwO3ne1ZF0HPiKKQ3Poy ewUiFn21vJi4/jVK6/cRaxzsv7fcl18w4v0n36O3lfBcZCrOLWnvDIUBvd6gRDoR 85ECNdUomTVuT0JnWgzr79rTAgMBAAGjUDBOMB0GA1UdDgQWBBT8/K5U7YdbK5r3 +lAXMs7S3h1gwzAfBgNVHSMEGDAWgBT8/K5U7YdbK5r3+lAXMs7S3h1gwzAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBT4+7/Dzq9PNUblqVz5dI6IGDZ hxaZpZPsLzQwJvU1OTSVpR52X9D+qwwJcOTv9liEk09Zcor/gBsAg+NMDYCf3G7p UYede92sv+op2We9UVifTFExRDGXOIDeNAmnT7htvUr59zAWZf+r/rFxLFiSBwNW 0KfyX83ZrADI6tZlyQB8pILRhljjIZQvS7Qoq2VpA8+Md7HVftSzZZiEv5yB9FHl 4MPd5MMhlDDFXEOYoaGQcCLvki5OKoQfH5IjBF11PnY3459SpHcehkQ2bgUmTsSi tJUKbFvxkcvgmvdC1tyc2mOSRV1VzGzlmAiZ3Ny0Hz4itkV3er7mAQzgmgbI -----END CERTIFICATE-----
创建secret tls:
[root@k8s-master01 configmap]# kubectl -n default create secret tls nginx-test-tls --key=tls.key --cert=tls.crt secret/nginx-test-tls created [root@k8s-master01 configmap]# kubectl get secret NAME TYPE DATA AGE nginx-test-tls kubernetes.io/tls 2 57s
挂载到Ingress中
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: nginx-https-test namespace: default annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: https-test.com http: paths: - backend: serviceName: nginx-svc servicePort: 80 tls: - secretName: nginx-test-tls
4.Subpath挂载覆盖的一些问题
在用configmap等时,设置挂载的目录会被覆盖,如果目录里面有问题,更新yaml后会报错。
解决方法:只需要加上Subpath字段,指定只挂载这个文件,其他的不变。
spec: imagePullSecrets: - name: myregistry containers: - image: registry.cn-shenzhen.aliyuncs.com/yanjing123/k8s-example:needlogin name: nginx volumeMounts: - name: conf mountPath: /etc/nginx/nginx.conf subPath: nginx.conf //设置只挂载目录/etc/nginx/下的nginx.conf文件 volumes: - name: conf configMap: name: nginx-conf
5.configmap&screct的热更新
基于文件的形式:
kubectl create cm nginx-conf --from-file=nginx.conf --dry-run=client -oyaml | kubectl replace -f -