【k8s】(四)pod

0x01 设计背景

当多个容器之间需要通信,从而形成层级更高的应用时,集群对容器的管理更复杂,因为需要配置多个容器之前的通信关系,穿透并相互访问。

故设计pod,每个pod包含多个业务容器和一个pause容器,pod中的其他所有容器共享pause的网络栈和存储卷,从而解决了容器的存储和网络交互的问题。

pod是一个容器组。

0x02 通信机制

Pod IP:Kubernetes为每个Pod都分配了唯一的IP地址,称之为Pod IP,一个Pod里的多个容器共享Pod IP地址。

Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,这通常采用虚拟二层网络技术来实现,例如Flannel、Open vSwitch等,因此我们需要牢记一点:在Kubernetes里,一个Pod里的容器与另外主机上的Pod容器能够直接通信。

0x03 pod类型

一般pod:创建后存储到etcd中,随后被master调度到某个node中绑定,然后被该node中的kubelet实例化成一组相关的docker容器并启动,该pod会受容错的自动重启策略和pod迁移策略控制。

static pod:创建后存放在某个指定node的文件中,只在此node上启动和运行。

0x04 pod定义

k8s中的所有资源对象都可以使用yaml或json文件进行定义或描述,如一个hello world的yaml例子:

apiVersion: v1
kind: pod
metadata:
  name: hello world
  labels:
    name: test
spec:
  containers:
  - name: myweb
    image: kubeguide/tomcat-app:v1
    ports:
    - containerPort: 8080
    resources:
      requests:
      memory: "64Mi"
      cpu: "250m"
      limits:
      memory: "128Mi"
      cpu: "500m"
    env:
    - name: MYSQL_SERVICE_HOST
      value: 'mysql'
    - name: MYSQL_SERVICE_PORT
      value: '3306'

Kind为Pod表明这是一个Pod的定义,metadata里的name属性为Pod的名称,在metadata里还能定义资源对象的标签,这里声明myweb拥有一个name=myweb的标签。

Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以被附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。

该例子中声明一个label,其键是name,值是test,当通过查询机制label selector查询时使用类似@ name = test表达式即可匹配到该资源对象。

在Pod里所包含的容器组的定义则在spec一节中声明,这里定义了一个名为myweb、对应镜像为kubeguide/tomcat-app:v1的容器,该容器注入了名为MYSQL_SERVICE_HOST=’mysql’和MYSQL_SERVICE_PORT=’3306’的环境变量(env关键字),并且在8080端口(containerPort)启动容器进程。

Pod的IP加上这里的容器端口(containerPort),组成了一个新的概念——Endpoint,它代表此Pod里的一个服务进程的对外通信地址。一个Pod也存在具有多个Endpoint的情况,比如当我们把Tomcat定义为一个Pod时,可以对外暴露管理端口与服务端口这两个Endpoint。

每个Pod都可以对其能使用的服务器上的计算资源设置限额,当前可以设置限额的计算资源有CPU与Memory两种,其中CPU的资源单位为CPU(Core)的数量,是一个绝对值而非相对值。

对于绝大多数容器来说,一个CPU的资源配额相当大,所以在Kubernetes里通常以千分之一的CPU配额为最小单位,用m来表示。通常一个容器的CPU配额被定义为100~300m,即占用0.1~0.3个CPU。由于CPU配额是一个绝对值,所以无论在拥有一个Core的机器上,还是在拥有48个Core的机器上,100m这个配额所代表的CPU的使用量都是一样的。与CPU配额类似,Memory配额也是一个绝对值,它的单位是内存字节数。

在Kubernetes里,一个计算资源进行配额限定时需要设定以下两个参数。

◎ Requests:该资源的最小申请量,系统必须满足要求。

◎ Limits:该资源最大允许使用的量,不能被突破,当容器试图使用超过这个量的资源时,可能会被Kubernetes“杀掉”并重启。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注