Kubernetes (K8s) 终极指南:构建云原生时代的基石
深入解析 Kubernetes 的核心原理、部署策略、资源调度机制及企业级最佳实践。从单节点测试到多集群生产环境,一站式解决您的容器编排难题。
立即开始部署什么是 Kubernetes (K8s)?
Kubernetes(常简称为 K8s)是一个开源的容器编排引擎,用于自动化部署、扩展和管理容器化应用程序。它由 Google 开源,现在由云原生计算基金会(CNCF)维护。作为云原生计算的事实标准,Kubernetes 提供了基于容器的应用部署、维护和扩展机制,它的基本原理是将运行容器化应用的服务器抽象为一个逻辑资源,即“集群”,从而允许用户以集群为单位来分配和管理计算资源。
在传统的部署模式中,运维人员需要手动在每台服务器上安装软件、配置环境并监控状态。而引入了 Kubernetes 后,开发者只需定义应用的“期望状态”(例如:运行3个副本,使用80端口),Kubernetes 会自动处理其余的所有复杂性,包括启动、停止、重启、健康检查以及负载均衡。
⚡ 自动装箱
Kubernetes 根据资源需求自动将容器放置在集群中的节点上,支持基于CPU、内存或其他指定资源约束的放置策略。
⚙️ 自我修复
当容器失败时,Kubernetes 会自动重启容器;在节点死亡、容器不响应健康检查或前置检查失败时,会杀死并替换容器。
? 弹性伸缩
通过监控资源使用情况,Kubernetes 可以自动扩展集群中的应用程序副本数量,以应对流量高峰。
Kubernetes (K8s) 核心架构深度解析
理解 Kubernetes 的架构是掌握其使用的前提。Kubernetes 集群主要由控制平面(Control Plane)和工作节点(Node)组成。控制平面负责做出全局决策(如调度),并检测和响应集群事件。工作节点则承载实际运行的容器化应用。
控制平面组件
- API Server (kube-apiserver): 集群的统一入口,各管理工具及组件通过它提交配置请求。所有数据交互都需经过认证和授权。
- etcd: 高可用的键值数据库,存储集群的所有状态数据。它是 Kubernetes 的“大脑”,确保数据的一致性。
- Scheduler (kube-scheduler): 负责监控新创建的未调度 Pod,并将其分配到合适的节点上。调度策略包括资源充足、亲和性规则等。
- Controller Manager (kube-controller-manager): 运行各种控制器进程,如节点控制器、副本控制器等,确保集群状态符合期望状态。
- Cloud Controller Manager: 与云平台 API 交互,管理网络、负载均衡等云原生资源。
工作节点组件
- Kubelet: 每个节点上的“Agent”,负责维护容器的生命周期,确保容器在 Pod 中运行。
- Kube-proxy: 维护节点上的网络规则,实现 Service 的负载均衡和外部访问。
- Container Runtime: 负责实际运行容器的软件,如 Docker、containerd 或 CRI-O。
Kubernetes (K8s) 部署实战指南
部署 Kubernetes 集群有多种方式,包括 kubeadm(官方推荐)、kops(AWS专用)、kubespray(基于Ansible)以及托管服务(如 GKE, EKS, AKS)。本节重点介绍使用 kubeadm 在 Linux 节点上手动搭建高可用集群的步骤。
步骤一:环境准备
在开始之前,请确保所有节点满足以下要求:
- 操作系统:Ubuntu 20.04/22.04, CentOS 7/8, 或 Debian 10/11。
- 硬件:至少 2 核 CPU,2GB 内存(生产环境建议 4核+8GB)。
- 网络:节点间互通,无防火墙阻碍关键端口(6443, 2379-2380, 10250, 10251, 10252)。
- 禁用 Swap:必须关闭 Swap,否则 Kubelet 可能无法启动。
禁用 Swap
sudo swapoff -a sudo sed -i '/ swap / s/^(.)$/#1/g' /etc/fstab加载内核模块
sudo modprobe overlay sudo modprobe br_netfilter设置 sysctl 参数
sudo tee /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system
步骤二:安装 Master 节点
在所有 Master 节点上安装容器运行时和 K8s 组件:
安装 containerd
sudo apt-get update && sudo apt-get install -y containerd sudo mkdir -p /etc/containerd sudo containerd config default | sudo tee /etc/containerd/config.toml sudo systemctl restart containerd安装 kubeadm, kubelet, kubectl
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
初始化 Master 节点(替换 --pod-network-cidr 为您的 CNI 插件所需网段):
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,配置 kubectl 权限:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown (id -g) $HOME/.kube/config
步骤三:加入 Worker 节点
在 Worker 节点上执行 Master 初始化成功后输出的 kubeadm join 命令:
sudo kubeadm join <master-ip>:<master-port> --token <token>
--discovery-token-ca-cert-hash sha256:<hash>
回到 Master 节点,检查节点状态:
kubectl get nodes输出示例:
NAME STATUS ROLES AGE VERSION
master Ready control-plane 10m v1.28.0
worker1 Ready <none> 5m v1.28.0
Kubernetes (K8s) 进阶管理与最佳实践
一旦集群运行起来,如何高效管理应用成为了关键。这涉及到 Deployment、Service、Ingress 以及 ConfigMap/Secret 等核心资源对象的理解与应用。
服务发现与负载均衡
Kubernetes 为 Pod 提供了稳定的 IP 和 DNS 名称,但 Pod 本身是不稳定的(可能被重建)。Service 对象定义了逻辑上的一组 Pod 以及访问它们的策略。常见的 Service 类型包括:
- ClusterIP: 默认类型,在集群内部暴露一个虚拟 IP,仅限集群内访问。
- NodePort: 在每个节点上暴露一个静态端口,通过
<NodeIP>:<NodePort>从外部访问。 - LoadBalancer: 在支持云提供商的环境中,自动创建一个外部负载均衡器。
配置管理
为了避免将敏感信息或配置硬编码在镜像中,Kubernetes 提供了 ConfigMap 和 Secret。
| 特性 | ConfigMap | Secret |
|---|---|---|
| 用途 | 存储非敏感配置数据(如配置文件、环境变量) | 存储敏感数据(如密码、Token、密钥) |
| 编码 | 明文存储 | Base64 编码存储(建议结合加密静态存储使用) |
| 挂载方式 | Volume 挂载或环境变量 | Volume 挂载或环境变量 |
网络插件 (CNI)
Kubernetes 本身不实现网络功能,而是通过 CNI(Container Network Interface)插件来提供。流行的选择包括:
- Flannel: 简单高效,适合小型集群,使用 VXLAN 封装。
- Calico: 基于 BGP 协议,性能优异,支持网络策略(Network Policy),适合大型生产环境。
- CoreDNS: 用于集群内部的服务名解析,替代了早期的 kube-dns。
Kubernetes 项目由 Google 开源,灵感来源于其内部的 Borg 系统。
成立云原生计算基金会(CNCF),Kubernetes 成为首个加入 CNCF 的项目。
Kubernetes 1.11 版本发布,标志着其达到生产级成熟度,被各大云厂商广泛支持。
Kubernetes 1.28+ 版本持续优化,引入更强大的可观测性、安全性及边缘计算支持(如 KubeEdge)。
Kubernetes (K8s) 常见问题解答 (FAQ)
Docker 是一个容器化平台,主要用于构建和运行容器。而 Kubernetes 是一个容器编排系统,用于管理多个主机上的容器集群。简单来说,Docker 负责“造”容器,Kubernetes 负责“管”容器。两者通常配合使用,Kubernetes 可以使用 Docker 或其他容器运行时(如 containerd)作为后端。
扩容 Kubernetes 集群通常有两种方式:一是增加新的 Worker 节点,通过 kubeadm join 命令将其加入集群;二是利用云提供商的自动伸缩组(Cluster Autoscaler),根据资源使用率自动添加或移除节点。对于应用层面的扩容,可以通过 kubectl scale deployment <name> --replicas=<number> 命令调整 Pod 副本数。
Kubernetes 提供了三种重启策略:Always(默认,只要容器停止就重启)、OnFailure(仅当容器非正常退出时才重启)和 Never(从不自动重启)。这些策略可以通过 Pod 的 spec 进行配置。
首先使用 kubectl get pods 查看状态,常见状态包括 Pending(资源不足或调度失败)、CrashLoopBackOff(应用崩溃)、ImagePullBackOff(镜像拉取失败)。接着使用 kubectl describe pod <pod-name> 查看详细事件日志,或使用 kubectl logs <pod-name> 查看容器标准输出和错误日志。如果是调度问题,检查节点资源是否充足;如果是应用问题,检查应用日志。
Helm 是 Kubernetes 的包管理工具。它允许用户定义、安装和升级复杂的 Kubernetes 应用。Helm 使用 Chart 作为应用打包格式,Chart 包含应用的所有资源定义模板。使用 Helm 可以简化应用部署流程,实现配置复用,并方便地进行版本管理和回滚。
网友们还关心:Kubernetes (K8s) 周边生态
掌握 Kubernetes 只是第一步,构建完整的云原生栈还需要了解其周边的优秀工具。以下是与 Kubernetes 强相关的周边知识:
Service Mesh (Istio)
Istio 是一个开源的服务网格,它透明地分层到现有的分布式应用上。通过 Istio,你可以实现对微服务的流量管理、安全通信、监控和可观测性,而无需修改业务代码。
CI/CD 集成 (Jenkins/GitOps)
将 Kubernetes 与 Jenkins 或 GitLab CI 集成,实现自动化构建和部署。GitOps 模式(如使用 ArgoCD)则主张将集群状态与 Git 仓库中的声明式配置保持同步,提高安全性和可审计性。
可观测性 (Prometheus + Grafana)
Prometheus 是云原生监控的事实标准,专门用于采集 Kubernetes 指标。Grafana 则用于可视化展示这些指标,帮助运维人员快速定位性能瓶颈。