Kubernetes各种资源对象的定义——Pod资源定义

一、pod介绍

Kubernetes为每个Pod都分配了唯一的IP地址,称之为Pod IP,一个Pod里的多个容器共享Pod IP地址。Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,这通常采用虚拟二层网络技术来实现,例如Flannel、Open vSwitch等。因此,在Kubernetes里,一个Pod里的容器与另外主机上的Pod容器能够直接通信。

二、pod类型

Pod有两种类型:普通的Pod和静态Pod(Static Pod)。

1、静态Pod

  • 静态Pod不存放在etcd存储里,而是存放在某个具体的Node上的一个具体文件中,并且只在此Node上启动运行。

2、普通的Pod

普通的Pod一旦被创建,就会被存储到etcd中,随后会被Kubernetes Master调度到某个具体的Node上并进行绑定(Binding),该Node上的kubelet进程会将其实例化成一组相关的Docker容器并启动起来。当Pod里的某个容器停止时,Kubernetes会自动检测到这个问题并且重新启动这个Pod(重启Pod里的所有容器);

如果Pod所在的Node宕机,则会将这个Node上的所有Pod重新调度到其他节点上运行。

Pod、容器与Node的关系如下图:

pod内容器共享volumes pod共享资源_Pod

三、Pod资源定义文件

Kubernetes里的所有资源对象都可以采用yaml或者JSON格式的文件来定义或描述,下面是一个简单的Pod资源定义文件:

apiVersion: v1
kind: Pod
metadata:
  name: myweb
  labels:
    name: myweb
spec:
  containers:
  - name: myweb
    image: kubeguide/tomcat-app: v1
    ports:
    - containerPort: 8080
    env:
    - name: MYSQL_SERVICE_HOST
      value: 'mysql'
    - name: MYSQL_SERVICE_PORT
      value: '3306'
  • apiVersion
  • kindkind为pod表明这是一个Pod的定义
  • metadata里的name属性为Pod的名字,metadata里还能定义资源对象的标签(Label),这里声明myweb拥有一个name=myweb的标签(Label)。
  • spec:Pod里包含的容器组的定义则在spec一节中声明。
  • containers:定义了1个名字为myweb,对应镜像为kubeguide/tomcat-app: v1的容器。
  • ports:在8080端口(containerPort)上启动容器进程。Pod的IP加上这里的容器端口,就组成了一个新的概念——Endpoint,它代表着此Pod里的一个服务进程的对外通信地址。一个Pod也存在着具有多个Endpoint的情况,比如我们把Tomcat定义为一个Pod时,可以对外暴露管理端口与服务端口这两个Endpoint。
  • env:环境变量,该容器注入了名为MYSQL_SERVICE_HOST='mysql’和MYSQL_SERVICE_PORT='3306’的环境变量