【Kubernetes】K8s笔记(一):什么是k8s,它解决了什么问题,它的机制是什么
这个系列是我学习罗剑锋老师在极客时间开设的专栏《Kubernetes 入门实战课》留下的笔记,方便自己快速复习
0. 管理容器——容器编排
容器编排 Container Orchestration。一是容器,现代程序不同于以往部署在虚拟机或者物理机上,它们运行在容器中;二是编排,编排就是部署和管理应用程序,动态地响应变化。一个编排系统应该至少拥有下面的功能:
-
回滚
-
滚动升级
-
故障自愈
-
自动扩容/缩容
只需要最初的一些人工配置,编排系统就可以一劳永逸地帮助运维人员完成上述工作。
1. Kubernetes 是什么
Kubernetes 就是一个生产级别的容器编排平台和集群管理系统。开发者将应用程序打包成容器,声明运行方式,然后交给 Kubernetes 守护运行中的应用。同时,Kubernetes 提供了丰富的工具和 API 来控制、观测运行在平台之上的应用程序。
Docker & K8s
docker和k8s之间的区别,一个是容器技术,一个是容器编排技术,两者思考的维度是不一样的,就容器而言,容器解决的问题是隔离,是一次打包到处运行的问题,最大的价值就在于镜像的迁移。编排技术则是关注的是整个系统的问题,如果你只关注一个服务,迁移一个服务,那docker就够,但要迁移整个系统以及运维,那就需要编排,包括网络关系,负载均衡,回滚,监控,扩缩容问题则需要容器编排技术。
2. 使用 minikube 学习 k8s
minikube 最大特点就是“小而美”,可执行文件仅有不到 100MB,运行镜像也不过 1GB,但就在这么小的空间里却集成了 Kubernetes 的绝大多数功能特性,不仅有核心的容器编排功能,还有丰富的插件,例如 Dashboard、GPU、Ingress、Istio、Kong、Registry 等等,综合来看非常完善。
我使用minikube最后一个支持docker的版本学习。首先我们去minikube的文档页面下载并安装minikubeminikube docs传送门。
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
为了操作minikube,我们还需要 kubectl
这个工具,我们可以在 k8s 文档中找到安装它的方法,k8s docs传送门。当然,minikube也内置了kubectl,命令是 minikube kubectl
。
这就是minikube环境的示意图了。
2.1验证 minikube 环境
$ minikube start --kubernetes-version=v1.23.3 --image-mirror-country='cn'
使用1.23.3版本的原因是,这是最后一个支持docker的版本。我们学习就使用docker比较方便。
我们可以使用下面两个命令来查看集群状态。
joseph@joseph-laptop:~/minikube$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
joseph@joseph-laptop:~/minikube$ minikube node list
minikube 192.168.49.2
Kubernetes 集群里现在只有一个节点,名字就叫“minikube”,类型是“Control Plane”,里面有 host、kubelet、apiserver 三个服务,IP 地址是 192.168.49.2。
还可以使用 minikube ssh
命令登录到这个节点。
2.2 使用 kubectl 操作 minikube 节点
接下里使用命令行在 Kubernetes 中运行一个 Nginx 应用:
$ kubectl run ngx --image=nginx:alpine
pod/ngx created
可以看到 nginx 已经运行起来了
3. k8s 的工作机制
Kuberetes 可以说是一个集群级别的操作系统,主要功能是资源管理和作业调度。这里的资源指的是多台服务器上的计算资源,而作业呢,就是运行在服务器集群上的进程,或者说容器。
Linux 上的用户通常可以分为两类人:Dev和Ops,而在k8s上,用户就只有一类人——DevOps。开发和运维的界限不再清晰。
3.1 k8s 的基本架构
*图片来源:https://medium.com/@keshiha/k8s-architecture-bb6964767c12
k8s采用了典型的 数据面 / 控制面 分离的架构,集群里的计算机被称为“节点”Node。少量的节点作为控制面执行集群的管理和维护工作,其余节点是Worker节点,用来运行业务应用。
-
Master Node:控制面节点
-
Worker Node:运行应用的节点
节点(Node)的数量非常多,它们形成一个资源池,k8s根据资源池来分配资源。我们可以使用 kubectl
来操作k8s。
比如:我们可以使用下面的命令查看节点状态。
$ kubectl get nodes
Master 和 Node 的划分不是绝对的。当集群的规模较小,工作负载较少的时候,Master 也可以承担 Node 的工作,就像我们搭建的 minikube 环境,它就只有一个节点,这个节点既是 Master 又是 Node。
3.2 节点内部的结构
Kubernetes 的节点内部也具有复杂的结构,是由很多的模块构成的,这些模块又可以分成组件(Component)和插件(Addon)两类。
组件实现了 Kubernetes 的核心功能特性,没有这些组件 Kubernetes 就无法启动,而插件则是 Kubernetes 的一些附加功能,属于“锦上添花”,不安装也不会影响 Kubernetes 的正常运行。
Master 的组件
-
apiServer
:它是Master节点也是整个k8s系统的唯一入口。它对外公开一系列的RESTful API,加上认证和授权功能,所有组件都只能和它直接通信。 -
etcd
:它是一个高可用的分布式k-v数据库,用来持久化存储系统里的各种资源对象和状态。其他组件想要获取配置和状态只能通过apiServer获取etcd中存储的数据。 -
scheduler
:它负责容器的编排工作,检查节点的资源状态,把Pod调度到最合适的节点上运行。 -
cotroller-manager
:它负责维护容器和节点的资源状态,实现故障检测、服务迁移、应用伸缩等功能。
这四个组件是容器化的,它们运行在集群的Pod里,我们可以使用如下命令查看:
$ kubectl get pod -n kube-system
Worker 的组件
-
kubelet
:它是Worker Node的管理代理,负责Node相关的绝大部分操作,Node上只有它可以和apiServer通信。它实现了状态报告、命令下发、容器启停等功能。 -
kube-proxy
:Node的网络代理,负责管理容器的网络通信。 -
container-runtime
:容器运行时,在 kubelet 的指挥下创建容器,管理 Pod 的生命周期。
container-runtime
可以是docker,containerd,CRI-O等。
使用 minikube ssh 命令登录到节点后,可以用 docker ps 看到 kube-proxy。而 kubelet 用 docker ps 是找不到的,需要用操作系统的 ps 命令。
k8s 工作流程
- 每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态,apiserver 再存到 etcd 里。
- 每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务。
- scheduler 通过 apiserver 得到当前的节点状态,调度 Pod,然后 apiserver 下发命令给某个 Node 的 kubelet,kubelet 调用 container-runtime 启动容器。
- controller-manager 也通过 apiserver 得到实时的节点状态,监控可能的异常情况,再使用相应的手段去调节恢复。
插件(Addons)
由于 Kubernetes 本身的设计非常灵活,所以就有大量的插件用来扩展、增强它对应用和集群的管理能力。minikube 也支持很多的插件,使用命令 minikube addons list
就可以查看插件列表。
这里介绍两个常用的插件:
-
DNS:它在 Kubernetes 集群里实现了域名解析服务,能够让我们以域名而不是 IP 地址的方式来互相通信,是服务发现和负载均衡的基础。由于它对微服务、服务网格等架构至关重要,所以基本上是 Kubernetes 的必备插件。
-
Dashboard:Kubernetes 提供了一个图形化的操作界面,非常直观友好,虽然大多数 Kubernetes 工作都是使用命令行 kubectl,但有的时候在 Dashboard 上查看信息也是挺方便的。
3.3 补充
-
为了确保控制面的高可用,k8s会部署多个Master节点,数量一般是奇数,这由etcd,或者说etcd使用的分布式一致性算法raft决定的。
-
minikube 的 Dashboard 只允许在本机的浏览器访问。