1. 项目概述
在当今云原生技术蓬勃发展的背景下,Kubernetes作为容器编排的事实标准,已经成为企业级应用部署的必备技能。本文将详细介绍在Ubuntu 22.04 LTS系统上部署Kubernetes 1.23版本的完整流程,这是一套经过生产环境验证的可靠方案。
我曾在多个实际项目中采用这套部署方案,包括金融行业的微服务架构和电商平台的高可用集群。相比直接使用云服务商提供的托管Kubernetes,自主部署能带来更深入的技术掌控和成本优化空间,特别适合需要定制化配置的中大型项目。
2. 环境准备
2.1 系统要求
推荐使用Ubuntu 22.04 LTS作为基础系统,这是目前最稳定的长期支持版本。硬件配置建议:
- 至少2核CPU(生产环境建议4核以上)
- 4GB内存(生产环境建议16GB以上)
- 20GB磁盘空间
- 稳定的网络连接
注意:所有节点(包括master和worker)的系统时间必须同步,建议安装chrony进行时间同步:
sudo apt install -y chrony sudo systemctl enable --now chronyd2.2 基础环境配置
首先在所有节点上执行以下通用配置:
- 禁用swap空间:
sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab- 加载内核模块:
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 --system3. 容器运行时安装
3.1 Docker安装与配置
虽然Kubernetes 1.23支持多种容器运行时,但Docker仍是最成熟稳定的选择:
sudo apt update sudo apt install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 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 sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io配置Docker使用systemd作为cgroup驱动:
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 --now docker3.2 containerd配置
Kubernetes 1.23默认使用containerd作为容器运行时接口(CRI),需要额外配置:
sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml >/dev/null sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml sudo systemctl restart containerd4. Kubernetes组件安装
4.1 安装kubeadm、kubelet和kubectl
添加Kubernetes官方仓库并安装必要组件:
sudo apt update sudo apt install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF sudo apt update sudo apt install -y kubelet=1.23.17-00 kubeadm=1.23.17-00 kubectl=1.23.17-00 sudo apt-mark hold kubelet kubeadm kubectl提示:这里我们选择1.23.17这个经过充分验证的补丁版本,避免使用初始版本可能存在的稳定性问题。
4.2 初始化控制平面
在master节点执行初始化:
sudo kubeadm init \ --kubernetes-version=v1.23.17 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --apiserver-advertise-address=<master节点IP>初始化完成后,按照提示配置kubectl:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config记录下输出的join命令,后续worker节点加入集群时需要用到。
5. 网络插件部署
5.1 安装Flannel网络插件
Kubernetes需要CNI插件实现Pod间通信,这里选择最稳定的Flannel:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml验证网络插件状态:
kubectl get pods -n kube-system -l app=flannel5.2 网络策略配置
生产环境建议启用NetworkPolicy:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/policy/network-policy.yaml6. Worker节点加入集群
在每个worker节点上执行之前记录的join命令,格式如下:
sudo kubeadm join <master节点IP>:6443 \ --token <token> \ --discovery-token-ca-cert-hash sha256:<hash>加入完成后,在master节点验证节点状态:
kubectl get nodes7. 集群验证与优化
7.1 基础功能验证
部署测试应用验证集群功能:
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get svc nginx访问NodePort端口验证Nginx服务是否正常。
7.2 集群优化配置
- 设置kubelet最大Pod数量:
sudo sed -i 's/^KUBELET_EXTRA_ARGS=.*/KUBELET_EXTRA_ARGS="--max-pods=100"/' /etc/default/kubelet sudo systemctl restart kubelet- 调整API服务器参数:
sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml添加以下参数:
- --service-node-port-range=30000-32767 - --max-requests-inflight=1500 - --max-mutating-requests-inflight=5008. 常见问题排查
8.1 节点NotReady状态
可能原因及解决方案:
- 网络插件未正常运行:
kubectl describe pod -n kube-system <flannel-pod-name>- 容器运行时故障:
sudo systemctl status containerd journalctl -xeu containerd8.2 Pod卡在Pending状态
检查资源配额和调度约束:
kubectl describe pod <pod-name> kubectl get events --sort-by=.metadata.creationTimestamp8.3 网络连接问题
检查Calico网络策略:
kubectl get networkpolicy --all-namespaces kubectl describe networkpolicy <policy-name>9. 生产环境建议
- 高可用部署:建议至少3个master节点组成高可用控制平面
- 监控方案:部署Prometheus-Operator监控集群状态
- 日志收集:使用EFK(Elasticsearch+Fluentd+Kibana)栈
- 备份策略:定期备份etcd数据
- 安全加固:启用RBAC、PodSecurityPolicy等安全机制
10. 版本升级路径
从1.23升级到更高版本的推荐路径:
- 先升级到1.23的最新补丁版本
- 然后逐步升级到1.24、1.25等后续版本
- 每次升级前务必检查版本变更说明和废弃API
升级命令示例:
sudo apt update sudo apt install -y kubeadm=1.24.x-00 sudo kubeadm upgrade plan sudo kubeadm upgrade apply v1.24.x sudo apt install -y kubelet=1.24.x-00 kubectl=1.24.x-00 sudo systemctl restart kubelet11. 性能调优技巧
- 调整kubelet资源预留:
sudo vi /var/lib/kubelet/config.yaml添加:
systemReserved: cpu: "500m" memory: "500Mi" kubeReserved: cpu: "500m" memory: "500Mi"- 优化etcd性能:
sudo vi /etc/kubernetes/manifests/etcd.yaml添加:
- --auto-compaction-retention=1h - --quota-backend-bytes=8589934592 # 8GB- API服务器缓存优化:
sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml添加:
- --watch-cache=true - --watch-cache-sizes=secrets#500,configmaps#50012. 安全加固措施
- 启用Pod安全准入:
sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml添加:
- --enable-admission-plugins=PodSecurity- 限制容器权限:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: restricted spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - 'configMap' - 'emptyDir' - 'projected' - 'secret' - 'downwardAPI' - 'persistentVolumeClaim' hostNetwork: false hostIPC: false hostPID: false runAsUser: rule: 'MustRunAsNonRoot' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'MustRunAs' ranges: - min: 1 max: 65535 fsGroup: rule: 'MustRunAs' ranges: - min: 1 max: 65535 readOnlyRootFilesystem: false- 定期轮换证书:
sudo kubeadm certs renew all sudo systemctl restart kubelet