2022-12-28-configmap基于Secret实现tls认证;

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容