解决什么问题
Docker 解决了环境一致性问题
Docker Compose 解决了单机多服务的问题
K8s 更近一步解决跨机器、自动恢复、负载均衡等问题
关系
Kubernetes 既是一个开源项目 (upstream Kubernetes),也逐渐形成了一套事实标准
Kubernetes = 开源容器编排平台 + API 规范 + 生态标准
一般可以理解为,K8s = Kubernetes
Kubernetes 不是一个类似 nginx 那样,直接部署好就能用的单个软件,而是一套组件,包括控制平面、节点、网络插件等
“安装 Kubernetes”本质上是把所有组件部署好,不是一个单独二进制程序能自然完成的事情。
所以,实际使用上,很少有人直接手工装 Kubernetes 的各种组件,而是用用某个发行版或托管服务
如:
kubeadm 装 Kubernetes
K3s
EKS/GKE/AKS
kubeadm
kubeadm 是 Kubernetes 官方提供的“集群初始化工具”
kubeadm 装出来的,一般就被认为是最接近原版的 Kubernetes
K3s
kubeadm:装原版 Kubernetes 组件
K3s:自己重新打包了一套轻量 Kubernetes 发行版
node
node 节点
一个节点 = 一台物理机/一台虚拟机
pod
最小调度单元
聚合了一个或者多个容器,一般一个 pod 放置一个应用程序(方便解耦)
每一个 pod 创建后,有一个内部 ip,pod 之间通过 ip 来互相访问
svc
pod 容易死掉,如果换新,ip 会变化
Service 服务
将一组 pod 封装为一个 service,对外统一访问,Service 的 ip 不变,对外提供稳定服务,对内将请求转发到健康的 pod 上
内部服务与外部服务
内部服务就是指类似数据库,不对外公开,用户不可访问
外部服务就是指类似前端,对外公开,用户可访问。因此需要在 node 上开一个端口,并和 svc 的端口做映射
ing
Ingress(直译:入口)
管理从集群外部访问集群内部服务的入口和方式,也可以配置域名、负载均衡、SSL 证书等
cm
ConfigMap
由于读写数据库需要知道数据库的地址、密码,这又得配置,所以 K8s 提供了统一的配置入口
secret
专门配置密码的组件
Volume
挂载给数据库,让数据库的数据持久化
Development
当一个节点坏掉了,如何提供服务呢?答案是把 node 复制几份,让 svc 统一管理
将多个 pod 组织在一起,包括滚动更新等功能
sts
StatefulSet
数据库是由状态的,多个数据库之间数据要同步,用这个东西替代 Development
架构设计
MASTER 和 WORKER 架构
worker 是那个真正干活的,实际上就是那个 node
它需要有:
(1)kubelet 管理 pod
(2)kube-proxy 为 pod 提供网络代理和负载均衡
(3)container-runtime 容器运行时,类似 docker engine,它可以灵活更换,包括 containerd、CRI-O、Mirantis
master 包含以下组件(也叫做 Control Plane):
(1)kube-apiserver 集群的入口,命令通过这个东西,转发给对应的组件来处理,也负责集群通信。也包括权限认证,入口可以是 kube-ctl,WebUI 等
(2)etcd 一个高可用的键值对存储系统,类似 Redis,存储所有 pod 的信息,即整个集群的数据库
(3)ControllerManager 管理器,监控 pod,当 pod 坏掉,它会发现,并重启它
(4)Scheduler 调度器,负责监控 node 的节点占用,将 pod 调度到压力更小的节点上
(5)cloud-controller-manager 云服务商自己的 API 接口
Kubernetes 很擅长管理 Worker 上的业务故障,但 Master / Control Plane 自己坏了,是另一个层面的高可用问题(这一般是靠部署三个 master 来解决,少数服从多数,一个 leader,两个 standby)
minikube
一个轻量级 K8s 发行版,在本机运行单 node(单虚拟机)的简单集群