K8S中的Pod

Pod的概念和组成

在安装k8s的文章中提到说,k8s在创建Pod的时候,需要拉取一个gcr.io/pause:2.0 的镜像。

Pod是K8s的基本概念。每个Pod都有一个特殊的被称为“根容器”的Pause容器。除了Pause容器,每个Pod内还有一个或多个用户的业务容器。如图所示:

那么,为什么K8s需要会设计出一个全新的Pod的概念并且Pod有这样的特殊的组成结构?

  • 在一组容器作为一个单元的情况下,很难对“整体”简单地进行判断及有效地进行行动。例如,一个容器挂了,此时算是该容器组都挂了吗?引入业务无关的Pause作为Pod的根容器,以它的状态代表整个容器组的状态,可以简化该问题。
  • Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume。这样既简化了密切关联的业务容器之间的通信问题,也很好的解决了他们之间的文件共享问题。

K8s中的Pod分为两类:

  • 普通Pod
  • 静态Pod

普通Pod

普通Pod一旦被创建,就会被存入etcd中。之后,会被K8s Master调度到某个具体的Node上进行绑定,接下来被Pod被对应Node上kubelet进程实例化成一组相关的Docker容器并启动起来。在默认情况下,当Pod里的某个容器停止时,K8s会自动检测到问题并且重新启动这个Pod,如果pod所在Node宕机,则会将这个Node上的所有Pod重新调度到其他Node节点上。

静态Pod

与普通Pod不同,静态Pod并不会保存在K8s的etcd中,而是存放在某个具体Node上一个文件内,并且只在此Node上运行。

创建静态Pod有两种方式:配置文件方式和HTTP方式。

配置文件方式

设置kubelet的启动参数 --config, 指定kubelet需要监控的配置文件所在的目录,kubelet会定期扫描该目录中.yaml或者.json文件。

修改kubelet配置,增加 KUBELET_ARGS="--config=/etc/kubelet.d/", 重启kubelet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vim /etc/kubernetes/kubelet
###
# kubernetes kubelet (minion) config
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=127.0.0.1"
# The port for the info server to serve on
# KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
# Add your own!
KUBELET_ARGS="--config=/etc/kubelet.d/"

/etc/kubelet.d/添加static-pod.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
name: static-pod
labels:
name: static-pod
spec:
containers:
- name: static-pod
image: nginx
ports:
- name: web
containerPort: 80

结果如图 static-pod-127.0.0.1:

由于静态Pod无法通过API Server管理,所以在master
节点是无法删除该Pod的.
如果要删除该Pod,只需要配置文件从/etc/kubelet.d/目录删除即可。

HTTP配置方式

通过设置kubelet的启动参数--manifest-url, kubelet将会定期懂该URL地址下载Pod的定义文件,并以yaml或者json的格式进行解析,然后创建Pod。