美文网首页
2022-12-28-configmap基于Secret实现tl

2022-12-28-configmap基于Secret实现tl

作者: DGFM | 来源:发表于2022-12-28 15:42 被阅读0次

configmap:实现配置信息和镜像解耦,实现方式为,将配置文件放到configmap对象中,然后在pod中通过volume挂载的方式实现关联,从而实现导入配置的目的;

使用场景:

通过configmap给pod定义全局环境变量;

通过configmap给pod传递命令参数,如mysql的登录名与密码,可以通过configmap传递;

通过configmap给pod中的容器服务提供配置文件,配置文件以挂载到容器的形式使用;

注意事项:

configmap需要在pod使用之前创建;

pod只能挂载同一个namespace中的configmap;

通常用于非安全加密的配置场景;

configmap通常是小于1M的配置场景;

# configmap测试;

apiVersion:v1

kind:ConfigMap

metadata:

 name:nginx-config   #此处没有指定namespace,表示创建在default空间内,如果调用configmap的pod在其他空间,则需要在metadata段中声明namespace;

data:

 default:| #在此示例中default段中的内容是,nginx配置文件的一段,也就是说,之后运行nginx服务的pod会通过调用名为nginx-config这个ConfigMap资源来实现配置解耦;

    server {

       listen       80;

server_namewww.mysite.com;

       index        index.html index.php index.htm;

       location / {

           root /data/nginx/html;

           if (!-e $request_filename) {

               rewrite ^/(.*) /index.html last;

           }

       }

    }

---

#apiVersion: extensions/v1beta1

apiVersion:apps/v1

kind:Deployment

metadata:

 name:nginx-deployment

spec:

 replicas:1

 selector:

   matchLabels:

     app:ng-deploy-80

 template:

   metadata:

     labels:

       app:ng-deploy-80

   spec:

     containers:

      -name:ng-deploy-80

       image:nginx:1.20.0

       ports:

        -containerPort:80

       volumeMounts:  #因为configmap是通过挂载的方式被pod调用,那么必然需要声明其挂载点位置;

       #- mountPath: /data/nginx/html

       #  name: nginx-static-dir

        -name:nginx-config   #表示要挂载到容器内的什么位置;

         mountPath:  /etc/nginx/conf.d ##这个挂载位置的声明名称,这个名称通常是用来给yaml其他功能段做调用的;

     volumes:    #这里描述了要挂载的内容信息;

     #- name: nginx-static-dir

     #  hostPath:

     #    path: /data/nginx

      -name:nginx-config   #要挂载内容的名称;

       configMap:    #说明挂载内容的类型是configmap;

         name:nginx-config   #configmap的名称;

         items:    #此段中声明了挂载哪个configmap;

             -key:default #key的值引用的是在编写configmap资源对象时,所创建的default段中内容;

               path:mysite.conf   #表示这段内容要以mysite.conf文件的格式挂载,挂载位置就是volumeMounts中声明的mountPath:  /etc/nginx/conf.d;

---

apiVersion:v1

kind:Service

metadata:

 name:ng-deploy-80

spec:

 ports:

  -name:http

   port:81

   targetPort:80

   nodePort:30019

   protocol:TCP

 type:NodePort

 selector:

   app:ng-deploy-80

Secret简介:

其功能类似于configmap,用来给pod提供额外的配置信息。但是Secret是一种包含少量敏感信息的对象,如密码,令牌,密钥等;

Secret的名称必须是合法的DNS子域名;

每个Secret的大小最多为1MiB,主要是为了确保用户创建了过大的Secret导致API服务和kubernetes的内存消耗。不过创建过多小文件也会导致内存消耗,所以可以通过使用资源配额来控制每个namespace中的Secret数量;

在通过yaml文件创建Secret时,可以设置data和stringData字段,两个字段都是可选的。data字段中的所有字符必须是base64编码的字符串,如果不希望执行这种编码字符串也可以选择使用stringData字段,stringData可以使用任何非加密的字符串作为其值,而被调用;

