Kubernetes是⼀个软件系统,它允许你在其上很容易地部署和管理容器化的应⽤,Kubernetes可以被当作集群的⼀个操作系统来看待。包括服务发现、扩容、负载均衡、⾃恢复,甚⾄领导者的选举。
1. 架构

1.1 控制⾯板(Master)
控制⾯板⽤于控制集群并使它⼯作。它包含多个组件,组件可以运⾏在单个主节点上或者通过副本分别部署在多个主节点以确保⾼可⽤性。
Kubernetes API服务器
你和其他控制⾯板组件都要和它通信。
Scheduler
它调度你的应⽤(为应⽤的每个可部署组件分配⼀个⼯作节点)
Controller Manager
它执⾏集群级别的功能,如复制组件、持续跟踪⼯作节点、处理节点失败等
Etcd
⼀个可靠的分布式数据存储,它能持久化存储集群配置控制⾯板的组件持有并控制集群状态,但是它们不运⾏你的应⽤程序。这是由⼯作节点完成的。
1.2 工作节点(Node)
⼯作节点是运⾏容器化应⽤的机器。运⾏、监控和管理应⽤服务的任务是由以下组件完成的:
容器
Docker、rtk或其他的容器类型。
kubelet
它与API服务器通信,并管理它所在节点的容器。
Kubernetes Service Proxy(kube-proxy)
它负责组件之间的负载均衡⽹络流量。
2. 应⽤
2.1 使用模型
为了在Kubernetes中运⾏应⽤,⾸先需要将应⽤打包进⼀个或多个容器镜像,再将那些镜像推送到镜像仓库,然后将应⽤的描述发布到Kubernetes API服务器。

Kubernetes 会不断地确认应⽤程序的部署状态始终与你提供的描述相匹配。例如,如果你指出你需要运⾏五个web服务器实例,那么Kubernetes总是保持正好运⾏五个实例。如果实例之⼀停⽌了正常⼯作,⽐如当进程崩溃或停⽌响应时,Kubernetes将⾃动重启它。
2.2 运行服务
可以通过 kubectl 命令⾏客户端向运⾏在主节点上的Kubernetes API服务器发出REST请求以与集群交互。

–image=luksa/kubia 显⽰的是指定要运⾏的容器镜像,–port=8080选 项 告 诉 Kubernetes 应 ⽤ 正 在 监 听 8080 端 ⼜ 。 最 后 ⼀ 个 标志 ( –generator)需要解释⼀下,通常并不会使⽤到它,它让Kubernetes创建⼀个ReplicationController,⽽不是Deployment。
当运⾏ kubectl 命令时,它通过向Kubernetes API服务器发送⼀个 REST HTTP请求,在集群中创建⼀个新的ReplicationController对象。然后,ReplicationController创建了⼀个新的pod,调度器将其调度到⼀个⼯作节点上。Kubelet看到pod被调度到节点上,就告知Docker从镜像中⼼中拉取指定的镜像,因为本地没有该镜像。下载镜像后,Docker创建并运⾏容器。

2.3 暴露服务
我们提到过每个pod都有⾃⼰的IP地址,但是这个地址是集群内部的,不能从集群外部访问。要让pod能够从外 部 访 问 , 需 要 通 过 服 务 对 象 公 开 它 , 要 创 建 ⼀ 个 特 殊 的LoadBalancer 类型的服务。
通过创建LoadBalancer 类型的服务,将创建⼀个外部的负载均衡,可以通过负载均衡的公共IP访问pod。
expose 命令的输出中提到⼀个名为kubian-http 的服务。服务是类似于pod和Node的对象,因此可以通过运⾏ kubectl get services 命令查看新创建的服务对象,如下⾯的代码清单所⽰。

现 在 有 外 部 IP 了 , 应 ⽤ 就 可 以 从 任 何 地 ⽅ 通 过http://104.155.74.57:8080 访问。
2.4 不同的角色

Pod
在你的系统中最重要的组件是pod。它只包含⼀个容器,但是通常⼀个pod可以包含任意数量的容器。容器内部是Node.js进程,该进程绑定到8080端⼜,等待HTTP请求。pod有⾃⼰独⽴的私有IP地址和主机名。
ReplicationController的⾓⾊
下⼀个组件是 kubia ReplicationController。它确保始终存在⼀个运⾏中的pod实例。通常,ReplicationController⽤于复制pod(即创建pod的多个副本)并让它们保持运⾏。
Service
新的pod与替换它的pod具有不同的IP地址。这就是需要服务的地⽅——解决不断变化的pod IP地址的问题,以及在⼀个固定的IP和端口,对上对外暴露多个pod。