【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

image

这就是minikube环境的示意图了。

2.1验证 minikube 环境

$ minikube start --kubernetes-version=v1.23.3 --image-mirror-country='cn'

使用1.23.3版本的原因是,这是最后一个支持docker的版本。我们学习就使用docker比较方便。

image

我们可以使用下面两个命令来查看集群状态。

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

image

可以看到 nginx 已经运行起来了

3. k8s 的工作机制

Kuberetes 可以说是一个集群级别的操作系统,主要功能是资源管理和作业调度。这里的资源指的是多台服务器上的计算资源,而作业呢,就是运行在服务器集群上的进程,或者说容器。

Linux 上的用户通常可以分为两类人:Dev和Ops,而在k8s上,用户就只有一类人——DevOps。开发和运维的界限不再清晰。

3.1 k8s 的基本架构

image

*图片来源:https://medium.com/@keshiha/k8s-architecture-bb6964767c12

k8s采用了典型的 数据面 / 控制面 分离的架构,集群里的计算机被称为“节点”Node。少量的节点作为控制面执行集群的管理和维护工作,其余节点是Worker节点,用来运行业务应用。

  • Master Node:控制面节点

  • Worker Node:运行应用的节点

节点(Node)的数量非常多,它们形成一个资源池,k8s根据资源池来分配资源。我们可以使用 kubectl来操作k8s。

比如:我们可以使用下面的命令查看节点状态。

$ kubectl get nodes

image

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

image

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 只允许在本机的浏览器访问。

posted @ 2022-09-27 17:05  joexu01  阅读(620)  评论(0编辑  收藏  举报