k8s各个组件

POD

image-20190622163903124

  • 每个POD都有一个Pause容器,类似于docker-compose容器,它可以将POD内的其他容器关联起来。也可以对服务的状态进行监控。
没有 Pause:
┌───────────────┐  ┌───────────────┐
│ Container A   │  │ Container B   │
│ IP: 10.0.0.1  │  │ IP: 10.0.0.2  │  ← 各自独立 IP
│ eth0          │  │ eth0          │  ← 各自独立网卡
└───────────────┘  └───────────────┘

有 Pause:
┌─────────────────────────────────────┐
│               Pod                   │
│  ┌─────────┐                        │
│  │ Pause   │ ← 持有网络命名空间        │
│  │ IP: 10.0.0.1                     │
│  │ eth0                             │
│  └────┬────┘                        │
│       │ 共享                         │
│  ┌────┴────┬──────────┐             │
│  ▼         ▼          ▼             │
│ Container A Container B             │
│ (共享 IP)  (共享 IP)                 │
│ localhost 互通                       │
└─────────────────────────────────────┘

特点:

特点 说明
极简 只有一个永久 sleep 的进程
资源占用极低 几乎不消耗 CPU/内存
第一个启动 Pod 创建时最先启动
最后一个退出 Pod 删除时最后退出
不做任何业务 只负责持有命名空间
  • 一般POD里只运行一个容器。很少情况下会运行多个容器(helper container),此时所有容器共享一个IP,互相之间可以使用localhost访问。 image-20200117203921143

ReplicaSet

image-20190622171353793

如果某个POD在运行过程中挂掉,ReplicaSet就会在另一个机器上重启一个POD,保证服务的正常运行。

Deployment

image-20190622171646379

当应用有新版本要部署时,Deployment会启动一个新的ReplicaSet。例如原来的ReplicaSet有两个POD,则新的ReplicaSet先新建一个POD,等成功部署后,把原来的POD删除:

image-20190622173029852

最终状态如下:

image-20190622173627950

现在版本为v2。原来的v1版本下线。实际上所有步骤对于我们而言都是透明的。

Service

image-20190622175434110

kube-proxy

Service只存在于k8s内存,将访问IP映射为访问服务名。

那所有节点怎么知道映射关系的呢。

每个POD节点都有一个kube-proxy报务,当Service更新时,会维护一个路由表。