pod可以使用三种方式来调用Secret;

1.作为挂载到一个或多个pod卷中的crt文件或key文件;

2.作为容器的环境变量;

3.由kubelet在为pod拉取镜像时使用(与镜像仓库的认证);

Secret的类型:kubernetes支持多种的Secret类型,不同场景下对应不同Secret,不同类型Secret对应的配置参数也不同;

# Secret测试yaml;

apiVersion:v1

kind:Secret

metadata:

 name:mysecret-data

 namespace:myserver

type:Opaque

data:  #字段中内容必须为base64编码加密的字符串;

 user:YWRtaW4K

 password:MTIzNDU2Cg==

 age:MTgK #非base64加密的会报错

apiVersion:v1

kind:Secret

metadata:

 name:mysecret-stringdata

 namespace:myserver

type:Opaque

stringData:  #非加密要求字段;

 user:'admin'

 password:'123456'

# secret,pod挂载测试;

apiVersion:apps/v1

kind:Deployment

metadata:

 name:myserver-myapp-app1-deployment

 namespace:myserver

spec:

 replicas:1

 selector:

   matchLabels:

     app:myserver-myapp-app1

 template:

   metadata:

     labels:

       app:myserver-myapp-app1

   spec:

     containers:

      -name:myserver-myapp-app1

       image:tomcat:7.0.94-alpine

       ports:

        -containerPort:8080

       volumeMounts:

        -mountPath:/data/myserver/auth

         name:myserver-auth-secret

     volumes:

      -name:myserver-auth-secret

       secret:

         secretName:mysecret-data #挂载指定的secret(创建的secret类型yaml的名称),挂载后会将base64解密为明文;

---

apiVersion:v1

kind:Service

metadata:

 name:myserver-myapp-app1

 namespace:myserver

spec:

 ports:

  -name:http

   port:8080

   targetPort:8080

   nodePort:30018

   protocol:TCP

 type:NodePort

 selector:

   app:myserver-myapp-app1

# 演示如何使用nginx,pod挂载secret类型的证书文件;

kubectl create secret tls myserver-tls-key --cert=./server.crt --key=./server.key -n myserver # 通过已经生成好的crt和key文件,使用kubectl命令直接创建一个名字为myserver-tls-key,资源对象类型为secret,secret类型为tls的pod;

apiVersion:v1

kind:ConfigMap

metadata:

 name:nginx-config

 namespace:myserver

data:

 default:|

    server {

       listen       80;

server_namewww.mysite.com;

       listen 443 ssl;

       ssl_certificate /etc/nginx/conf.d/certs/tls.crt;

       ssl_certificate_key /etc/nginx/conf.d/certs/tls.key;

       location / {

           root /usr/share/nginx/html;

           index index.html;

           if ($scheme = http ){    # 未加条件判断,会导致死循环

              rewrite /https://www.mysite.compermanent;

           }  

           if (!-e $request_filename) {

               rewrite ^/(.*) /index.html last;

           }

       }

    }

---

#apiVersion: extensions/v1beta1

apiVersion:apps/v1

kind:Deployment

metadata:

 name:myserver-myapp-frontend-deployment

 namespace:myserver

spec:

 replicas:1

 selector:

   matchLabels:

     app:myserver-myapp-frontend

 template:

   metadata:

     labels:

       app:myserver-myapp-frontend

   spec:

     containers:

      -name:myserver-myapp-frontend

       image:nginx:1.20.2-alpine

       ports:

          -containerPort:80

       volumeMounts:

          -name:nginx-config

           mountPath:  /etc/nginx/conf.d/myserver

          -name:myserver-tls-key

           mountPath:  /etc/nginx/conf.d/certs

     volumes:

      -name:nginx-config

       configMap:

         name:nginx-config

         items:

             -key:default

               path:mysite.conf

      -name:myserver-tls-key

       secret:

         secretName:myserver-tls-key

---

apiVersion:v1

kind:Service

metadata:

 name:myserver-myapp-frontend

 namespace:myserver

