时间: 2020-09-03 00:08:26 人气: 2282 评论: 0
环境说明:
主机名 | 操作系统版本 | ip | docker version | kubelet version | 配置 | 备注 |
|---|---|---|---|---|---|---|
master | Centos 7.6.1810 | 172.27.9.131 | Docker 18.09.6 | V1.14.2 | 2C2G | master主机 |
node01 | Centos 7.6.1810 | 172.27.9.135 | Docker 18.09.6 | V1.14.2 | 2C2G | node节点 |
node02 | Centos 7.6.1810 | 172.27.9.136 | Docker 18.09.6 | V1.14.2 | 2C2G | node节点 |
k8s集群部署详见:Centos7.6部署k8s(v1.14.2)集群
k8s学习资料详见:基本概念、kubectl命令和资料分享
在实际的应用部署中, 经常需要为各种应用/中间件配置各种参数, 如数据库地址、 用户名、 密码等, 而且大多数生产环境中的应用程序配置较为复杂, 可能是多个 Config 文件、 命令行参数和环境变量的组合。 要完成这样的任务有很多种方案, 比如:
1.可以直接在打包镜像的时候写在应用配置文件里面,但这种方式的坏处显而易见,因为在应用部署中往往需要修改这些配置参数,或者说制作镜像时并不知道具体的参数配置,一旦打包到镜像中将无法更改配置。另外,部分配置信息涉及安全信息(如用户名、 密码等),打包人镜像容易导致安全隐患; 2.可以在配置文件里面通过ENV环境变量传入,但是如若修改ENV就意味着要修改yaml文件,而且需要重启所有的容器才行; 3.可以在应用启动时在数据库或者某个特定的地方取配置文件。
显然,前两种方案不是最佳方案,而第三种方案实现起来又比较麻烦。为了解决这个难题,kubernetes引入ConfigMap这个API资源来满足这一需求。
ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷,ConfigMap象用于为容器中的应用提供配置数据以定制程序的行为,不过敏感的配置信息,例如密钥、证书等通常由Secret对象来进行配置。它们将相应的配置信息保存于对象中,而后在Pod资源上以存储卷的形式将其挂载并获取相关的配置,以实现配置与镜像文件的解耦。
制作基础镜像loong576/date-random,创建pod date-random-configmap,pod中包含容器centos-date和nginx-server,其中容器centos-date由镜像loong576/date-random创建,通过访问容器nginx-server验证参数是否生效。
制作镜像loong576/date-random并上传dockerhub
[root@master loong576]# more Dockerfile FROM centos:centos7.6.1810 ADD date-random.sh /usr/bin/date-random ENTRYPOINT /usr/bin/date-random [root@master loong576]# more date-random.sh #!/bin/bash mkdir /var/htdocs while : do /usr/bin/echo "date is : " `date` >> /var/htdocs/index.html /usr/bin/echo "RANDOM is : " `echo $RANDOM` >> /var/htdocs/index.html sleep 5 done [root@master loong576]# docker build -t loong576/date-random . Sending build context to Docker daemon 4.096kB Step 1/3 : FROM centos:centos7.6.1810 ---> f1cb7c7d58b7 Step 2/3 : ADD date-random.sh /usr/bin/date-random ---> 58296331ae70 Step 3/3 : ENTRYPOINT /usr/bin/date-random ---> Running in e9a3184518e7 Removing intermediate container e9a3184518e7 ---> 07db2452d706 Successfully built 07db2452d706 Successfully tagged loong576/date-random:latest [root@master loong576]# docker images |grep loong576/date-random loong576/date-random latest 07db2452d706 24 seconds ago 202MB
基础镜像为centos:centos7.6.1810,向其中写入脚本date-random.sh并执行,该脚本运行date和echo $RANDOM命令,前者输出当前时间,后者输出0~32767之间的随机数,脚本循环时间为5秒。
[root@master loong576]# docker push loong576/date-random The push refers to repository [docker.io/loong576/date-random] ec4ecb05d6b3: Pushed 89169d87dbe2: Layer already exists latest: digest: sha256:a680438f09b92f40b38f3da5f9ea34e4b3561c540f1093d9cbcc2385c0184551 size: 736
上传至dockerhub前需执行登录操作docker login
[root@master loong576]# more date-random-configmap.yaml apiVersion: v1 kind: Pod metadata: name: date-random-configmap spec: containers: - image: loong576/date-random name: centos-date volumeMounts: - name: html mountPath: /var/htdocs - image: nginx name: nginx-server volumeMounts: - name: html mountPath: /usr/share/nginx/html readOnly: true volumes: - name: html emptyDir: {} [root@master loong576]# kubectl apply -f date-random-configmap.yaml pod/date-random-configmap created [root@master loong576]# kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES date-random-configmap 2/2 Running 0 14s 10.244.1.203 node01 <none> <none> [root@master loong576]# curl 10.244.1.203 date is : Mon Sep 16 02:51:21 UTC 2019 RANDOM is : 17563 date is : Mon Sep 16 02:51:26 UTC 2019 RANDOM is : 434 date is : Mon Sep 16 02:51:31 UTC 2019 RANDOM is : 18246 date is : Mon Sep 16 02:51:36 UTC 2019 RANDOM is : 2225
运行date-random-configmap.yaml并访问容器nginx-server(nginx默认端口为80),发现每5秒输出date和随机数,符合预期。
Dockerfile中的两种指令分别定义命令与参数这两个部分:
CMD也可以执行命令,一般为默认的启动命令。
k8s中与ENTRYPOINT和CMD对应的如下:
Docker | Kubernetes | 说明 |
|---|---|---|
ENTRYPOINT | command | 在容器中执行可执行程序 |
CMD | args | 传递给可执行程序的参数 |
[root@master loong576]# more nginx.yaml apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx name: nginx command: ["/bin/echo"] args: ["hello","world"] [root@master loong576]# kubectl apply -f nginx.yaml pod/nginx created [root@master loong576]# kubectl logs nginx hello world
可以查看日志可以看到pod nginx的输出为'hello world',与pod里面command和args中的定义一致。
[root@master loong576]# more date-random.sh #!/bin/bash mkdir /var/htdocs INTERVAL=$1 while : do /usr/bin/echo "date is : " `date` >> /var/htdocs/index.html /usr/bin/echo "RANDOM is : " `echo $RANDOM` >> /var/htdocs/index.html sleep $INTERVAL done [root@master loong576]# more Dockerfile FROM centos:centos7.6.1810 ADD date-random.sh /usr/bin/date-random ENTRYPOINT ["/usr/bin/date-random"] CMD ["10"] [root@master loong576]# docker build -t loong576/date-random:args . Sending build context to Docker daemon 5.12kB Step 1/4 : FROM centos:centos7.6.1810 ---> f1cb7c7d58b7 Step 2/4 : ADD date-random.sh /usr/bin/date-random ---> 307e2f66dfa4 Step 3/4 : ENTRYPOINT ["/usr/bin/date-random"] ---> Running in ab41b93f6b28 Removing intermediate container ab41b93f6b28 ---> 5f536f70da1f Step 4/4 : CMD ["10"] ---> Running in 90f5d58c68fb Removing intermediate container 90f5d58c68fb ---> 8bf9ce828481 Successfully built 8bf9ce828481 Successfully tagged loong576/date-random:args [root@master loong576]# docker push loong576/date-random:args The push refers to repository [docker.io/loong576/date-random] 200d475bbffa: Pushed 89169d87dbe2: Layer already exists args: digest: sha256:08e4c791dc9d6b71ce45b13768ab09194cc11ecd4856b52f2719372d912ee9c1 size: 736
将之前的循环间隔5秒修改为参数INTERVAL,在Dockerfile中传递该参数值为10秒,上传dockerhub。Dockerfile中ENTRYPOINT和CMD后面的[]表明执行格式为Exec,区别于之前的Shell格式。
[root@master loong576]# docker run -itd --name centos-args loong576/date-random:args 159e3204dad64516adc4681e9d7b1fe9f4d11a178e3cca7e9a9f13fd10252a43 [root@master loong576]# docker run -d --name centos-args loong576/date-random:args ee938a39167afb52fe72f9367ad23d9e8b2985037320ad1ccc6ec7e3f9bc9255 [root@master loong576]# docker exec -it centos-args sh sh-4.2# [root@master loong576]# [root@master loong576]# [root@master loong576]# [root@master loong576]# docker run -it --name centos-args loong576/date-random:args [root@master loong576]# docker run -itd --name centos-args loong576/date-random:args 2a25e91a0f5b54c1c568ce089d879d50cd9a12513be5d365dc5743d74f2ac737 [root@master loong576]# docker ps |grep centos 2a25e91a0f5b loong576/date-random:args "/usr/bin/date-rando…" 18 seconds ago Up 16 seconds centos-args [root@master loong576]# docker exec -it centos-args sh sh-4.2# cd /var/htdocs/ sh-4.2# ls -alrt total 4 drwxr-xr-x 1 root root 20 Sep 16 07:24 .. drwxr-xr-x 2 root root 24 Sep 16 07:24 . -rw-r--r-- 1 root root 234 Sep 16 07:25 index.html sh-4.2# tail -f index.html date is : Mon Sep 16 07:24:31 UTC 2019 RANDOM is 技术沙龙 教程文章 热点综合