阿里云ECS上搭建生产级Kubernetes集群实战指南
1. 项目背景与核心价值
在云计算时代,容器编排技术已经成为现代应用部署的标准方案。作为一名长期在云计算领域实践的工程师,我最近在阿里云ECS上成功搭建了一套生产可用的Kubernetes集群。整个过程踩过不少坑,也积累了一些实战经验,今天就把这个完整方案分享给大家。
阿里云ECS作为国内领先的云服务器产品,提供了稳定可靠的IaaS层资源。而Kubernetes作为容器编排领域的事实标准,两者结合可以快速构建企业级容器化平台。这种方案特别适合中小型企业快速搭建自己的DevOps基础设施,也适合开发者学习云原生技术栈。
2. 环境准备与资源规划
2.1 服务器选型建议
在阿里云上搭建Kubernetes集群,首先需要考虑ECS实例的选型。根据我的经验:
- 控制节点(Master):建议至少2核4G配置,生产环境推荐4核8G
- 工作节点(Node):根据业务负载选择,开发环境2核4G起步
- 系统盘:建议40GB以上,选择高效云盘或SSD云盘
- 操作系统:推荐使用Aliyun Linux 2或CentOS 7.9
重要提示:阿里云部分ECS实例规格(如t5突发性能实例)不适合运行Kubernetes,建议选择计算型c6或通用型g6系列实例。
2.2 网络规划要点
- VPC规划:建议为Kubernetes集群创建独立的VPC
- 交换机配置:至少配置2个不同可用区的交换机
- 安全组设置:需要开放6443(API Server)、2379-2380(etcd)等端口
- 弹性公网IP:建议仅为Master节点配置EIP
3. Kubernetes集群部署实战
3.1 基础环境配置
在所有节点上执行以下基础配置:
# 关闭swap swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab # 关闭SELinux setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 配置内核参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system3.2 容器运行时安装
推荐使用containerd作为容器运行时:
# 安装containerd yum install -y containerd.io # 配置containerd mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # 修改sandbox镜像为阿里云镜像 sed -i 's|k8s.gcr.io/pause|registry.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml # 启动containerd systemctl enable --now containerd3.3 Kubernetes组件安装
配置阿里云Kubernetes镜像源:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF安装kubeadm、kubelet和kubectl:
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes systemctl enable --now kubelet3.4 集群初始化
在Master节点执行初始化:
kubeadm init \ --image-repository registry.aliyuncs.com/google_containers \ --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/config3.5 网络插件安装
推荐使用Flannel作为网络插件:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml4. 工作节点加入集群
在每个工作节点执行Master节点初始化后提供的join命令:
kubeadm join <Master节点IP>:6443 --token <token> \ --discovery-token-ca-cert-hash sha256:<hash>加入完成后,在Master节点验证节点状态:
kubectl get nodes5. 集群验证与基础组件部署
5.1 集群状态检查
# 查看组件状态 kubectl get componentstatuses # 查看pod状态 kubectl get pods --all-namespaces # 查看节点资源使用情况 kubectl top nodes5.2 部署Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml创建访问令牌:
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')6. 生产环境优化建议
6.1 Master节点高可用
生产环境建议部署3个Master节点实现高可用:
- 部署负载均衡器(如阿里云SLB)
- 使用keepalived+haproxy实现本地负载均衡
- 修改kubeadm配置使用VIP地址
6.2 持久化存储方案
推荐使用阿里云CSI插件对接云盘/NAS:
# 安装CSI插件 kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/deploy/ack/csi-plugin.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/deploy/ack/csi-provisioner.yaml6.3 监控与日志方案
- 监控:Prometheus + Grafana
- 日志:EFK(Elasticsearch + Fluentd + Kibana)
- 告警:Alertmanager
7. 常见问题排查
7.1 节点NotReady状态排查
- 检查kubelet服务状态:
systemctl status kubelet - 查看kubelet日志:
journalctl -u kubelet -f - 检查网络插件pod状态:
kubectl get pods -n kube-system
7.2 Pod一直处于Pending状态
- 查看事件详情:
kubectl describe pod <pod-name> - 检查资源配额:
kubectl describe nodes - 检查存储卷声明:
kubectl get pvc
7.3 镜像拉取失败
- 配置阿里云镜像加速器
- 检查镜像地址是否正确
- 检查网络连通性
8. 运维管理技巧
- 使用kubectl自动补全:
echo 'source <(kubectl completion bash)' >> ~/.bashrc- 快速查看资源使用:
watch -n 1 kubectl get pods -A- 批量删除异常pod:
kubectl delete pods --field-selector=status.phase=Failed -A- 使用kubectl插件:
# 安装krew插件管理器 ( set -x; cd "$(mktemp -d)" && curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" && tar zxvf krew.tar.gz && KREW=./krew-"$(uname | tr '[:upper:]' '[:lower:]')_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/arm.*$/arm/')" && "$KREW" install krew )在实际运维过程中,我发现阿里云ECS的自动恢复功能对Kubernetes节点异常恢复很有帮助。建议为生产环境节点开启"实例自动恢复"功能,当节点底层硬件故障时,系统会自动迁移实例到健康物理机。
