《 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对象中的容器更新其镜像版本;并可根据需要执行回滚操作。
本节中的操作示例仅演示了前三个部分的功能,即应用的部署、服务暴露及相关信息的查看。应用的扩缩容、升级及回滚等操作会在后面的章节中进行详细介绍。
2.4.1 部署应用(Pod)
在Kubernetes集群上自主运行的Pod对象在非计划内终止后,其生命周期即告结束,用户需要再次手动创建类似的Pod对象才能确保其容器中的应用依然可得。对于Pod数量众多的场景,尤其是对微服务业务来说,用户必将疲于应付此类需求。Kubernetes的工作负载(workload)类型的控制器能够自动确保由其管控的Pod对象按用户期望的方式运行,因此,Pod的创建和管理大多都会通过这种类型的控制器来进行,包括Deployment、ReplicaSet、ReplicationController等。
创建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对象。
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的存在时长。
而此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对象会由调度器调度至集群中的某节点运行,此字段即为节点的相关标识信息。
确认Pod对象已转为“Running”状态之后,即可于集群中的任一节点(或其他Pod对象)直接访问其容器化应用中的服务,如图2-11中节点NodeX上的客户端程序Client,或者集群上运行于Pod中的客户端程序。
例如,在集群中任一节点上使用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>
- 点赞
- 收藏
- 关注作者
评论(0)