深入掌握Pod
本章将对Kubernetes如何发布与管理容器应用进行详细说明和示例,主要包括Pod和容器的使用、应用配置管理、Pod的控制和调度管理、Pod的升级和回滚,以及Pod的扩缩容机制等内容。
1.Pod定义详解
YAML格式的Pod定义文件的完整内容如下:
image.png image.png image.png对各属性的详细说明
image.png image.png2.Pod的基本用法
在对Pod的用法进行说明之前,有必要先对Docker容器中应用的运行要求进行说明。
2.1 k8s中对docker容器中应用的运行需求
-
在使用Docker时,可以使用docker run命令创建并启动一个容器。
-
如果我们创建的Docker镜像的启动命令是后台执行程序,例如Linux脚本:
nohup ./start.sh &
-
-
而在Kubernetes系统中对长时间运行容器的要求是:其主程序需要一直在前台执行。
-
Kubernetes需要一个前台命令作为启动命令的原因:
-
如果在kubelet创建包含这个容器的pod之后运行上面nohup ./start.sh命令,则会认为Pod执行结束,立刻销毁该Pod。
-
如果为该Pod定义了ReplicationController,则系统会监控到该Pod已经终止,之后根据RC定义中Pod的replicas副本数量生成一个新的Pod。一旦创建新的Pod,就在执行完启动命令后陷入无限循环的过程中。
-
-
如果一个应用无法改造成前台执行,在k8s中应该如何运行
-
可以使用开源工具Supervisor辅助进行前台运行的功能。
-
Supervisor提供了一种可以同时启动多个后台应用,并保持Supervisor自身在前台执行的机制,可以满足Kubernetes对容器的启动要求。
-
关于Supervisor的安装和使用,请参考官网http://supervisord.org的文档说明。
-
-
-
2.2 对Pod容器的封装和应用进行说明
容器有以下两种方式组成
-
松耦合:Pod可以由1个容器组合而成。
- 以下是名为frontend的Pod只由一个容器组成:
这个frontend Pod在成功启动之后,将启动1个Docker容器。
-
紧耦合:Pod可以由多个容器组合而成
- 两个容器应用为紧耦合的关系,并组合成一个整体对外提供服务时,应将这两个容器打包为一个Pod
例子
frontend和redis两个容器应用为紧耦合的关系
image.png配置文件frontend-localredis-pod.yaml的内容如下:
image.png属于同一个Pod的多个容器应用之间相互访问时仅需要通过localhost就可以通信,使得这一组容器被“绑定”在了一个环境中。
在Docker容器kubeguide/guestbook-php-frontend:localredis的PHP网页中,直接通过URL地址“localhost:6379”对同属于一个Pod的redis-master进行访问。guestbook.php的内容如下:
image.png
运行kubectl create命令创建该Pod:
image.png查看已经创建的Pod:
image.png可以看到READY信息为2/2,表示Pod中的两个容器都成功运行了。
查看这个Pod的详细信息,可以看到两个容器的定义及创建的过程(Event事件信息):
image.png image.png3.静态Pod
-
介绍:
-
静态Pod是由kubelet进行管理的仅存在于特定Node上的Pod。
-
静态Pod总是由kubelet创建的,并且总在kubelet所在的Node上运行。
-
-
特点:
-
它们不能通过API Server进行管理;
-
无法与ReplicationController、Deployment或者DaemonSet进行关联;
-
kubelet无法对它们进行健康检查;
-
3.1 创建静态Pod的两种方式
1.配置文件方式
启动方式
需要设置kubelet的启动参数“--config”,指定kubelet需要监控的配置文件所在的目录,kubelet会定期扫描该目录,并根据该目录下的.yaml或.json文件进行创建操作。
例子
假设配置目录为/etc/kubelet.d/,配置启动参数为--config=/etc/kubelet.d/,然后重启kubelet服务。
在目录/etc/kubelet.d中放入static-web.yaml文件,内容如下:
image.png等待一会儿,查看本机中已经启动的容器:
image.png可以看到一个Nginx容器已经被kubelet成功创建了出来。
到Master上查看Pod列表,可以看到这个static pod:
image.png由于静态Pod无法通过API Server直接管理,所以在Master上尝试删除这个Pod时,会使其变成Pending状态,且不会被删除。
image.png删除该Pod的操作只能是到其所在Node上将其定义文件static-web.yaml从/etc/kubelet.d目录下删除。
image.png2.HTTP方式
通过设置kubelet的启动参数“--manifest-url”,kubelet将会定期从该URL地址下载Pod的定义文件,并以.yaml或.json文件的格式进行解析,然后创建Pod。其实现方式与配置文件方式是一致的。
网友评论