目录
一、引言
在云原生技术蓬勃发展的当下,Kubernetes 无疑是容器编排领域的中流砥柱,已然成为了云原生的事实标准 。自 2014 年 Google 发布 Kubernetes 以来,它凭借源自 Google 内部多年运行的 Borg/Omega 系统的设计经验及开源社区的持续完善,迅速在与 Docker Swarm、Mesos 等的竞争中脱颖而出,稳居容器编排一哥之位。
如今,超 53% 的企业选择将大数据应用程序迁移至 Kubernetes,期望借此降低整体支出 。它能将众多机器抽象化,实现对多个容器的高效部署、管理与监控,为企业构建起真正的 PaaS 平台。在这样的大趋势下,运维 Kubernetes 就显得极为关键,它是保障容器化应用稳定、高效运行的基石。无论是资源的合理调配、服务的持续可用,还是应用的快速迭代,都离不开专业的 Kubernetes 运维。接下来,就让我们一同深入探索运维 Kubernetes 的奥秘。
二、Kubernetes 基础入门
2.1 什么是 Kubernetes
Kubernetes,常简称为 K8s ,是一个开源的容器编排平台,旨在自动化容器化应用程序的部署、扩展和管理。它就像是一个智能的 “容器管家”,能让容器化应用在不同环境中稳定、高效地运行。
想象一下,你有一个大型电商系统,包含用户服务、订单服务、支付服务等多个微服务,每个微服务都被打包成容器。Kubernetes 可以将这些容器合理地部署到不同的服务器上,根据服务器的资源状况和服务的负载情况,自动调整容器的数量,确保系统在高并发时也能稳定运行。当业务量激增时,它能快速增加订单服务的容器数量,以应对大量订单请求;当业务量减少时,又能自动减少容器,节省资源。
Kubernetes 具备完备的集群管理能力,支持服务发现与负载均衡,能够实现故障发现和自我修复,还提供了服务滚动升级、弹性伸缩和在线扩容等功能,为企业的容器化应用提供了全方位的支持。
2.2 核心组件介绍
Kubernetes 主要由 Master 节点和 Node 节点组成,每个节点都包含多个关键组件,它们协同工作,保障了集群的稳定运行。
- Master 节点组件:
-
- kube-apiserver:作为 Kubernetes API 的入口,它提供了 RESTful 风格的 API 接口,是集群内部组件和外部客户端与集群交互的桥梁。它就像是 Kubernetes 集群的 “大门”,所有对集群资源的增删改查操作都要通过它。同时,它还负责身份认证与授权,基于 RBAC(基于角色的访问控制)模型对客户端请求进行权限验证,只有合法的用户或服务才能访问对应的资源。它还将集群中的所有资源对象(如 Pod、Service、Deployment 等)的状态数据存储在 etcd 中,确保资源的一致性和可靠性。
-
- kube-controller-manager:是 Kubernetes 的 “大管家”,负责监控集群中各种资源对象的状态,并根据定义的业务逻辑进行自动化控制。它包含多个控制器,如 ReplicationController 确保 Pod 的副本数符合预期;NodeController 负责管理节点状态;EndpointsController 用于管理服务端点等。当集群中某个 Pod 出现故障时,ReplicationController 会及时发现并创建新的 Pod,保证服务的可用性。
-
- kube-scheduler:担任着 “调度员” 的角色,负责将新创建的 Pod 调度到合适的节点上运行。它会综合考虑节点的资源状况(CPU、内存、存储等)、Pod 的资源需求以及各种调度策略和算法,为 Pod 寻找最合适的 “落脚点”。当有新的 Pod 需要部署时,kube-scheduler 会从集群中筛选出满足条件的节点,然后根据打分机制,选择得分最高的节点来运行 Pod。
- Node 节点组件:
-
- kubelet:作为 Node 节点上的 “代理”,负责与 Master 节点通信,接收 Master 分配的任务,并管理 Node 上的容器。它会定期向 Master 报告节点的运行状况,包括容器的状态和资源使用情况等。当 kube-scheduler 将一个 Pod 调度到某个 Node 上后,kubelet 会根据 Pod 的配置信息,启动并管理 Pod 中的容器。
-
- kube-proxy:是 Node 节点上的 “网络代理”,负责实现 Kubernetes Service 的网络代理和负载均衡。它为每个 Service 创建一个虚拟 IP(Cluster IP),并将请求转发到后端 Pod 的实际 IP 地址。它支持 iptables 代理模式和 IPVS 代理模式,确保集群内部和外部的网络流量能够正确地转发到对应的 Pod,实现服务发现和负载均衡的功能。
三、Kubernetes 集群部署
3.1 部署前准备
在部署 Kubernetes 集群之前,需要精心准备好基础环境,确保各个环节都能顺利衔接,为后续的集群搭建筑牢根基。
- 环境要求:
-
- 操作系统:建议选择如 CentOS 7.x 或 Ubuntu 20.04 等稳定且广泛使用的 Linux 发行版,它们对 Kubernetes 的兼容性良好,能提供稳定的运行环境。这些系统拥有成熟的软件包管理机制,方便安装和管理 Kubernetes 相关组件。
-
- 网络:集群中所有节点的内网必须畅通无阻,保障节点之间能够高效通信。同时,节点需要具备外网访问权限,以便从 Docker Hub 或其他镜像仓库拉取所需的镜像。若无法直接访问外网,也可提前下载镜像并导入节点。例如,在一些企业内部网络环境中,通过设置代理服务器或者使用离线镜像包的方式来满足镜像获取需求。
-
- 硬件资源:为了确保集群性能,每台节点机器的配置不应过低。推荐配置为 2GB 以上的 RAM,这能保证在运行多个容器时,系统有足够的内存资源来支撑;2 个以上的 CPU 核心,以应对容器内应用程序的计算需求;30GB 以上的硬盘空间,用于存储系统文件、容器镜像以及相关日志等数据。
- 基础环境配置:在所有节点上,都要进行以下基础配置操作。
-
- 关闭防火墙:由于 Kubernetes 的 Master 与 Node 节点之间存在大量的网络通信,为避免防火墙规则阻碍通信,在安全的网络环境下,可以关闭防火墙。以 CentOS 系统为例,执行 systemctl stop firewalld 停止防火墙服务,再执行 systemctl disable firewalld 禁止防火墙开机自启 。如果必须开启防火墙,则需根据实际需求,精准配置各个组件相互通信的端口,如 Kubernetes API Server 默认使用 6443 端口,kubelet 使用 10250 端口等。
-
- 配置主机名:为每个节点设置独一无二的主机名,方便在集群中进行标识和管理。在 CentOS 系统中,可使用 hostnamectl set - hostname 命令进行设置,比如在 Master 节点上设置主机名为 master,在 Node 节点上分别设置为 node1、node2 等 。设置完成后,修改 /etc/hosts 文件,添加节点的 IP 地址与主机名映射关系,确保节点之间可以通过主机名进行通信。例如:
192.168.1.100 master
192.168.1.101 node1
192.168.1.102 node2
- 禁用 SELinux:SELinux(Security - Enhanced Linux)是一种强制访问控制的安全模块,虽然它增强了系统的安全性,但有时会对 Kubernetes 的正常运行产生干扰。通过执行 sed -i's/enforcing/disabled/' /etc/selinux/config 命令,将 SELinux 设置为禁用状态,然后执行 setenforce 0 使设置立即生效。
- 关闭 Swap:Swap 分区是当系统物理内存不足时,将内存中暂时不用的数据交换到磁盘上的空间,以缓解内存压力。但在 Kubernetes 集群中,使用 Swap 可能会导致性能问题,因此需要关闭。执行 swapoff -a 命令可临时关闭 Swap,若要永久关闭,需编辑 /etc/fstab 文件,注释掉其中的 Swap 相关行,例如将 UUID=xxx swap swap defaults 0 0 修改为 #UUID=xxx swap swap defaults 0 0。
- 配置 IPv4 流量传递:为了使桥接的 IPv4 流量能够正确传递到 iptables 的链,需要添加相关配置。在 /etc/sysctl.d/ 目录下创建一个名为 k8s.conf 的文件,内容如下:
net.bridge.bridge - nf - call - ip6tables = 1
net.bridge.bridge - nf - call - iptables = 1
net.ipv4.ip_forward = 1
然后执行 sysctl --system 命令,使配置生效。这一步确保了容器之间以及容器与外部网络之间的网络通信能够顺畅进行。
- 时间同步:在集群环境中,保持各个节点的时间一致至关重要。不一致的时间可能会导致诸如证书验证失败、任务调度异常等问题。可以使用 NTP(Network Time Protocol)服务进行时间同步,在 CentOS 系统中,执行 yum install ntpdate -y 安装 ntpdate 工具,然后执行 ntpdate time.windows.com(可根据实际情况选择合适的 NTP 服务器)进行时间同步。也可以配置 NTP 服务开机自启,确保系统重启后时间依然保持同步。
3.2 使用 Kubeadm 部署集群
Kubeadm 是 Kubernetes 官方推荐的快速部署工具,它极大地简化了 Kubernetes 集群的安装过程,让我们能够通过一系列简单的命令,高效地搭建起生产级别的 Kubernetes 集群。接下来,我们就以 Kubeadm 为例,逐步展示部署 Kubernetes 集群的详细步骤。
- 安装 Kubeadm、Kubelet、Kubectl:在所有节点上执行以下操作,配置 Kubernetes 源并安装组件。
-
- 配置 Kubernetes 源:以 CentOS 系统为例,创建 /etc/yum.repos.d/kubernetes.repo 文件,内容如下:
[kubernetes]
name = Kubernetes
baseurl = https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes - el7 - x86_64
enabled = 1
gpgcheck = 0
repo_gpgcheck = 0
这里使用了阿里云的 Kubernetes 镜像源,能加快下载速度,提高安装效率。
- 安装组件:执行 yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0 命令,安装指定版本的 Kubelet、Kubeadm 和 Kubectl。版本号可根据实际需求进行调整,在安装过程中,系统会自动解决组件之间的依赖关系,确保安装的顺利进行。安装完成后,执行 systemctl enable kubelet 命令,设置 Kubelet 开机自启,为后续的集群初始化做好准备。
- 初始化 Master