Docker 的管理痛点
Docker 虽然好用,但是面对超大的集群,成千上万的容器,存在着困难的编排,管理和调度问题。我们迫切需要一套管理系统,对 Docker 及容器进行更高级更灵活的管理。
什么是 K8s
K8s 是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,可以促进声明式配置和自动化。K8s 拥有一个庞大且快速增长的生态系统。通过 K8s 我们可以,快速部署应用,快速扩展应用,无缝对接新的应用功能,节省资源,优化硬件资源的使用。
云架构&云原生
- 云和 K8s 是什么关系
云就是使用容器构建的一套服务集群网络,云由很多的大量容器构成。K8s 就是管理云中的容器。 - 常见几类云架构
- On-Premises, 本地部署,硬件网络中间件,服务都自己弄。
- Iaas(基础设施服务): 基础服务提供商提供硬件,网络,存储,DNS 等。用户购买或租用云主机。
- Paas(平台即服务): 一些中间件,比如 MySQL/ES/MQ 等等。
- Saas(软件及服务): 在平台上部署自己的应用,向外提供服务。
- Serverless: 无服务,不需要服务器,站在用户的角度考虑,用户只需要使用云服务器即可,不需要考虑云服务器所在的基础环境,软件环境等等。
- 云原生
为了让应用程序(项目,软件服务)都运行在云上的解决方案,这样的方案叫做云原生。特点:
- 容器话,所有服务都必须部署在容器中。
- 微服务。
- CI/CD。
- DevOps。
K8s 架构原理
K8s 架构是一个 Master 对应一群 Node 节点。
Master 节点的结构如下:
- Apiserver 即 K8s 网关,所有指令请求都必须经过 apiserver。
- Scheduler 调度器,使用调度算法,把请求调度到某一个 Node 节点。
- Contorller 控制器,维护 K8s 资源对象。
- etcd 存储资源对象。
Node 节点的结构如下: - Kubelet 在每一个 Node 节点都存一份,在 Node 节点上的资源操作都由 Kubelet 来执行。
- Kube-proxy 代理服务,处理服务间负载均衡。
- Pod 是 K8s 管理的基本单元(最小单元),Pod 内部是容器,K8s 不直接管理容器,而是管理 Pod。
- Docker 运行容器的基础环境,容器引擎。
- Fluentd 日志收集服务。
K8s 核心组件
- K8s 组件
K8s 是用来管理容器,但是不直接操作容器,最小操作单元是 Pod(间接管理容器):
- 一个 Master 有一群 Node 节点与之对应。
- Master 节点不存储容器,只负责调度,网关,控制器,资源对象存储。
- 容器的存储在 Node 节点,容器时存储在 Pod 内部的。
- Pod 内部可以有一个容器,或者多个容器。
- Kubelet 负责本地 Pod 的维护。
- Kube-proxy 负责负载均衡,在多个 Pod 之间来做负载均衡。
-
Pod 是什么?
Pod 也是一个容器,这个容器中装的是 Docker 创建的容器,Pod 是用来封装容器的一个容器,Pod 是一个虚拟化分组。
Pod 相当于独立主机,可以封装一个或者多个容器。
Pod 拥有自己的 IP 地址,主机名,相当于一台独立的沙箱环境。 -
Pod 到底用来干什么?
通常情况下,在服务部署时候,使用 Pod 来管理一组相关的服务。一个 Pod 中要么部署一个服务,要么部署一组有关系的服务。 -
Web 服务集群如何实现?
实现服务集群,只需要复制多方 Pod 的副本即可,这也是 K8s 管理的先进之处,K8s 如果继续扩容,只需要控制 Pod 数量即可。 -
Pod 底层网络访问
服务容器之间访问,相当于访问本地服务一样,性能非常高。 -
MySQL 使用容器化部署,存在什么样的问题?
- 容器是有声明周期的,一旦宕机,数据丢失。
- Pod 部署,Pod 是有声明周期的,也有可能造成数据丢失。
对于 K8s 来说,不能使用 Deployment 部署有状态服务。需要 StatefulSet 来部署。
K8s 的服务注册与发现
Pod 是虚拟的资源对象(进程),没有对应实体(物理机,物理网卡)与之对应,无法直接对外提供服务。如果 Pod 想对外提供服务,必须
绑定物理机端口。
Pod 是一个进程,是有声明周期的。宕机,版本更新,都会创建新的 Pod, 这时 IP 地址会发生变化,Hostname 会发生变化,使用 Nginx 做
负载均衡就不太合适了。我们需要依赖 Service 的能力。