因工作项目需要,这两周在踩坑 Kubernetes ,当前重点查阅了 Kubernetes 的核心概念、基础架构、工作原理和部署搭建集群、用kubeadm工具管理 Kubernetes 集群。
以下是个人对 Kubernetes 学习的总结,若日后发现有理解不准确的地方,将会修改或重写本文。
Kubernetes是什么?
Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。用于容器化应用程序的部署,扩展和管理。提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。目标是让部署容器化应用简单高效。
Kubernetes主要用于管理容器化应用和服务,通过Kubernetes能够进行应用的自动化部署和扩缩容。Kubernetes会将组成应用的容器组合成一个逻辑单元进行管理。
其特性如下:
基于容器对资源的要求和约束自动部署容器;
当容器失败时,会对容器进行重启;当所部署的Node节点有问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器;直到容器正常运行时,才会对外提供服务;
服务发现和负载均衡;
自动挂接存储系统。
Kubernetes属于主从分布式架构,主要由Master 节点和Worker 节点组成。
Master Node:控制节点,对集群进行调度管理。
Worker Node:真正的工作节点,运行业务应用的容器。
Master Node(主节点)的组成部分:
API Server是所有REST命令的入口,也作为集群的网关。默认情况,客户端通过API Server对集群进行访问,用API Server作为访问Node和Pod(以及service)的堡垒和代理/通道。
Kubernetes默认使用etcd作为集群整体存储,etcd被用来共享配置和服务发现,集群的所有状态都存储在etcd实例中,并具有监控的能力。
Controller-Manager Serve用于执行大部分的集群层次的功能,它既执行生命周期功能,也执行API业务逻辑。
Scheduler负责根据调度策略自动将Pod部署到合适Node中:scheduler监控未绑定的pod,并将其绑定至特定的node节点。先预选【筛选出符合要求的Node列表】、后优选【按照优选策略为待选的Node进行打分和排序,从中获取最优Node】。
Worker Node(从节点)的组成部分:
Kubelet负责驱动容器执行,是Pod是否能够运行在特定Node上的最终裁决者。负责管理Pod、容器、镜像、数据卷等,实现集群对节点的管理,并将容器的运行状态汇报给API Server。
Pod为基本的执行单元,可以拥有多个容器和存储数据卷,能够方便在每个容器中打包一个单一的应用。
Container Runtime运行在每个node上,负责下载镜像和运行容器。
kubelet使用gRPC框架与容器运行时进行通信,ImageService提供拉取、查看、和移除镜像的RPC。RuntimeSerivce则提供管理Pods和容器生命周期管理的RPC,以及与容器进行交互。
kube proxy 提供了一种访问一群pod的途径。通过创建一个虚拟的IP来实现,客户端能够访问此IP,并能够将服务透明的代理至Pod。每一个Node都会运行一个kube-proxy。 kube proxy负责为Pod创建代理服务;引到访问至服务;并实现服务到Pod的路由和转发,以及通过应用的负载均衡。
kube proxy通过iptables规则引导访问至服务IP,并将重定向至正确的后端应用。
kubectl是Kubernetes集群的命令行接口,实现在集群中进行各种资源的增删改查等操作。其语法格式为:
kubectl 动作 资源类型 资源名称 可选参数
Add-on:是对Kubernetes核心功能的扩展,例如增加网络和网络策略等能力。
ACI 通过与Cisco ACI集成的容器网络和网络安全。
Calico 是一个安全的3层网络和网络策略提供者。
Canal 联合Fannel和Calico,通过网络和网络侧。
Cilium 是一个3层网络和网络侧插件,它能够透明的加强HTTP/API/L7 策略。其即支持路由,也支持overlay/encapsultion模式。
Flannel 是一个overlay的网络提供者。
CoreDNS 是一个灵活的,可扩展的DNS服务器,它能够作为Pod集群内的DNS进行安装。
Ingress 提供基于Http协议的路由转发机制。
Dashboard 是Kubernetes的web用户界面。
关于Kubernetes集群部署方案,Kubernetes官方推荐的由3种:
Minikube方案:
Minikube是由Kubernetes社区维护的单机版的Kubernetes集群,支持macOS, Linux, and Windows等多种操作系统平台,使用最新的官方stable版本,并支持Kubernetes的大部分功能。Minikube实际是跑在本地的虚拟机中的,需要事先安装一套Hypervisor。
Kubeadm方案:
Kubeadm提供kubeadm init和kubeadm join,可用于快速部署Kubernetes集群。在生产环境中常用Kubeadm工具快速部署Kubernetes集群,也是学习和实验时常用的Kubernetes集群管理工具,建议熟练使用。
Binary部署方案:
从Kubernetes官网下载对应OS发行版的二进制包,在master和Worker上手动部署并配置每个组件,组成Kubernetes集群。这种方式部署比较繁琐,但可以从安装部署过程中学习更多Kubernetes工作原理,更有利于掌握和高阶维护Kubernetes集群,遇到问题可以快速排查。如果时间充足,建议采用Binary部署方案。
但如果你所在的公司不允许花费整块时间来手工部署并配置Kubernetes集群,那只需要熟练应用Kubeadm工具就可以了。比如笔者所在的地方,某高位者就不允许笔者在工作地点花费时间研究各组件间的关系,看到笔者在terminal上敲指令就会找笔者麻烦,支使笔者去干另外一件事情。笔者对某项技术的深入研究都是在自个儿家里利用夜间和周末的整块时间来探索研究的。
因为实验条件有限,我只在自己的电脑上搭建了3节点的Kubernetes集群,但笔者所在地方的生产环境好像也是四五个节点的小集群。另外笔者对VM实例分配的资源相对比较紧张,只能做实验验证使用。我的VM实例都是2核心的CPU资源和2GB的Mem资源,如果硬件资源充足,建议至少使用8核心的CPU资源和6GB的Mem资源作为实验实例。
孟伯,20200411
交流联系:微信 1807479153 ,QQ 1807479153