Pod—Kubernetes中的最小调度单位
Pod是Kubernetes中的最小调度单位,应用容器就运行在Pod内。Node是我们运行Pod的机器,一个Node上可以运行很多个Pod。可以说Pod是Kubernetes中最重要的概念。
一个Pod是一组容器的集合,这组容器是紧密相关的,这组容器共享网络和存储等。每个Pod内都运行着一个Init的基础容器,其他的容器在Init容器上建立起来的。同一个Pod内的容器共享Init容器建立起来的网络和存储资源。
如下图所示,一个Pod中运行着A、B、C三个容器,它们都是在Init容器启动后创建的,Init容器负责构建整个Pod的网络与存储等资源。整个Pod中的容器都共享存储与网络。
Talk is cheap,show me code。现在来在我们创建的Kubernetes集群中创建第一个Pod。
执行以下命令:
vim pod-busy-nginx.yaml
pod-busy-nginx.yaml中内容为:
apiVersion: v1
kind: Pod
metadata:
name: pod-busy-nginx
spec:
containers:
- name: busybox
image: busybox
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
- name: nginx
image: nginx
ports:
- containerPort: 80
hostPort: 80
Kubernetes中所有的yaml文件分为四部分:
- apiVersion:资源的版本号。
- kind:资源文件的类别,本例子是Pod资源。
- metadata:一些元数据,本例子中的内容是Pod的名字。
- spec:资源的模板。
pod-busy-nginx.yaml的目标是创建一个Pod,其中有两个容器:
- busybox:其中的command命令的功能时打印字符串,同时呢睡眠3600秒,因为busybox只是一个简版的操作系统,没有前台运行的命令,使用sleep命令,让这个容器能够在前台运行3600秒,也就是一小时。
- nginx:其中的containerPort参数代表的是容器的端口,hostPort是容器的端口映射的宿主机的端口,访问的时候,使用对应宿主机的ip与端口来进行访问。
接下来,让Kubernetes集群执行这个yaml文件:
[root@kubernetes-master01 ~]# kubectl apply -f pod-busy-nginx.yaml
pod/pod-busy-nginx created
查询Pod的运行情况:
[root@kubernetes-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-busy-nginx 2/2 Running 0 38s 10.244.1.4 kubernetes-worker01
pod-busy-nginx的Pod已经运行起来了,它的状态为Running,整个Pod的ip是10.244.1.4,但是这个ip只能在Kubernetes集群中访问,无法在集群外的任何机器上访问。
Pod运行在节点kubernetes-worker01上面,我们可以到这个节点上,查看容器运行的情况,发现有一个pause镜像在运行,这就是init容器。
[root@kubernetes-worker01 ~]# docker ps
CONTAINER ID IMAGE
e68a943f3a60 nginx
e561eab5d0fa busybox
f39b1b4fc35c fvn7v6mj.mirror.aliyuncs.com/mirrorgcrio/pause:3.2
那么我们如何访问Pod中运行的容器呢?pod-busy-nginx的Pod运行在了节点kubernetes-worker01上面,我们可以直接通过此节点的ip与对应的hostPort端口来访问。
可以通过kubectl工具分别查看Pod pod-busy-nginx中的容器busybox与nginx的日志:
[root@kubernetes-master01 ~]# kubectl logs pod-busy-nginx -c busybox
Hello, Kubernetes!
命令中:
- pod-busy-nginx:此参数为运行的Pod的名称。
- -c:此参数指定Pod中的具体容器的名字。
如何验证Pod中的两个容器共有同一个ip呢?先进入busybox容器中,查看它的ip,如下所示,为10.244.1.4:
[root@kubernetes-master01 ~]# kubectl exec -it pod-busy-nginx -c busybox -- /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 86:3a:36:04:5b:49 brd ff:ff:ff:ff:ff:ff
inet 10.244.1.4/24 brd 10.244.1.255 scope global eth0
valid_lft forever preferred_lft forever
然后进入nginx容器,查看它的ip,如下所示,也是10.244.1.4。
[root@kubernetes-master01 ~]# kubectl exec -it pod-busy-nginx -c nginx -- /bin/sh
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether 86:3a:36:04:5b:49 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.244.1.4/24 brd 10.244.1.255 scope global eth0
valid_lft forever preferred_lft forever
关于Pod中的容器共享网络的例子,我们会在后面的文章中,进行验证。
猜你喜欢
如果你对容器化技术的相关知识感兴趣,可以阅读:秀丽的容器化技术Kubernetes专栏