K8S 学习分享
在云原生技术飞速发展的当下,Kubernetes(简称 K8S)已成为容器编排领域的事实标准。无论是大规模容器集群的管理、微服务架构的落地,还是企业级应用的高可用部署,K8S 都发挥着核心作用。本次分享将从 K8S 的基础概念出发,逐步深入核心技术与实践操作,最终带你走进 K8S 的进阶应用场景,帮助你快速掌握这一云原生时代的关键技术。
一、K8S 是什么?为什么要学 K8S?
在接触 K8S 之前,我们首先要明确 “它是什么” 和 “学它有什么用”,这能让我们的学习更具目标性。
1.1 K8S 的核心定义
Kubernetes 是一个开源的容器编排平台,由 Google 主导开发并捐赠给 Cloud Native Computing Foundation(CNCF)。它能够自动化容器的部署、扩展、运维和管理,将多个容器化的应用组织成一个高效、可靠的集群系统。简单来说,K8S 解决了 “大量容器如何协同工作、如何保障服务稳定运行” 的问题 —— 这是它最核心的价值所在。
与 Docker Compose(适用于单机多容器管理)不同,K8S 专注于分布式集群环境下的容器编排,支持跨主机、跨区域的容器调度,具备自动故障恢复、弹性伸缩、滚动更新等企业级特性。例如,当集群中某个容器故障时,K8S 会自动在其他节点上重启该容器;当业务流量增长时,K8S 能根据预设规则自动增加容器实例数量,确保服务性能稳定。
1.2 为什么必须掌握 K8S?
容器编排的行业标准:随着容器技术的普及,企业对大规模容器集群的管理需求日益迫切,而 K8S 已成为容器编排领域的绝对标准,主流云厂商(如阿里云、腾讯云、AWS)均提供基于 K8S 的托管服务。
微服务架构的核心支撑:在微服务架构中,一个应用会拆分为数十甚至上百个独立的微服务,每个微服务以容器形式部署。K8S 通过 Service、Ingress 等组件实现微服务间的通信与路由,通过 ConfigMap、Secret 实现配置与敏感信息的统一管理,是微服务落地的关键技术。
自动化运维的基石:K8S 支持自动部署、滚动更新、故障自愈等功能,大幅减少人工运维成本。例如,通过 K8S 的 Deployment 资源,可实现应用的零 downtime 升级;通过 Horizontal Pod Autoscaler(HPA),可根据 CPU 利用率或自定义指标自动调整容器实例数量。
云原生时代的职场刚需:目前,国内外互联网公司、传统企业的数字化转型项目中,K8S 已成为必备技术。掌握 K8S 不仅能提升个人技术竞争力,还能为职业发展打开更广阔的空间(如云原生工程师、K8S 运维工程师等岗位需求旺盛)。
跨平台与可移植性:K8S 支持在物理机、虚拟机、公有云、私有云等多种环境中部署,应用一旦基于 K8S 编排,可轻松在不同环境间迁移,避免 vendor lock-in(厂商锁定)。
二、K8S 核心概念:7 个 “核心组件” 要吃透
K8S 的体系相对复杂,但核心围绕 “控制平面 + 节点” 的架构展开,理解以下 7 个核心组件的功能与关系,就能打通 K8S 的 “任督二脉”。
2.1 控制平面组件(Control Plane)
控制平面是 K8S 集群的 “大脑”,负责集群的全局决策(如容器调度、故障恢复、资源管理),通常部署在独立的节点上(生产环境中需高可用部署,避免单点故障)。
2.1.1 kube-apiserver
功能:K8S 集群的 “统一入口”,所有操作(如创建 Pod、部署 Service)都通过调用 kube-apiserver 的 API 实现。它负责认证、授权、数据验证,并将集群状态存储到 etcd 中。
特点:无状态设计,支持水平扩展;是唯一与 etcd 直接交互的控制平面组件。
2.1.2 etcd
功能:K8S 集群的 “数据库”,存储集群的所有配置信息和状态数据(如 Pod 定义、Service 规则、节点信息等)。
特点:分布式键值存储,具备高可用、强一致性特性;生产环境中需部署 3 个或 5 个节点的 etcd 集群,确保数据安全。
2.1.3 kube-scheduler
功能:K8S 的 “调度器”,负责将 Pod(容器的最小部署单元)调度到合适的节点上。调度决策基于节点资源(CPU、内存)、Pod 资源需求、亲和性 / 反亲和性规则、污点与容忍度等因素。
示例:当用户创建一个 Pod 时,kube-scheduler 会分析所有可用节点的资源情况,选择一个资源充足且符合调度规则的节点,将 Pod 部署到该节点。
2.1.4 kube-controller-manager
功能:K8S 的 “控制器管理器”,运行多个控制器进程(如 Node Controller、Deployment Controller、Service Controller),负责维护集群的 “期望状态” 与 “实际状态” 一致。
常见控制器:
Node Controller:监控节点健康状态,当节点故障时,将该节点上的 Pod 调度到其他节点。
Deployment Controller:管理 Deployment 资源,确保 Pod 的数量与用户定义的 “replicas” 一致(如用户设置 3 个副本,若某个 Pod 故障,会自动创建新的 Pod 补充)。
2.2 节点组件(Node)
节点组件是 K8S 集群的 “工作节点”,负责运行容器并与控制平面通信,每个节点都需要部署以下组件。
2.2.1 kubelet
功能:K8S 在节点上的 “代理”,负责管理节点上的 Pod 生命周期(如启动、停止、监控 Pod)。它会定期向 kube-apiserver 汇报节点和 Pod 的状态,并执行控制平面下发的指令(如创建 Pod、更新 Pod 配置)。
关键作用:确保节点上的 Pod 按照 PodSpec(Pod 的定义文件)运行,若 Pod 的实际状态与 PodSpec 不一致,kubelet 会尝试修复(如重启异常的容器)。
2.2.2 kube-proxy
功能:K8S 的 “网络代理”,运行在每个节点上,负责维护节点的网络规则(如 iptables 或 ipvs 规则),实现 Service 的负载均衡和 Pod 间的通信。
示例:当用户访问一个 Service 时,kube-proxy 会将请求转发到该 Service 对应的多个 Pod 上,实现请求的负载分担;同时,kube-proxy 还会处理 Pod 的网络隔离(如 NetworkPolicy 规则)。
2.2.3 容器运行时(Container Runtime)
功能:K8S 的 “容器引擎”,负责运行容器的底层软件,如 Docker、containerd、CRI-O 等(K8S 1.24 + 版本已默认弃用 Docker 作为容器运行时,推荐使用 containerd)。
作用:kubelet 通过容器运行时接口(CRI)与容器运行时交互,完成容器的创建、启动、停止等操作。
2.3 核心资源对象
除了组件,K8S 还有一些核心资源对象,是用户与 K8S 交互的 “最小单元”,常见的包括:
Pod:K8S 的最小部署单元,包含一个或多个紧密关联的容器(如一个应用容器 + 一个日志收集容器),所有容器共享 Pod 的网络和存储资源。
Service:定义 Pod 的访问方式,为一组 Pod 提供一个固定的访问地址(ClusterIP),实现 Pod 的 “服务发现” 和 “负载均衡”。即使 Pod 的 IP 发生变化(如 Pod 重启),Service 的 IP 也不会改变,确保服务访问稳定。
Deployment:用于管理 Pod 的创建和更新,支持滚动更新、回滚、扩缩容等功能,是最常用的 Pod 管理资源(替代了早期的 ReplicationController)。
ConfigMap/Secret:用于存储应用的配置信息(ConfigMap 存储非敏感配置,如数据库地址;Secret 存储敏感信息,如密码、密钥,数据会加密存储)。
Namespace:用于实现集群的 “资源隔离”,将集群划分为多个独立的命名空间(如 dev、test、prod),不同命名空间的资源相互隔离,避免命名冲突和资源争抢。
三、K8S 环境搭建:3 种主流方案(新手友好)
学习 K8S 的第一步是搭建环境,不同场景下有不同的搭建方案,下面介绍 3 种主流方案,从易到难,适合不同阶段的学习者。
3.1 方案 1:Minikube(单机版,适合新手入门)
Minikube 是 K8S 官方提供的单机版集群工具,通过虚拟化技术(如 VirtualBox、Docker)在本地创建一个单节点 K8S 集群,适合新手快速体验 K8S 的核心功能。
3.1.1 前置条件
本地环境:Windows 10/11、macOS、Linux(需开启虚拟化功能,如 Intel VT-x 或 AMD-V)。
已安装 Docker 或其他容器运行时(Minikube 可自动使用 Docker 作为容器运行时)。
3.1.2 安装步骤(以 macOS 为例)
安装 Minikube:
通过 Homebrew 安装(推荐):
brew install minikube
或通过官方脚本安装:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube
启动 Minikube 集群:
minikube start --driver=docker # 使用Docker作为驱动(无需额外安装虚拟机)
首次启动时,Minikube 会自动下载 K8S 所需的镜像(如 kube-apiserver、etcd),过程可能需要几分钟(建议配置国内镜像源,加速下载)。
若启动失败,可检查虚拟化功能是否开启,或执行minikube delete删除旧集群后重新启动。
验证集群状态:
minikube status # 查看Minikube集群状态,若显示“Running”则启动成功
kubectl cluster-info # 查看集群信息(如kube-apiserver地址)
kubectl get nodes # 查看节点列表,应显示1个节点(minikube),状态为“Ready”
安装 kubectl(K8S 命令行工具):
Minikube 启动后,可通过以下命令快速配置 kubectl:
minikube kubectl – get pods -A # 直接通过Minikube调用kubectl
或单独安装kubectl(以macOS为例):
brew install kubectl
kubectl version # 验证安装,显示客户端和服务器版本信息
3.1.3 常用 Minikube 命令
停止集群:minikube stop
删除集群:minikube delete
打开 K8S Dashboard(图形化界面):minikube dashboard(自动在浏览器中打开,可直观查看集群资源)
3.2 方案 2:Kind(多节点集群,适合测试多节点场景)
Kind(Kubernetes IN Docker)是另一个单机多节点 K8S 集群工具,通过 Docker 容器模拟 K8S 节点,支持创建多节点集群(如 1 个控制平面节点 + 2 个工作节点),适合测试多节点场景下的 K8S 功能(如调度、负载均衡)。
3.2.1 安装步骤(以 Linux 为例)
安装 Kind:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/
kind version # 验证安装,显示版本信息
创建多节点集群:
首先创建一个集群配置文件(kind-config.yaml),定义集群节点数量:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane # 控制平面节点
- role: worker # 工作节点1
- role: worker # 工作节点2
然后执行以下命令创建集群:
kind create cluster --config kind-config.yaml --name my-kind-cluster
验证集群状态:
kubectl cluster-info --context kind-my-kind-cluster # 切换到Kind集群上下文
kubectl get nodes # 查看节点列表,应显示3个节点(1个control-plane,2个worker)
3.3 方案 3:生产级集群(kubeadm 部署,适合企业场景)
kubeadm 是 K8S 官方提供的生产级集群部署工具,支持在多台物理机或虚拟机上部署高可用 K8S 集群(如 3 个控制平面节点 + 多个工作节点),适合企业级生产环境。以下以 “1 个控制平面节点 + 2 个工作节点” 为例,介绍部署步骤(基于 CentOS 7)。
3.3.1 前置条件(所有节点)
关闭防火墙和 SELinux:
sudo systemctl stop firewalld && sudo systemctl disable firewalld
sudo setenforce 0 && sudo sed -i ‘s/^SELINUX=enforcing$/SELINUX=permissive/’ /etc/selinux/config
关闭 swap 分区:
sudo swapoff -a && sudo sed -i ‘/swap/s/^/#/’ /etc/fstab
配置内核参数(开启 IP 转发和桥接):
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system # 生效内核参数
安装容器运行时(containerd):
安装containerd依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装containerd
sudo yum install -y containerd.io
配置containerd(设置SystemdCgroup为true)
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i ‘s/SystemdCgroup = false/SystemdCgroup = true/g’ /etc/containerd/config.toml
重启containerd
sudo systemctl restart containerd && sudo systemctl enable containerd
安装 kubeadm、kubelet、kubectl:
配置K8S yum源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
安装指定版本(以1.27.0为例)
sudo yum install -y kubelet-1.27.0 kubeadm-1.27.0 kubectl-1.27.0 --disableexcludes=kubernetes
启动kubelet并设置开机自启
sudo systemctl start kubelet && sudo systemctl enable kubelet
更多推荐


所有评论(0)