1. Kubernetes核心概念解析
Kubernetes(简称K8s)是Google开源的容器编排系统,现已成为云原生应用的事实标准。它本质上是一个分布式系统运行时环境,能够自动化容器化应用的部署、扩展和管理。就像交响乐团的指挥家,K8s协调着成百上千个容器实例的有序运作。
在技术架构上,K8s采用主从节点设计。控制平面(Control Plane)包含API Server、Scheduler、Controller Manager等核心组件,负责集群状态管理和决策;工作节点(Node)则通过kubelet、kube-proxy等组件实际运行容器负载。这种架构设计使得K8s既具备集中管控能力,又能实现工作负载的分布式执行。
重要提示:虽然K8s常与Docker搭配使用,但自v1.20版本后,K8s已逐步转向containerd作为默认容器运行时。理解这个变化对后续环境搭建很重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Ubuntu环境准备要点
2.1 系统基础配置
在Ubuntu 22.04 LTS上搭建K8s集群前,需要完成以下基础配置:
-
硬件要求:
- 控制节点:至少2核CPU/2GB内存/20GB磁盘
- 工作节点:建议4核CPU/4GB内存/40GB磁盘
- 所有节点需要保持时间同步(chrony服务)
-
网络准备:
bash复制# 关闭swap sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 设置主机名解析 sudo hostnamectl set-hostname k8s-master echo "192.168.1.100 k8s-master" | sudo tee -a /etc/hosts -
内核参数调整:
bash复制cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # 设置sysctl参数 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
2.2 容器运行时安装
目前K8s支持多种容器运行时,推荐使用containerd:
bash复制# 安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# 添加Docker仓库(实际使用containerd)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装containerd
sudo apt-get update
sudo apt-get install -y containerd.io
# 配置containerd
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
sudo systemctl restart containerd
3. K8s集群部署实战
3.1 使用kubeadm部署
kubeadm是官方推荐的集群部署工具:
bash复制# 添加K8s仓库
sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装kube组件
sudo apt-get update
sudo apt-get install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl
# 初始化控制平面(注意替换apiserver-advertise-address)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.100 \
--kubernetes-version=1.28.0
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.2 网络插件安装
K8s需要CNI插件实现Pod间通信,以Flannel为例:
bash复制kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 验证网络组件
kubectl get pods -n kube-system -l app=flannel
3.3 工作节点加入
获取加入命令:
bash复制kubeadm token create --print-join-command
在工作节点执行输出的join命令即可。
4. 关键问题排查指南
4.1 常见错误处理
-
cgroup驱动不匹配:
- 现象:kubelet不断重启,日志显示"detected cgroupfs as cgroup driver"
- 解决:确保containerd和kubelet都使用systemd驱动
-
镜像拉取失败:
bash复制# 查看镜像列表 crictl images # 手动拉取镜像 kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers -
网络插件冲突:
- 现象:CoreDNS Pod一直处于Pending状态
- 解决:确认只安装了一个CNI插件,删除冲突配置
4.2 性能优化建议
-
节点资源预留:
yaml复制# /var/lib/kubelet/config.yaml systemReserved: cpu: "500m" memory: "500Mi" kubeReserved: cpu: "500m" memory: "500Mi" -
API Server调优:
bash复制# 修改/etc/kubernetes/manifests/kube-apiserver.yaml - --max-requests-inflight=1500 - --max-mutating-requests-inflight=500 -
etcd维护:
bash复制# 定期压缩历史数据 ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ compact $(date +%s)
5. 生产环境进阶配置
5.1 高可用部署方案
对于生产环境,建议采用多控制平面部署:
bash复制# 第一个控制节点初始化时添加参数
kubeadm init --control-plane-endpoint "LOAD_BALANCER_IP:6443" \
--upload-certs
# 其他控制节点加入
kubeadm join LOAD_BALANCER_IP:6443 \
--token xxx \
--discovery-token-ca-cert-hash sha256:xxx \
--control-plane \
--certificate-key xxx
5.2 持久化存储配置
以NFS为例配置动态供给:
bash复制# 安装NFS客户端
sudo apt-get install -y nfs-common
# 部署NFS Provisioner
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
helm install nfs-subdir-external-provisioner \
nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.1.200 \
--set nfs.path=/data/nfs
5.3 监控方案实施
部署Prometheus监控栈:
bash复制# 添加Prometheus仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 安装kube-prometheus-stack
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
--set grafana.adminPassword=admin123
我在实际部署中发现,Ubuntu上的K8s环境对内核版本较敏感,特别是使用较新的硬件时。建议选择LTS版本内核,并通过apt-get install --install-recommends linux-generic获取稳定支持。另外,生产环境中务必配置适当的Pod安全策略和网络策略,这是很多初学者容易忽视的安全要点。
