1. Ubuntu系统与Kubernetes环境准备
在Ubuntu 18.04 LTS上部署Kubernetes 1.23版本,首先需要确保系统环境满足基本要求。我建议使用至少2GB内存和2核CPU的机器作为节点,因为Kubernetes的控制平面组件会消耗不少资源。在实际生产环境中,master节点建议配置4核CPU和8GB内存以上。
系统版本检查很重要,我曾经遇到过因为Ubuntu小版本差异导致组件不兼容的问题。执行以下命令确认系统版本:
bash复制lsb_release -a
# 输出示例
# No LSB modules are available.
# Distributor ID: Ubuntu
# Description: Ubuntu 18.04.5 LTS
# Release: 18.04
# Codename: bionic
网络配置是集群正常工作的基础。我习惯使用Netplan配置静态IP,这比DHCP更可靠。编辑/etc/netplan/01-netcfg.yaml文件时,注意YAML的缩进格式:
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens32:
dhcp4: no
addresses: [192.168.110.128/24]
gateway4: 192.168.110.2
nameservers:
addresses: [192.168.110.2,114.114.114.114]
应用网络配置后,务必测试网络连通性。我曾经因为DNS配置错误导致后续镜像拉取失败,浪费了大量排查时间。
重要提示:所有节点都需要配置主机名解析,编辑/etc/hosts文件确保各节点能通过主机名互相访问。这是kubeadm加入集群时的必备条件。
2. 系统参数与依赖组件配置
Kubernetes对Linux系统有些特殊要求,这些配置容易被忽视但至关重要。首先必须关闭swap,否则kubelet会无法启动:
bash复制swapoff -a
sed -i '/swap/d' /etc/fstab
内核参数调整直接影响网络性能。创建/etc/sysctl.d/k8s.conf文件并加入以下内容:
bash复制net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
加载新配置后,建议重启系统确保所有修改生效。我曾经遇到sysctl配置未持久化的问题,导致集群网络异常。
容器运行时选择上,虽然Kubernetes支持多种运行时,但Docker仍是最成熟稳定的选择。安装Docker 20.10版本时,特别注意cgroup驱动必须改为systemd:
json复制{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"]
}
这个配置需要放入/etc/docker/daemon.json。重启Docker后验证驱动是否生效:
bash复制docker info | grep -i cgroup
# 正确输出应显示:Cgroup Driver: systemd
3. Kubernetes组件安装与初始化
Kubernetes组件安装需要配置阿里云镜像源,因为官方源在国内访问不稳定。添加源时要注意Ubuntu版本代号匹配:
bash复制apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
安装特定版本的kubelet、kubeadm和kubectl时,明确指定版本号可以避免意外升级:
bash复制apt-get install -y kubelet=1.23.0-00 kubeadm=1.23.0-00 kubectl=1.23.0-00
初始化控制平面是部署的关键步骤。这里有几个重要参数需要注意:
bash复制kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.110.128
--pod-network-cidr必须与后续安装的CNI插件匹配,否则网络无法正常工作。初始化成功后,按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
4. 网络插件部署与节点加入
Calico是功能完善的CNI插件选择,特别适合需要网络策略的场景。部署前需要确认yaml文件中的CIDR与kubeadm初始化时一致:
bash复制wget https://docs.projectcalico.org/manifests/calico.yaml
sed -i 's/192.168.0.0/10.244.0.0/g' calico.yaml
kubectl apply -f calico.yaml
worker节点加入集群需要token,如果忘记初始化时输出的token,可以在master节点上重新生成:
bash复制kubeadm token create --print-join-command
# 输出示例:kubeadm join 192.168.110.128:6443 --token abcdef.0123456789abcdef ...
在worker节点执行该命令后,可以在master上查看节点状态:
bash复制kubectl get nodes -w
# 健康状态应显示为Ready
NAME STATUS ROLES AGE VERSION
k8scludes1 Ready control-plane,master 10m v1.23.0
k8scludes2 Ready <none> 2m v1.23.0
5. 集群验证与常见问题排查
部署完成后,运行以下命令验证集群核心组件状态:
bash复制kubectl get pods -n kube-system
# 应看到coredns、calico-node、kube-proxy等pod都处于Running状态
常见问题及解决方案:
-
节点NotReady:通常是网络插件未正确安装,检查calico-node pod日志:
bash复制
kubectl logs -n kube-system calico-node-xxxxx -
镜像拉取失败:手动拉取镜像并重新打标签:
bash复制
docker pull registry.aliyun.com/google_containers/pause:3.6 docker tag registry.aliyun.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6 -
kubelet启动失败:检查journalctl日志:
bash复制
journalctl -xeu kubelet
为提高工作效率,建议配置kubectl命令补全和别名:
bash复制echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
6. 生产环境优化建议
对于生产环境,还需要考虑以下增强措施:
-
etcd备份:定期备份etcd数据,防止集群状态丢失
bash复制
etcdctl snapshot save snapshot.db \ --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 -
节点亲和性:为master节点设置污点,避免工作负载调度到控制平面
bash复制
kubectl taint nodes k8scludes1 node-role.kubernetes.io/master:NoSchedule -
监控告警:部署Prometheus-Operator监控集群健康状态
bash复制
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup.yaml -
HPA配置:为关键服务配置水平自动扩缩
yaml复制apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: myapp-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
7. 版本升级与维护
Kubernetes版本升级需要谨慎操作。先升级kubeadm,再升级控制平面,最后升级worker节点:
bash复制# 在master节点
apt-get update && apt-get install -y kubeadm=1.23.1-00
kubeadm upgrade plan
kubeadm upgrade apply v1.23.1
# 升级kubelet和kubectl
apt-get install -y kubelet=1.23.1-00 kubectl=1.23.1-00
systemctl restart kubelet
# 在worker节点
apt-get update && apt-get install -y kubeadm=1.23.1-00
kubeadm upgrade node
apt-get install -y kubelet=1.23.1-00
systemctl restart kubelet
日常维护时,建议使用以下命令检查集群健康状态:
bash复制kubectl get componentstatuses
kubectl top nodes
kubectl get events --sort-by='.metadata.creationTimestamp'
我在实际运维中发现,定期清理完成的Job和Evicted状态的Pod能有效释放资源:
bash复制kubectl delete pods --field-selector=status.phase=Failed -A
kubectl delete jobs --field-selector=status.successful=1 -A
