- Pod的概念
详细的Pod解释可参考k8s官网,关于Pod的概念主要有以下几点:
(1)Pod是kubernetes中你可以创建和部署的最小也是最简的单位。一个Pod代表着集群中运行的一个进程;
(2)在Kubrenetes集群中Pod的使用方式;
(3)Pod中如何管理多个容器 - 理解Pod
上面已经说了“Pod是kubernetes中你可以创建和部署的最小也是最简的单位。一个Pod代表着集群中运行的一个进程。”Pod中封装着应用的容器(有的情况下是好几个容器),存储、独立的网络IP,管理容器如何运行的策略选项。Pod代表着部署的一个单位:kubernetes中应用的一个实例,可能由一个或者多个容器组合在一起共享资源。#说明Docker是kubernetes中最常用的容器运行时,但是Pod也支持其他容器运行时。
#容器进行时,看参考如下文章或博客:
(1)解密容器运行时
(2)Kubernetes(k8s)容器运行时(CRI)简介
(3)容器运行时接口、容器网络接口、容器存储接口解析 - Kubrenetes集群中Pod的两种使用方式之一
一个Pod中运行一个容器。
“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。#实战##创建一个nginx容器的可以定义为:cat pod1-deploymentapiVersion: v1kind: Podmetadata:name: nginx-testnamespace: testlabels:app: webspec:containers:- name: front-endimage: nginx:1.7.9ports: ?- containerPort: 80
#创建podkubectl create -f pod1-deployment --namespace=testpod "nginx-test" created
#查看podkubectl get po --namespace=testNAME ?????????????????????????READY ????STATUS ???RESTARTS ??AGEnginx-test ???????????????????1/1 ??????Running ??0 ?????????1m
#查看pod详细情况kubectl describe po nginx-test --namespace=testName: ????????nginx-testNamespace: ???testNode: ????????swarm1/10.0.0.38Start Time: ??Thu, 17 May 2018 17:33:50 +0800Labels: ??????app=webAnnotations: ?<none>Status: ??????RunningIP: ??????????10.244.2.131Containers:front-end:Container ID: ??docker://5af319b84acfa076ac8500f39c81ff05e6664e6562d9593f5c7ba2fde0118372Image: ?????????nginx:1.7.9Image ID: ??????docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451Port: ??????????80/TCPHost Port: ?????0/TCPState: ?????????Running ?Started: ?????Thu, 17 May 2018 17:34:07 +0800Ready: ?????????TrueRestart Count: ?0Environment: ???<none>Mounts: ?/var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro) ???????... ???????...
#进入到pod(容器)内部kubectl exec -it nginx-test ?/bin/bash --namespace=testroot@nginx-test:/# nginx -vnginx version: nginx/1.7.9
##说明kubectl exec这条命令是对docker exec命令的包装,可以让你执行容器内部的命令,如果pod中只有一个容器在运行则此命令可以作用在pod上如:kubectl exec -it [pod] /bin/bash。我们可以使用如下命令来进入一个运行中的pod:kubectl exec -it [pod name] --/bin/bash,-i:用来启动标准输入流STDIN-t:将输入流定向到TTY(伪终端)中-c [container-name]:一个Pod中启动了多个容器,使用该参数来进入特定的容器中。
- Kubrenetes集群中Pod的两种使用方式之二
在一个Pod中同时运行多个容器。
一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位——一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。#实战##在一个pod里放置两个容器:nginx与rediscat test-deploymentapiVersion: v1kind: Podmetadata:name: rss-sitenamespace: testlabels:app: webspec:containers:- name: front-endimage: nginx:1.7.9ports: ?- containerPort: 80- name: rss-readerimage: dockerhub.com/redis:3.2.8ports: ?- containerPort: 88
##说明:文档中“ image: dockerhub.com/redis:3.2.8”并不是真实的,如有需要请自行去下载!
#创建podkubectl create -f test-deployment --namespace=testpods "rss-site"created
#查看podkubectl get po --namespace=testNAME ?????????????????????????READY ????STATUS ???RESTARTS ??AGErss-site ?????????????????????2/2 ??????Running ??0 ?????????2h
#查看pod详细情况kubectl describe po rss-site ?--namespace=testName: ????????rss-siteNamespace: ???testNode: ????????swarm1/10.0.0.38Start Time: ??Thu, 17 May 2018 16:31:57 +0800Labels: ??????app=webAnnotations: ?<none>Status: ??????RunningIP: ??????????10.244.2.130Containers:front-end:Container ID: ??docker://adb8115e7a559b0680a0a8bc79c4f535f1c6b8227acdb25f406c41bc7a29ac3cImage: ?????????nginx:1.7.9Image ID: ??????docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451Port: ??????????80/TCPHost Port: ?????0/TCPState: ?????????Running ?Started: ?????Thu, 17 May 2018 16:32:20 +0800Ready: ?????????TrueRestart Count: ?0Environment: ???<none>Mounts: ?/var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro)rss-reader:Container ID: ??docker://19e642c9bfa2fe2c5161ea015ea02c0470eb360744df452a28f975f81acce30aImage: ?????????dockerhub.datagrand.com/global/redis:3.2.8Image ID: ??????docker-pullable://dockerhub.datagrand.com/global/redis@sha256:de7a70c04bb2de36bb32c44fe26ce92b9715922f80e07cb3f25aaf00a1f49bb5Port: ??????????88/TCPHost Port: ?????0/TCPState: ?????????Running ?Started: ?????Thu, 17 May 2018 16:32:24 +0800Ready: ?????????TrueRestart Count: ?0Environment: ???<none>Mounts: ?/var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro)
#分别进入pod(容器)内部##进入front-endkubectl exec -it rss-site ?-c front-end /bin/bash --namespace=testroot@rss-site:/# nginx -vnginx version: nginx/1.7.9
#进入rss-readekubectl exec -it rss-site ?-c rss-reader ?/bin/bash --namespace=testroot@rss-site:/data#
##说明
在一个Pod中同时运行多个容器是一种比较高级的用法。只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件,如下图所示: - Pod资源
Pod中可以共享两种资源:网络和存储。
(1)网络
每个Pod都会被分配一个唯一的IP地址。Pod中的所有容器共享网络空间,包括IP地址和端口。Pod内部的容器可以使用localhost互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。
(2)存储
可以Pod指定多个共享的Volume。Pod中的所有容器都可以访问共享的volume。Volume也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。 - 使用Pod
你很少会直接在kubernetes中创建单个Pod。因为Pod的生命周期是短暂的,用后即焚的实体。当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。
##说明
(1)重启Pod中的容器跟重启Pod不是一回事。Pod只提供容器的运行环境并保持容器的运行状态,重启容器不会造成Pod重启。
(2)Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。 - Pod和Controller
Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。
具体的实例可参考:创建和管理多个Pod--Deployment
kubernetes中的Pod简述与实践
原文地址:http://blog.51cto.com/wutengfei/2117648