写在前面的话
docker 先告一段,现在开始进入 Kubernets(K8S) 的学习阶段,在学习过程中,可结合之前学的 docker swarm 比对着理解。
关于 K8S
先来看一下两个 logo:
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
通用集群架构图:
Master 和 Node 细化:
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 集群一些概念性的东西就说到这里,后续我们会一般使用一边进行更详细的学习,本章节的内容尽可能心底有个底。