《 Kubernetes进阶实战》一2.4命令式容器应用编排

举报
华章计算机 发表于 2019/05/29 09:03:30 2019/05/29
【摘要】 本书摘自《 Kubernetes进阶实战》一第二章,第2.4节,作者是马永亮

2.4 命令式容器应用编排

      本节将使用示例镜像“ikubernetes/myapp: v1”来演示容器应用编排的基础操作:应用部署、访问、查看、服务暴露和扩缩容等。一般说来,Kubernetes之上应用程序的基础管理操作由如下几个部分组成。
       1)通过合用的Controller类的资源(如Deployment或ReplicationController)创建并管控Pod对象以运行特定的应用程序,如Nginx或tomcat等。无状态(stateless)应用的部署和控制通常使用Deployment控制器进行,而有状态应用则需要使用StatefulSet控制器。
       2)为Pod对象创建Service对象,以便向客户端提供固定的访问路径,并借助于CoreDNS进行服务发现。
       3)随时按需获取各资源对象的简要或详细信息,以了解其运行状态。
       4)如有需要,则手动对支持扩缩容的Controller组件进行扩容或缩容;或者,为支持HPA的Controller组件(如Deployment或ReplicationController)创建HPA资源对象以实现Pod副本数目的自动伸缩。
       5)滚动更新:当应用程序的镜像出现新版本时,对其执行更新操作;必要时,为Pod对象中的容器更新其镜像版本;并可根据需要执行回滚操作。
本节中的操作示例仅演示了前三个部分的功能,即应用的部署、服务暴露及相关信息的查看。应用的扩缩容、升级及回滚等操作会在后面的章节中进行详细介绍。


       image.png

2.4.1 部署应用(Pod)

       在Kubernetes集群上自主运行的Pod对象在非计划内终止后,其生命周期即告结束,用户需要再次手动创建类似的Pod对象才能确保其容器中的应用依然可得。对于Pod数量众多的场景,尤其是对微服务业务来说,用户必将疲于应付此类需求。Kubernetes的工作负载(workload)类型的控制器能够自动确保由其管控的Pod对象按用户期望的方式运行,因此,Pod的创建和管理大多都会通过这种类型的控制器来进行,包括Deployment、ReplicaSet、ReplicationController等。

  1. 创建Deployment控制器对象

       “kubectl run”命令可于命令行直接创建Deployment控制器,并以--image选项指定的镜像运行Pod中的容器,--dry-run选项可用于命令的测试运行,但并未真正执行资源对象的创建过程。例如,下面的命令要创建一个名为myapp的Deployment控制器对象,它使用镜像ikubernetes/myapp: v1创建Pod对象,但仅在测试运行后即退出:
       ~]$ kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=1
         --dry-run
       NAME       AGE
        myapp   <unknown>
       镜像ikubernetes/myapp: v1中定义的容器主进程为默认监听于80端口的Web服务程序Nginx,因此,如下命令使用“--port=80”来指明容器要暴露的端口。而“--replicas=1”选项则指定了目标控制器对象要自动创建的Pod对象的副本数量。确认测试命令无误后,可移除“--dry-run”选项后再次执行命令以完成资源对象的创建:
       ~]$ kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=1
       deployment.apps/myapp created
       创建完成后,其运行效果示意图如图2-10所示,它在default名称空间中创建了一个名为myapp的Deployment控制器对象,并由它基于指定的镜像文件创建了一个Pod对象。

image.png

       kubectl run命令其他常用的选项还有如下几个,它们支持用户在创建资源对象时实现更多的控制,具体如下。
   ◆   -l, --labels:为Pod对象设定自定义标签。
      --record:是否将当前的对象创建命令保存至对象的Annotation中,布尔型数据,其值可为true或false。
      --save-conf?ig:是否将当前对象的配置信息保存至Annotation中,布尔型数据,其值可为true或false。
      --restart=Never:创建不受控制器管控的自主式Pod对象。
        其他可用选项及使用方式可通过“kubectl run --help”命令获取。资源对象创建完成后,通常需要了解其当前状态是否正常,以及是否能够吻合于用户期望的目标状态,相关的操作一般使用kubectl get、kubectl describe等命令进行。

2.?打印资源对象的相关信息

       kubectl get命令可用于获取各种资源对象的相关信息,它既能够显示对象类型特有格式的简要信息,也能够指定出格式为YAML或JSON的详细信息,或者使用Go模板自定义要显示的属性及信息等。例如,下面是查看前面创建的Deployment对象的相关运行状态的命令及其输出结果:
                                                          ~]$ kubectl get deployments
                                    NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
                                        myapp      1         1         1            1           1m
上面命令的执行结果中,各字段的说明具体如下。
   1)NAME:资源对象的名称。
   2)DESIRED:用户期望由当前控制器管理的Pod对象副本的精确数量。
   3)CURRENT:当前控制器已有的Pod对象的副本数量。
   4)UP-TO-DATE:更新到最新版本定义的Pod对象的副本数量,在控制器的滚动更新模式下,它表示已经完成版本更新的Pod对象的副本数量。
   5)AVAILABLE:当前处于可用状态的Pod对象的副本数量,即可正常提供服务的副本数。
   6)AGE:Pod的存在时长。

image.png

       而此Deployment控制器创建的唯一Pod对象运行正常与否,其被调度至哪个节点运行,当前是否就绪等也是用户在创建完成后应该重点关注的信息。由控制器创建的Pod对象的名称通常是以控制器名称为前缀,以随机字符为后缀,例如,下面命令输出结果中的myapp-6865459dff-5nsjc:
       $ kubectl get pods -o wide
      NAME                     READY  STATUS   RESTARTS  AGE  IP          NODE
      myapp-6865459dff-5nsjc   1/1    Running  0         3m   10.244.3.2  node03.
          ilinux.io
       上面命令的执行结果中,每一个字段均代表着Pod资源对象一个方面的属性,除了NAME之外的其他字段及功用说明如下。
   ①READY:Pod中的容器进程初始化完成并能够正常提供服务时即为就绪状态,此字段用于记录处于就绪状态的容器数量。
   ②STATUS:Pod的当前状态,其值可能是Pending、Running、Succeeded、Failed和Unknown等其中之一。
   ③RESTARTS:Pod对象可能会因容器进程崩溃、超出资源限额等原因发生故障问题而被重启,此字段记录了它重启的次数。
   ④IP:Pod的IP地址,其通常由网络插件自动分配。
   ⑤NODE:创建时,Pod对象会由调度器调度至集群中的某节点运行,此字段即为节点的相关标识信息。

image.png


       确认Pod对象已转为“Running”状态之后,即可于集群中的任一节点(或其他Pod对象)直接访问其容器化应用中的服务,如图2-11中节点NodeX上的客户端程序Client,或者集群上运行于Pod中的客户端程序。

image.png

       例如,在集群中任一节点上使用curl命令对地址为10.244.3.2的Pod对象myapp-6865459dff-5nsjc的80端口发起服务请求,命令及结果如下所示:
       [ik8s@node03 ~]$ curl http://10.244.3.2:80/
       Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。