3.2 Pod的基本用法

在对Pod的用法进行说明之前,有必要先对Docker容器中应用的运行要求进行说明。

在使用Docker时,可以使用docker run命令创建并启动一个容器。而在Kubernetes系统中对长时间运行容器的要求是:其主程序需要一直在前台运行。如果我们创建的Docker镜像的启动命令是后台执行程序,例如Linux脚本:

则在kubelet创建包含这个容器的Pod之后运行完该命令,即认为Pod执行结束,将立刻销毁该Pod。如果为该Pod定义了ReplicationController,则系统会监控到该Pod已经终止,之后根据RC定义中Pod的replicas副本数量生成一个新的Pod。一旦创建新的Pod,就在运行完启动命令后陷入无限循环的过程中。这就是Kubernetes需要我们自己创建Docker镜像并以一个前台命令作为启动命令的原因。

对于无法改造为前台执行的应用,也可以使用开源工具Supervisor辅助进行前台运行的功能。Supervisor提供了一种可以同时启动多个后台应用,并保持Supervisor自身在前台执行的机制,可以满足Kubernetes对容器的启动要求。关于Supervisor的安装和使用,请参考官网的文档说明。

接下来讲解Pod对容器的封装和应用。

Pod可以由1个或多个容器组合而成。在上一节Guestbook的例子中,名为frontend的Pod只由一个容器组成:

这个frontend Pod在成功启动之后,将启动1个Docker容器。

另一种场景是,当frontend和redis两个容器应用为紧耦合的关系,并组合成一个整体对外提供服务时,应将这两个容器打包为一个Pod,如图3.1所示。

图3.1 包含两个容器的Pod

配置文件frontend-localredis-pod.yaml的内容如下:

属于同一个Pod的多个容器应用之间相互访问时仅需通过localhost就可以通信,使得这一组容器被“绑定”在一个环境中。

在Docker容器kubeguide/guestbook-php-frontend:localredis的PHP网页中,直接通过URL地址“localhost:6379”对同属于一个Pod的redis-master进行访问。guestbook.php的内容如下:

运行kubectl create命令创建该Pod:

查看已经创建的Pod:

可以看到READY信息为2/2,表示Pod中的两个容器都成功运行了。

查看这个Pod的详细信息,可以看到两个容器的定义及创建的过程(Event事件信息):