Pod 就是最小并且最简略的 Kubernetes 对象
Pod、Service、Volume 和 Namespace 是 Kubernetes 集群中四大根本对象,它们可能示意零碎中部署的利用、工作负载、网络和磁盘资源,独特定义了集群的状态。Kubernetes 中很多其余的资源其实只对这些根本的对象进行了组合。
-
Pod -> 集群中的根本单元
-
Service -> 解决如何拜访 Pod 外面服务的问题
-
Volume -> 集群中的存储卷
-
Namespace -> 命名空间为集群提供虚构的隔离作用
Kubernetes 有许许多多的技术概念,同时对应很多 API 对象,其中最重要的也是最根底的是 Pod 对象。Pod 是在 Kubernetes 集群中运行部署利用或服务的最小单元,它是能够反对多容器的。Pod 的设计理念是反对多个容器在一个 Pod 中共享网络地址和文件系统,能够通过过程间通信和文件共享这种简略高效的形式组合实现服务。
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
restartPolicy: Always
- name: busybox
image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
Pod 的内部结构
Pod 代表着集群中运行的过程:共享网络、共享存储
在同一个 Pod 中,有几个概念特地值得关注,首先就是容器,在 Pod 中其实能够同时运行一个或者多个容器,这些容器可能共享网络、存储以及 CPU/ 内存等资源。
首先,咱们须要晓得的是,每个 Pod 都有一个非凡的被称为“根容器”的 Pause 容器。Pause 容器对应的镜像属于 Kubernetes 平台的一部分,通过 Pause 容器使工作在对应 Pod 的容器之间能够共享网络、共享存储。
Pod 共享资源
为什么 Kubernetes 会设计出一个全新的 Pod 概念,并且有这样非凡的构造?次要是因为,应用 Pause 容器作为 Pod 根容器,以它的状态代表整个容器组的状态;其次,Pod 里的多个业务容器共享 Pause 容器的 IP 地址,共享 Pause 容器挂接的 Volume 资源。
-
共享存储资源
能够为一个 Pod 指定多个共享的 Volume 资源。Pod 中的所有容器都能够访问共享的 volume 资源。Volume 也能够用来长久化 Pod 中的存储资源,以防容器重启后文件失落。
-
共享网络资源
每个 Pod 都会被调配一个惟一的 IP 地址。Pod 中的所有容器共享网络空间,包含 IP 地址和端口。Pod 外部的容器能够应用 localhost 相互通信。Pod 中的容器与外界通信时,必须调配共享网络资源,例如应用宿主机的端口映射。
veth 设施的特点
一个设施收到协定栈的数据发送申请后,会将数据发送到另一个设施下来
-
veth 和其它的网络设备都一样,一端连贯的是内核协定栈
-
veth 设施是成对呈现的,另一端两个设施彼此相连
# 物理网卡 eth0 配置的 IP 为 192.168.1.11
# 而 veth0 和 veth1 的 IP 别离是 192.168.2.11 和 192.168.2.10
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ ↑ ↑ |
|..............|...............|...............|.................|
| ↓ ↓ ↓ |
| +----------+ +-----------+ +-----------+ |
| | eth0 | | veth0 | | veth1 | |
| +----------+ +-----------+ +-----------+ |
|192.168.1.11 ↑ ↑ ↑ |
| | +---------------+ |
| | 192.168.2.11 192.168.2.10 |
+--------------|-------------------------------------------------+
↓
Physical Network
Pod 的网络通信
集群网络解决方案: Kubernetes + Flannel
Kubernetes 的网络模型假设了所有 Pod 都在一个间接连通的扁平的网络空间中,这在 GCE(Google Compute Engine)外面是现成的网络模型,Kubernetes 假设这个网络曾经存在了。而在公有云搭建 Kubernetes 集群,就不能假设这个网络曾经存在了。咱们须要本人实现这个网络假如,将不同节点上的 Docker 容器之间的相互拜访先买通,而后能力失常运行 Kubernetes 集群。
-
同一个 Pod 内多个容器之前通过回环网络 (lo – 127.0.0.1) 进行通信
-
各 Pod 之间的通信,则是通过 Overlay Network 网络进行通信
-
而 Pod 与 Service 之间的通信,则是各节点的 iptables 或 lvs 规定
Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络布局服务,简略来说,它的性能就是让集群中的不同节点主机创立的 Docker 容器都具备全集群惟一的虚构 IP 地址。而且它还能在这些 IP 地址之间建设一个笼罩的网络(Overlay Network),通过这个笼罩网络,将数据包一成不变地传递给指标容器内。
不同状况下的网络通信形式
-
同一个 Pod 外部通信:
-
同一个 Pod 共享同一个网络命名空间,共享同一个 Linux 协定栈。
-
不同 Pod 之间通信:
-
Pod1 和 Pod2 在同一台 Node 主机,由 docker0 网桥间接转发申请到 Pod2 下面,- 不通过 Flannel 的转发。
-
Pod1 和 Pod2 不在同一台 Node 主机,Pod 的地址是与 docker0 在同一个网段的,但 docker0 网络与宿主机网卡是两个齐全不同的 IP 网段,并且不同的 Node 之间的通信只能通过宿主机的物理网卡进行。将 Pod 的 IP 地址和所在 Node 的 IP 地址关联起来,通过这个关联让 Pod 能够相互拜访。
-
Pod 至 Service 的网络
-
目前基于性能思考,全副为 iptables 或 lvs 保护和转发。
-
Pod 到外网
-
Pod 想外网发送申请,查找路由表,转发数据包到宿主机的网卡,宿主机网卡实现路由抉择之后,iptables 或 lvs 执行 Masquerade,把源 IP 地址更改为宿主机的网卡的 IP 地址,而后向外网服务器发送申请。
-
外网拜访 Pod
-
通过 Service 服务来向内部提供 Pod 服务。
ETCD 之于 Flannel 提供阐明:
-
存储管理 Flannel 可调配的 IP 地址段资源
-
监控 ETCD 中每一个 Pod 的理论 IP 地址,并在内存中建设保护 Pod 节点的路由表
Pod 的多种类型
Pod 存在多种不同的创立类型来满足不一样的用处
ReplicationController
ReplicationController 用来确保容器利用的正本数量始终保持在用户定义的正本数,即如果有容器异样退出,会主动创立新的 Pod 来代替,而如果异样多呈现的容器会主动回收。
ReplicaSet
在新版本 (相对而言的较优形式) 的 Kubernetes 中倡议应用 ReplicaSet 来取代 ReplicationController 来治理 Pod。尽管 ReplicaSet 和 ReplicationController 并没有实质上的不同,只是名字不一样而已,惟一的区别就是 ReplicaSet 反对汇合式的 selector,可供标签筛选。
尽管 ReplicaSet 能够独立应用,但个别还是倡议应用 Deployment 来主动治理 ReplicaSet 创立的 Pod,这样就无需放心跟其余机制的不兼容问题。比方 ReplicaSet 本身并不反对滚动更新(rolling-update),然而应用 Deployment 来部署就原生反对。
Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式定义方法,用来代替以前应用 ReplicationController 来不便且便捷的治理利用。次要的利用场景,包含:滚动降级和回滚利用、扩容和缩容、暂停和持续。
HPA
HPA 仅仅实用于 Deployment 和 ReplicaSet,在 V1 版本中仅反对依据 Pod 的 CPU 利用率扩缩容,在新版本中,反对依据内存和用户自定义的 metric 动静扩缩容。
StatefulSet
StatefulSet 是为了解决有状态服务的问题,绝对于 Deployment 和 ReplicaSet 而已。其次要的应用场景,包含:稳固的长久化存储、稳固的网络标识、有序部署、有序膨胀。
DaemonSet
DaemonSet 确保全副或者一些 Node 下面运行一个 Pod 正本。当有 Node 退出集群的时候,也会为它们新加一个 Pod。当有 Node 从集群中移除的时候,这些 Pod 也会被回收。删除 DaemonSet 将会删除它所创立的所有 Pod。
应用 DaemonSet 的典型场景就是,在每个节点运行日志收集、运行监控零碎、运行集群存储等服务,只有新加进来的节点都须要运行该服务。
Job
Job 负责批处理工作,仅执行一次的工作,它保障批处理工作的一个或者多个 Pod 胜利完结,才会返回胜利。
Cront Job
Cront Job 治理是基于工夫的 Job,即在给定工夫点只运行一次,且周期行的在给定工夫点运行特定工作。
作者: Escape
链接: https://www.escapelife.site/p…