1. 从零认识Kubernetes:容器编排的工业标准
当我们在2014年首次接触Docker时,容器技术带来的轻量化部署确实令人惊艳。但很快,当需要管理成百上千个容器时,新的挑战出现了——如何高效调度这些容器?如何实现无缝扩缩容?这正是Kubernetes(简称k8s)诞生的背景。作为Google开源的容器编排系统,k8s如今已成为云原生时代的操作系统,全球超过70%的容器化应用运行在其上。
k8s本质上是一个分布式系统管理平台,它抽象了底层硬件资源,让开发者只需声明"我需要运行5个Nginx实例",系统就会自动完成节点选择、容器部署、健康监控等一系列复杂操作。这种声明式API设计大幅降低了分布式应用的运维复杂度。在技术架构上,k8s采用master-worker模式:控制平面(master节点)负责决策,工作节点(worker)负责执行,两者通过API Server通信。这种松耦合设计使得k8s可以轻松扩展到数千节点。
提示:k8s名称中的"8"代表中间省略的8个字母(ubernete),这是工程师们常用的缩写方式,类似的还有i18n(internationalization)等。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么选择Ubuntu作为k8s部署环境?
在Linux发行版的选择上,Ubuntu凭借其优异的稳定性和活跃的社区支持,成为k8s官方推荐的操作系统之一。特别是Ubuntu 22.04 LTS版本,其内置的snap包管理器可以一键安装最新版kubeadm等工具,大大简化了部署流程。相比其他发行版,Ubuntu对k8s的兼容性测试更为全面,每个版本发布前都会经过Canonical公司的专项验证。
从硬件兼容性角度看,Ubuntu对各类云平台和裸金属服务器的支持也更为友好。无论是AWS、Azure等公有云,还是本地VMware虚拟化环境,Ubuntu都能提供开箱即用的驱动支持。这对于需要跨平台部署k8s集群的企业尤为重要。此外,Ubuntu默认包含的apt-get包管理工具,使得后续维护和升级更加便捷。
3. 环境准备:搭建k8s的硬件与系统要求
3.1 硬件资源配置建议
对于学习测试环境,建议配置:
- Master节点:至少2核CPU/2GB内存/20GB磁盘
- Worker节点:至少1核CPU/1GB内存/10GB磁盘
生产环境则需根据实际负载调整:
- 中小规模集群:Master节点4核8GB内存,Worker节点按应用需求配置
- 大规模集群:建议采用多Master高可用架构,每个Master节点8核16GB以上
注意:k8s对磁盘I/O性能较为敏感,建议使用SSD存储。虚拟机环境下要确保虚拟化支持已开启(可通过
egrep -c '(vmx|svm)' /proc/cpuinfo命令验证,返回值大于0表示支持)。
3.2 Ubuntu系统初始化配置
在所有节点上执行以下基础配置:
bash复制# 关闭swap(k8s v1.8+要求)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 设置主机名解析
sudo hostnamectl set-hostname k8s-master # 在master节点执行
sudo hostnamectl set-hostname k8s-worker1 # 在worker节点执行
# 将主机名加入hosts文件
cat <<EOF | sudo tee -a /etc/hosts
192.168.1.100 k8s-master
192.168.1.101 k8s-worker1
EOF
# 加载内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
4. 容器运行时安装:Docker与containerd选型
4.1 Docker安装与配置
虽然k8s已不再强制依赖Docker,但作为最成熟的容器运行时,Docker仍是许多开发者的首选。在Ubuntu上安装最新版Docker CE:
bash复制# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 配置cgroup驱动为systemd(必须与k8s一致)
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 重启服务
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
4.2 containerd直接安装方案
对于追求轻量化的环境,可以直接使用containerd作为运行时:
bash复制# 安装containerd
sudo apt-get update
sudo apt-get install -y containerd
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改cgroup驱动为systemd
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
5. k8s核心组件安装与集群初始化
5.1 使用kubeadm安装核心组件
在所有节点上安装kubeadm、kubelet和kubectl:
bash复制# 添加Google Cloud GPG密钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
# 添加k8s仓库
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装指定版本(此处以1.23.5为例)
sudo apt-get update
sudo apt-get install -y kubelet=1.23.5-00 kubeadm=1.23.5-00 kubectl=1.23.5-00
sudo apt-mark hold kubelet kubeadm kubectl
5.2 Master节点初始化
在master节点执行初始化(注意替换apiserver-advertise-address):
bash复制sudo kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=1.23.5
# 初始化成功后配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5.3 Worker节点加入集群
在worker节点执行master初始化时输出的join命令(示例):
bash复制sudo kubeadm join 192.168.1.100:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxx
6. 网络插件部署与集群验证
6.1 安装Flannel网络插件
在master节点上部署Flannel:
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
6.2 验证集群状态
检查各组件状态:
bash复制# 查看节点状态
kubectl get nodes -o wide
# 查看pod状态
kubectl get pods --all-namespaces
# 检查系统组件健康状态
kubectl get componentstatuses
预期输出应显示所有节点状态为Ready,核心组件(etcd、controller-manager等)状态为Healthy。
7. 常见问题排查手册
7.1 节点NotReady问题排查流程
-
检查kubelet服务状态:
bash复制
systemctl status kubelet journalctl -xeu kubelet -
验证网络连通性:
bash复制
ping <master-ip> curl -k https://<master-ip>:6443 -
检查容器运行时:
bash复制docker ps # 或 containerd ctr containers ls
7.2 Pod一直处于Pending状态
可能原因及解决方案:
- 资源不足:
kubectl describe pod <pod-name>查看事件 - 镜像拉取失败:检查镜像地址是否正确,或手动
docker pull测试 - 节点选择器不匹配:检查pod的nodeSelector配置
7.3 网络插件常见故障
Flannel网络问题排查步骤:
bash复制# 检查flannel接口
ip a show flannel.1
# 验证路由表
ip route show
# 检查iptables规则
sudo iptables-save | grep flannel
8. 生产环境优化建议
8.1 高可用架构设计
生产环境建议采用多master架构:
- 3个或5个master节点组成控制平面
- 使用外部etcd集群提高可靠性
- 配置负载均衡器(如HAProxy)分发API请求
8.2 安全加固措施
-
启用RBAC授权:
bash复制
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole=cluster-admin \ --user=system:serviceaccount:kube-system:default -
配置网络策略:
bash复制
kubectl apply -f https://raw.githubusercontent.com/ahmetb/kubernetes-network-policy-recipes/master/01-deny-all-traffic-to-an-application.yaml -
定期轮换证书:
bash复制
kubeadm alpha certs renew all
8.3 监控与日志方案
推荐工具组合:
- 监控:Prometheus + Grafana
- 日志:EFK(Elasticsearch+Fluentd+Kibana)
- 告警:Alertmanager
部署示例:
bash复制# 安装Prometheus Operator
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
9. 从Docker到k8s:概念映射指南
对于熟悉Docker的开发者,理解这些对应关系有助于快速上手k8s:
| Docker概念 | k8s对应资源 | 差异说明 |
|---|---|---|
| Container | Pod | Pod可包含多个紧密关联的容器 |
| docker run | Deployment | k8s通过控制器管理pod生命周期 |
| docker-compose | Helm Chart | Helm提供更强大的模板化部署 |
| docker swarm | k8s Cluster | k8s调度能力更强大 |
| docker volume | PersistentVolume | k8s提供更丰富的存储抽象 |
10. 学习资源与进阶路线
10.1 官方文档精要
- 核心概念:Pods、Services、Deployments、StatefulSets
- 控制器:ReplicaSet、DaemonSet、Job/CronJob
- 网络:Ingress、NetworkPolicy
- 存储:PV/PVC、StorageClass
- 安全:RBAC、PodSecurityPolicy
10.2 实践项目建议
- 部署WordPress多实例带MySQL集群
- 实现蓝绿部署的自动化流水线
- 构建CI/CD集成(Jenkins+GitLab+k8s)
- 开发自定义Operator管理有状态应用
10.3 认证体系参考
- CKAD(Certified Kubernetes Application Developer)
- CKA(Certified Kubernetes Administrator)
- CKS(Certified Kubernetes Security Specialist)
我在实际运维k8s集群过程中发现,初期最常见的错误是资源请求(requests/limits)配置不当。一个实用的技巧是:为所有pod设置合理的requests,这比盲目设置limits更重要。requests帮助调度器做出正确决策,而limits不当反而可能导致pod被错误杀死。例如对于Java应用,建议requests设置为容器内存的70%,limits可设为90%,并添加适当的JVM内存参数。
