配置管理ConfigMap&Secret

一.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 -
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