【k8s】探究Kubernetes工作机制的奥秘(一)


前言

Kubernetes 的内部架构和工作机制,了解它能够傲视群雄的秘密所在。


提示:以下是本篇文章正文内容,下面案例可供参考

一、云计算时代的操作系统

Kubernetes 是一个生产级别的容器编排平台和集群管理系统,能够创建、调度容器,监控、管理服务器。

容器是什么?容器是软件,是应用,是进程。服务器是什么?服务器是硬件,是 CPU、内存、硬盘、网卡。那么,既可以管理软件,也可以管理硬件,这样的东西应该是什么?— 操作系统

从某种角度来看,Kubernetes 可以说是一个集群级别的操作系统,主要功能就是资源管理和作业调度。但 Kubernetes 不是运行在单机上管理单台计算资源和进程,而是运行在多台服务器上管理几百几千台的计算资源,以及在这些资源上运行的上万上百万的进程,规模要大得多。

二、Kubernetes 的基本架构

在这里插入图片描述图片来源入口
Kubernetes 采用了现今流行的“控制面 / 数据面”(Control Plane / Data Plane)架构,集群里的计算机被称为“节点”(Node),可以是实机也可以是虚机,少量的节点用作控制面来执行集群的管理维护工作,其他的大部分节点都被划归数据面,用来跑业务应用。

  • 控制面的节点在 Kubernetes 里叫做 Master Node,一般简称为 Master,它是整个集群里最重要的部分,可以说是 Kubernetes 的大脑和心脏。
  • 数据面的节点叫做 Worker Node,一般就简称为 Worker 或者 Node,相当于 Kubernetes 的手和脚,在 Master 的指挥下干活。

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

[root@k8s-console ~]$ kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   		14d   v1.23.3

三、节点内部的结构

Kubernetes 的节点内部也具有复杂的结构,是由很多的模块构成的,这些模块又可以分成组件(Component)和插件(Addon)两类。

组件实现了 Kubernetes 的核心功能特性,没有这些组件 Kubernetes 就无法启动,而插件则是 Kubernetes 的一些附加功能,属于“锦上添花”,不安装也不会影响 Kubernetes 的正常运行。

1、Master组件

  • apiServer:是 Master 节点——同时也是整个 Kubernetes 系统的唯一入口,它对外公开了一系列的 RESTful API,并且加上了验证、授权等功能,所有其他组件都只能和它直接通信,可以说是 Kubernetes 里的联络员。

  • etcd:是一个高可用的分布式 Key-Value 数据库,用来持久化存储系统里的各种资源对象和状态,相当于 Kubernetes 里的配置管理员。注意它只与 apiserver 有直接联系,也就是说任何其他组件想要读写 etcd 里的数据都必须经过 apiserver。

  • scheduler:负责容器的编排工作,检查节点的资源状态,把 Pod 调度到最适合的节点上运行,相当于部署人员。因为节点状态和 Pod 信息都存储在 etcd 里,所以 scheduler 必须通过 apiserver 才能获得。

  • cotroller-manager:负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能,相当于监控运维人员。同样地,它也必须通过 apiserver 获得存储在 etcd 里的信息,才能够实现对资源的各种操作。

这四个组件是容器化的,它们运行在集群的Pod里,我们可以使用如下命令查看:

[root@k8s-console ~]$  kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS         AGE
coredns-6d8c4cb4d-zxcqz                    1/1     Running   2 (9m29s ago)    6d
etcd-minikube                          	   1/1     Running   9 (9m29s ago)    14d
kube-apiserver-minikube                    1/1     Running   10 (9m4s ago)    14d
kube-controller-minikube                   1/1     Running   9 (9m30s ago)    14d
kube-proxy-9kvss                           1/1     Running   6 (9m29s ago)    14d
kube-scheduler-minikube                    1/1     Running   9 (9m29s ago)    14d

注意命令行里要用 -n kube-system 参数,表示检查“kube-system”名字空间里的 Pod。

2、Work 节点组件

  • kubelet:是 Node 的代理,负责管理 Node 相关的绝大部分操作,Node 上只有它能够与 apiserver 通信,实现状态报告、命令下发、启停容器等功能,相当于是 Node 上的一个“小管家”。
  • kube-proxy:它的作用有点特别,它是 Node 的网络代理,只负责管理容器的网络通信,简单来说就是为 Pod 转发 TCP/UDP 数据包,相当于是专职的“小邮差”。
  • container-runtime: 它是容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理 Pod 的生命周期。

注意,因为 Kubernetes 的定位是容器编排平台,所以它没有限定 container-runtime 必须是 Docker,完全可以替换成任何符合标准的其他容器运行时,例如 containerd、CRI-O 等等,只不过在这里我们使用的是 Docker。

使用 minikube ssh 命令登录到节点后,可以用 docker ps 看到 kube-proxy。而 kubelet 用 docker ps 是找不到的,需要用操作系统的 ps 命令: 例如ps -ef|grep kubelet

3、Kubernetes 工作流程:

  • 每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态,apiserver 再存到 etcd 里。
  • 每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务。
  • scheduler 通过 apiserver 得到当前的节点状态,调度 Pod,然后 apiserver 下发命令给某个 Node 的 kubelet,kubelet 调用 container-runtime 启动容器。
  • controller-manager 也通过 apiserver 得到实时的节点状态,监控可能的异常情况,再使用相应的手段去调节恢复。

4、插件(Addons)

只要服务器节点上运行了 apiserver、scheduler、kubelet、kube-proxy、container-runtime 等组件,就可以说是一个功能齐全的 Kubernetes 集群了。
不过就像 Linux 一样,操作系统提供的基础功能虽然“可用”,但想达到“好用”的程度,还是要再安装一些附加功能,这在 Kubernetes 里就是插件(Addon)。

minikube 也支持很多的插件,使用命令 minikube addons list 就可以查看插件列表

这里介绍两个常用的插件:

  • DNS:它在 Kubernetes 集群里实现了域名解析服务,能够让我们以域名而不是 IP 地址的方式来互相通信,是服务发现和负载均衡的基础。由于它对微服务、服务网格等架构至关重要,所以基本上是 Kubernetes 的必备插件。
  • Dashboard:Kubernetes 提供了一个图形化的操作界面,非常直观友好,虽然大多数 Kubernetes 工作都是使用命令行 kubectl,但有的时候在 Dashboard 上查看信息也是挺方便的。

总结

  1. Kubernetes 能够在集群级别管理应用和服务器,可以认为是一种集群操作系统。它使用“控制面 / 数据面”的基本架构,Master 节点实现管理控制功能,Worker 节点运行具体业务。
  2. Kubernetes 由很多模块组成,可分为核心的组件和选配的插件两类。
  3. Master 里有 4 个组件,分别是 apiserver、etcd、scheduler、controller-manager。
  4. Node 里有 3 个组件,分别是 kubelet、kube-proxy、container-runtime。
  5. 通常必备的插件有 DNS 和 Dashboard。

补充

  • 为了确保控制面的高可用,k8s会部署多个Master节点,数量一般是奇数,这由etcd,或者说etcd使用的分布式一致性算法raft决定的。
### 安装 Kubernetes Dashboard 的步骤 Kubernetes Dashboard 是个基于 Web 的用户界面,用于管理和监控 Kubernetes 集群。以下是详细的安装和配置流程。 #### 创建命名空间并部署 Dashboard 创建个独立的命名空间以隔离资源,例如 `kubernetes-dashboard`: ```bash mkdir -p /etc/kubernetes/dashboard cd /etc/kubernetes/dashboard wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml ``` 此命令会下载官方推荐的 Dashboard 部署文件,并将其保存在 `/etc/kubernetes/dashboard` 目录中[^1]。 修改 `recommended.yaml` 文件中的命名空间为 `kubernetes-dashboard`(如果需要),然后运行以下命令进行部署: ```bash kubectl apply -f recommended.yaml ``` #### 检查服务状态 安装完成后,确认 Dashboard 对应的服务是否已成功运行: ```bash kubectl get services -n kubernetes-dashboard ``` 默认情况下,Dashboard 会暴露为 ClusterIP 类型的服务,仅支持集群内部访问。 #### 修改服务类型为 NodePort 为了能够通过浏览器访问 Dashboard,可以将服务类型从 ClusterIP 修改为 NodePort: ```bash kubectl edit service kubernetes-dashboard -n kubernetes-dashboard ``` 找到 `type: ClusterIP` 并将其更改为 `type: NodePort`,保存并退出后,Kubernetes 会自动分配端口。 再次运行 `kubectl get services -n kubernetes-dashboard` 查看分配的端口,然后通过任意节点的 IP 地址加上该端口访问 Dashboard。 #### 认证与权限配置 由于 Dashboard 提供了对集群的管理功能,因此需要配置认证机制来确保安全性。创建个具有适当权限的 ServiceAccount,并绑定到相应的角色。例如: ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dashboard-admin-cluster-role roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kubernetes-dashboard ``` 应用上述配置: ```bash kubectl apply -f dashboard-admin.yaml ``` 生成的 ServiceAccount Token 可用于登录 Dashboard。运行以下命令获取 Token: ```bash kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}') ``` 复制输出中的 `token` 字段值,在登录 Dashboard 时选择 "Token" 并粘贴此值。 #### 使用 Ingress 暴露 Dashboard(可选) 如果希望使用域名访问 Dashboard,可以通过 Ingress 控制器实现。定义个 Ingress 资源文件,例如 `dashboard-ingress.yaml`: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard-ingress namespace: kubernetes-dashboard annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - http: paths: - path: /dashboard pathType: Prefix backend: service: name: kubernetes-dashboard port: number: 80 ``` 应用此配置: ```bash kubectl apply -f dashboard-ingress.yaml ``` 确保你的域名解析指向 Ingress 控制器的外部 IP 地址,然后通过 `http://<your-domain>/dashboard` 访问 Dashboard。 #### 常见问题排查 - **无法访问 Dashboard**:检查服务类型是否正确,以及防火墙规则是否允许相应端口通信。 - **Token 登录失败**:确认 Token 是否过期,或者尝试重新生成 Token。 - **RBAC 权限不足**:确保 ServiceAccount 具有适当的 ClusterRole 绑定,如 `cluster-admin`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值