《k8s权威指南》读书笔记-Pod定义&基本用法&静态Pod

深入掌握Pod

  本章将对Kubernetes如何发布与管理容器应用进行详细说明和示例,主要包括Pod和容器的使用、应用配置管理、Pod的控制和调度管理、Pod的升级和回滚,以及Pod的扩缩容机制等内容。

1.Pod定义详解

YAML格式的Pod定义文件的完整内容如下:

image.png
image.png
image.png

对各属性的详细说明

image.png
image.png

2.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只由一个容器组成:
image.png
image.png

  这个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.png

3.静态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.png

2.HTTP方式

  通过设置kubelet的启动参数“--manifest-url”,kubelet将会定期从该URL地址下载Pod的定义文件,并以.yaml或.json文件的格式进行解析,然后创建Pod。其实现方式与配置文件方式是一致的。

你可能感兴趣的:(《k8s权威指南》读书笔记-Pod定义&基本用法&静态Pod)