spec:

 type:NodePort

 ports:

  -name:http

   port:80

   targetPort:80

   nodePort:30020

   protocol:TCP

  -name:htts

   port:443

   targetPort:443

   nodePort:30019

   protocol:TCP

 selector:

   app:myserver-myapp-frontend

实验:如何通过secret tls类型验证登录私有镜像仓库;

首先创建secret

方法1:通过命令创建,需要明文填写账号密码;

kubectl create secret docker-registry keyName \        #创建一个docker-registry类型的secret资源对象,名称为keyName的pod;

    --docker-server=registry.myserver.com \        #docker镜像仓库地址;

    --docker-username=USER \        #登录名;

    --docker-password=PASSWORD        #密码;

方法2:通过docker认证文件创建;

# docker login --username=root@aliyun.comregistry.cn-qingdao.aliyuncs.com        #先使用docker login登录镜像仓库站,目的是在本机生成验证文件,注意此处只是本机登录,创建的node无法登录;

# kubectl create secret generic aliyun-registy-images-pull-key \

--from-file=.dockerconfigjson=/root/.docker/config.json \        #将生成的验证信息导入到secret中;

--type=kubernetes.io/dockerconfigjson \        #指定创建的secret类型为kubernetes.io/dockerconfigjson;

-n myserver        #指定namespace;

# 测试使用secert dockerconfigjson类型验证,连接镜像仓库;

#apiVersion: extensions/v1beta1

apiVersion:apps/v1

kind:Deployment

metadata:

 name:myserver-myapp-frontend-deployment

 namespace:myserver

spec:

 replicas:1

 selector:

   matchLabels:

     app:myserver-myapp-frontend

 template:

   metadata:

     labels:

       app:myserver-myapp-frontend

   spec:

     containers:

      -name:myserver-myapp-frontend

       image:registry.cn-qingdao.aliyuncs.com/zhangshijie/nginx:1.16.1-alpine-perl   #此处为要拉取的镜像地址;

       ports:

          -containerPort:80

     imagePullSecrets:  #用来声明引用secret来作为镜像拉取验证方式;

        -name:aliyun-registry-image-pull-key   #引用的secret名称,之前创建的;

---

apiVersion:v1

kind:Service

metadata:

 name:myserver-myapp-frontend

 namespace:myserver

spec:

 ports:

  -name:http

   port:80

   targetPort:80

   nodePort:30022

   protocol:TCP

 type:NodePort

 selector:

   app:myserver-myapp-frontend

相关文章

  • A Secret told

    A Secret told— Ceases to be a Secret—then— A Secret—kept—...

  • 分布式锁入门

    目前主流的有三种: 基于数据库实现 基于Redis实现 基于ZooKeeper实现 1. 基于数据库实现: 基于数...

  • TL

    Don't overthink it. We're all good.

  • In My Secret Life

    in my secret life in my secret life in my secret life in ...

  • fork 与 clone 底层实现

    TL;DR 最近想看 docker 相关的实现,自然涉及底层 namespace, 那么索性从底层先看看 fork...

  • 使用Poi-tl实现的文档导出

    World模板引擎[http://deepoove.com/poi-tl/] 项目利用这个模板引擎实现了超级复杂的...

  • day11

    Servlet JSP 自定义标签 开发步骤 实现标签类,实现标签接口集成半成品的支持类更加方便 登记标签类在tl...

  • 基于动态数组的实现 Java实现 基于链表的栈的实现 Java实现

  • namespaces 学习笔记1:mount ns 源码实现

    TL;DR 最近想看 docker 相关的实现,自然涉及底层 namespace, 所以边做实验边看源码,感兴趣的...

  • namespaces 学习笔记2:uts ns 源码实现

    TL;DR 最近想看 docker 相关的实现,自然涉及底层 namespace, 所以边做实验边看源码,感兴趣的...

网友评论

      本文标题:2022-12-28-configmap基于Secret实现tl

      本文链接:https://www.haomeiwen.com/subject/hsqaqdtx.html