写在前面的话

 

docker 先告一段,现在开始进入 Kubernets(K8S) 的学习阶段,在学习过程中,可结合之前学的 docker swarm 比对着理解。

 

 

关于 K8S

 

先来看一下两个 logo:

【01】Kubernets:捋一捋概念性东西

docker 是 “码头工人”,K8S 是 “舵手”,简单且直接。

那 K8S 到底是啥?这得从编排工具说起,之前学过 docker 自带的 docker swarm。

对于编排工具,网上是这样说的:

编排工具是能扩展管理容器,实现跨主机通信,指定容器运行关系,实现复杂程序简单运行的工具。

截至目前,有几款比较出名的需要知道一下:

1. docker 本身的 docker machine + swarm + compose。

2. mesos + marathon:系统资源调度,能够调度 hadoop 或者容器,并不算专业的容器编排工具。

3. Kubernets(K8S):将容器归类,以 Pod 管理(市场核心)。

和 docker 一样,K8S 也是 Go 语言开发,由谷歌根据自己内部容器调度系统 Borg 重写。我们似乎看到了 Go 语言的未来。

 

选择 K8S 的理由:

1. 自动装箱,自动部署,保证服务可用性。

2. 自我修复,在某个容器 down 掉以后会自动启动新的。

3. 自动水平扩展,服务发现,负载均衡。

4. 自动发布,回滚。

5. 支持密钥和配置管理,能将服务的配置通过服务来加载,而不用本地配置,保证了配置的一致性。

6. 存储编排和任务批处理。

其实这些东西单纯的写出来,很干涩,也很懵逼,所以只有个印象就行,后面会慢慢通过实践来理解。

 

 

K8S 集群

 

既然上了 K8S,就别再想单机怎么工作了。

在 K8S 集群中有两种角色:Master / Node,和 docker swarm 类似,Master 和 Worker,叫法不同而已。

Master 作为集群中枢,意味着集群的操作都需要在它上面执行,所以尽可能多节点高可用,我们测试资源有限就单节点了。

Node 作为干活的节点,没啥数量限制,大于 1 就行。用于运行 Pod。

 

这里引入了一个概念,Pod。那啥是 Pod?

首先我们要记住一点:

K8S 能调度的最小单位是 Pod,不是 docker 容器。

Pod 和容器的区别在于:Pod 是将一个或多个关系非常密切的容器打包在一起形成的集合。

我们可以通过 Master 节点发出指令来管理 Pod 怎么运行,运行多少,使用多少资源等。

举个例子:假如要搭建一个 LAMP 环境,虽然几者看似有很大关系,但实际关系又不紧密,对于这种服务,一般将其拆为单独 Pod 运行。

 

K8S 集群部署很难,有个很直接的难点就在于 K8S 光内部通信一共就需要 5 套证书:

1. etcd 内部通信需要一套证书。

2. etcd 与外部通信需要一套证书。

3. APIServer 间通讯需要一套证书。

4. APIServer 与 Node 通信需要一套证书。

5. Node 与 Node 间通信需要一套证书。

值得庆幸的是,这些证书,我们已经可以实现自动生成。

 

这里可以简单谈谈自己对于 K8S 的看法,该看法只代表我自己:

K8S 真的很香,但这并不意味着它适用于我所有的服务,为了便于维护和故障排除,更为了降低风险,对于数据库这一类有状态且很重要的服务,我还是建议单独运行。

 

 

关于 Master 和 Node

 

通用集群架构图:

【01】Kubernets:捋一捋概念性东西

Master 和 Node 细化:

【01】Kubernets:捋一捋概念性东西

Master 有三个重要组件:

1. APIServer:请求入口,负责解析,处理请求,即网关。

2. Scheduler:调度器,请求到达后,计算 Node 的资源情况,将服务调度到适合的 Node,然后该节点的 Kubelet 启动和操作 Pod。

3. Controller-manager:控制管理器,统一管控资源,监控 Master 节点的健康状态,给 Master 节点做高可用。

 

Master 节点其他组件:

etcd:分布式高性能键值存储数据库,保存集群对象状态信息。apiserver 的所有操作都保存在这里,由此可见其重要性。

在前面 docker 跨节点通信的时候我们也用到了它,忘了的可以回头捋一捋。

 

Node 节点有三个重要组件:

1. Kubelet:相当于 K8S 的 agent,有点像 Zabbix 的 agent。检测当前节点的健康状态,和 apiserver 交互。

2. Kube-proxy:为当前节点 Pod 生成 iptables 或者 ipvs 规则,实现将请求调度到 Pod。和 apiserver 进行通信,及时更新规则。

3. Container engine:不只是 docker,K8S 并非只能编排 docker,还有 RKT 这些。

扩展:关于 Pod 调度实现,在 1.1 版本以前是 userspace,1.11 版本以前是 iptables,之后都是 ipvs。提高调度性能。

 

除了以上需要运行的核心组件以外,K8S  还推荐使用一些附件(add-ons):

1. kube-dns:负责给 K8S 提供 DNS 服务。

2. Igress Controller:为服务提供外网入口。

3. Heapster:提供资源监控。

4. Dashboard:提供 GUI 界面。

5. Federation:提供跨可用区集群。

6. Fluentd-elasticsearch:提供集群日志采集,只存不查。

 

 

小结

 

关于 K8S 集群一些概念性的东西就说到这里,后续我们会一般使用一边进行更详细的学习,本章节的内容尽可能心底有个底。

相关文章: