01. Kubernetes - 说明与介绍

说明介绍

image

Kubernetes 简称 K8S,源于希腊语,意为”舵手”或“飞行员”,由 Google 在 2014 年将自己的 Borg 系统使用 Go 语言重写开源而来。

其 logo 类型轮船的方向盘,而 docker logo 类似载满集装箱的轮船,寓意可想而知。

相较于 Docker 带火了容器技术之前,Google 内部已经有多年的容器使用管理经验,所以尽管 Docker 后续推出了 swarm,compose 等容器编排服务与工具,但不管在服务的完整性和稳定性都不及 Kubernetes,而今 swarm 几乎已经没人使用。

https://kubernetes.io/zh-cn/

从 Kubernetes 的官网开源获取以下信息:

  1. 用于自动部署、扩缩和管理容器化应用程序的生产级别的开源容器编排系统。
  2. 将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。
  3. 源自 Google 15 年生产环境的运维经验,支撑着 Google 每周运行数十亿个容器。
  4. 无论是本地测试,还是跨国公司,它都能让你应对复杂系统时得心应手。
  5. 作为开源系统,可以自由地部署在企业内部,私有云、混合云或公有云,让你轻松选择,永不过时。

特征介绍

Kubernetes 包含如下几个重要特征:

  1. 自动上线回滚

    • 分步骤地对应用进行上线,同时监测程序运行状况,以确保不会同时终止所有实例。如果上线发生异常,会自动回滚所作更改。
  2. 服务发现与负载均衡

    • 无需修改程序即可使用服务发现机制。同时为容器提供了自己的 IP 和 DNS 名称,并在它们之间实现负载均衡。
  3. 存储编排

    • 能自动挂载所选择的存储系统,如本地存储,云服务商提供的存储,其它网络存储,如 NFS,Ceph 等。
  4. Secret 和配置管理

    • 部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像。也不需要将软件堆栈配置中的重要信息暴露出来,提升安全性。
  5. 自动装箱

    • 根据资源需求和其他限制自动放置容器,同时避免影响可用性。将关键性的和尽力而为性质的工作负载混合放置,提高资源利用率。
  6. 批量执行

    • 除了服务外,还可以管理批处理和 CI 工作负载,在期望时替换掉失效的容器。
  7. IPv4/IPv6 双协议栈

    • 为 Pod 和 Service 分配 IPv4 和 IPv6 地址。
  8. 水平扩缩

    • 使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。
  9. 自我修复

    • 自动重启失败的容器,在节点死亡时替换并重新调度容器。杀死不符合健康检查的容器,并在它们准备好服务之前不将它们公布给客户端。
  10. 为扩展性设计

    • 无需更改上游源码即可扩展集群。

版本介绍

Kubernetes 的版本号格式为:x.y.z

其中 x 为大版本号,y 为小版本号,z 为补丁版本号。Kubernetes 项目会维护最新的三个小版本分支。

Kubernetes 各个组件之间存在着版本偏差支持策略:

  • 在高可用集群中,多个 API Server 的小版本号最多差 1,如最新的是 1.25,那么最旧的只能是 1.24。
  • kubelet 的版本不能高于 API Server 的版本,最多比 API Server 低两个小版本。

虽然有这样的版本偏差兼容,但是生产环境一定要选择同一版本,避免出现未知 BUG。

2022 年 5 月 3 日, kubernetes 1.24 版本正式发布,正式移除对 Dockershim 的支持,若需要 1.24 及其以后的版本依然支持 docker,则需要引入第三方 cri-dockerd 项目进行支持。

在官方文档中有对大规模集群的特别说明:

https://kubernetes.io/zh-cn/docs/setup/best-practices/cluster-large/

以 Kubernetes v1.25 版本为例:

  • 每个节点的 Pod 数量不超过 110
  • 节点数不超过 5000
  • Pod 总数不超过 150000
  • 容器总数不超过 300000

组件介绍

Kubernetes 核心组件示意图:

image

Kubernetes 集群包含 Master / Node 节点,所有操作都在 Master 上面执行。


Master

Master 节点是 Kubernetes 集群的控制节点,负责整个集群的管理和控制,其核心组件包含:

  • API Server(kube-apiserver):集群网关,提供了 REST API 接口,所有组件之间的通讯都需要经过 API Server 转发,并且提供认证鉴权访问控制等。

  • Controller Manager(kube-controller-manager):集群控制器,集群所有资源对象的控制中心,包含以下控制器:

    • 节点控制器(Node Controller):负责节点出现故障时的通知和响应。
    • 任务控制器(Job Controller):监测一次性任务的 Job 对象,然后创建 Pod 来运行任务。
    • 端点控制器(Endpoints Controller):填充端点(Endpoints)对象,也就是加入 Service 和 Pod。
    • 服务账户和令牌控制器(Service Account & Token Controller):为新的命名空间创建默认帐户和 API 访问令牌。
  • Scheduler(kube-scheduler):集群调度器,负责监视新创建的、未指定运行节点的 Pod,并选择合适的节点来运行 Pod。

  • Kubectl:命令行执行工具,CLI 客户端,用于用户执行 Kubernetes 集群管理操作。


Node / Worker

Node 节点也叫 Worker 节点,是 Kubernetes 集群的工作节点,它的工作负载由 Master 调配,主要用于运行容器,其组件包含:

  • Kubelet:负责 Pod 的创建,启动,监控,重启,销毁等操作,和 Master 节点协作管理集群。
  • Kube-proxy:负责为 Service 提供 Cluster 内部的服务发现和负载均衡。

其它组件

除了 Kubernetes 本身的组件以外,还需要以下必不可少的组件:

  • ETCD:分布式高性能键值存储数据库,用于存储集群信息,和 API Server 交互,所有的状态,操作都会记录在这里。
  • Container runtime:容器运行时,1.24 版本舍弃 Dockershim 后,目前主流的容器运行时为 containerd,CRI-O,RKT 等。
  • CoreDNS:灵活的,可扩展的 DNS 服务器,可以为集群内的 Pod 提供 DNS 服务。
  • Calico / Flannel:目前用的比较多的两个网络组件,用于实现容器跨主机之间的通信。

其它组件开源参考官方的网站:

https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/

组件通信

通信示意图:

image

从图中可以看出,集群的核心组件就是 API Server:

  • API Server 负责 ETCD 的所有操作,也只有 API Server 才能直接操作 ETCD。
  • 所有组件之间的请求都需要通过 API Server 帮忙转发,并且通过 API Server 将请求信息记录到 ETCD 中。
posted @ 2022-09-18 11:32  不知名换皮工程师  阅读(82)  评论(0编辑  收藏  举报