1. 阿里云ECS搭建Kubernetes实战指南
在云计算和容器化技术蓬勃发展的今天,Kubernetes已成为企业级容器编排的事实标准。作为一名长期在云原生领域实践的工程师,我经常需要在不同云平台上部署Kubernetes集群。阿里云ECS凭借其稳定的性能和丰富的产品生态,成为国内用户搭建K8s集群的热门选择。本文将基于最新稳定版Kubernetes(v1.29),分享我在阿里云ECS上部署生产级Kubernetes集群的完整方案。
这个方案特别适合以下场景:
- 企业需要快速构建私有化容器平台
- 开发者希望获得与云托管服务相当的K8s体验
- 需要灵活控制集群规模和配置的技术团队
提示:本文所有操作均基于阿里云CentOS 8.5镜像验证,但原理适用于大多数Linux发行版。建议准备至少3台ECS实例(2核4G起步)进行集群部署。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境规划与资源准备
2.1 硬件资源配置建议
根据我的部署经验,不同规模的业务对资源配置有显著差异:
| 节点类型 | 最小配置 | 推荐生产配置 | 数量要求 |
|---|---|---|---|
| Master节点 | 2核4GB | 4核8GB | 奇数台(3+) |
| Worker节点 | 4核8GB | 8核16GB | 按需扩展 |
| etcd节点 | 2核4GB | 4核8GB | 与Master分离时3+ |
在阿里云上创建ECS时,需要注意几个关键点:
- 选择相同可用区保证网络延迟最低
- 开启云盘性能突发模式应对IO峰值
- 为系统盘分配至少100GB空间(容器镜像很占空间)
2.2 网络规划要点
阿里云VPC网络配置直接影响集群性能:
bash复制# 查看实例所在VPC和vSwitch
aliyun ecs DescribeInstances --InstanceIds your_instance_id
建议采用如下网络方案:
- 每个节点分配至少16个Pod IP(通过CNI插件实现)
- Service网段不要与VPC网段重叠
- 启用VPC流量镜像方便排错
3. 基础环境配置
3.1 系统参数调优
在所有节点上执行以下优化(以CentOS为例):
bash复制# 关闭Swap
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
# 设置内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl --system
# 设置文件描述符限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
3.2 容器运行时安装
阿里云官方推荐使用containerd作为运行时:
bash复制# 安装containerd
yum install -y containerd.io
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 修改sandbox镜像为阿里云镜像
sed -i 's|k8s.gcr.io/pause|registry.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml
# 启动服务
systemctl enable --now containerd
4. Kubernetes集群部署
4.1 使用kubeadm初始化集群
在主节点执行:
bash复制# 配置阿里云yum源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[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 kubeadm-1.29.0 kubelet-1.29.0 kubectl-1.29.0
systemctl enable --now kubelet
# 初始化控制平面
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--upload-certs
初始化完成后,按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
4.2 网络插件部署
推荐使用Calico网络插件:
bash复制kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
验证网络组件状态:
bash复制watch kubectl get pods -n kube-system
5. 节点加入与集群验证
5.1 Worker节点加入
在Worker节点执行主节点初始化后提供的join命令:
bash复制kubeadm join <master-ip>:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--node-labels="node-role.kubernetes.io/worker="
5.2 集群健康检查
使用以下命令验证集群状态:
bash复制# 查看节点状态
kubectl get nodes -o wide
# 检查核心组件健康状态
kubectl get componentstatuses
# 运行测试Pod验证网络
kubectl run busybox --image=busybox -- sleep 3600
kubectl exec busybox -- ping <another-pod-ip>
6. 生产环境增强配置
6.1 阿里云云盘CSI插件集成
为集群添加持久化存储支持:
bash复制# 安装CSI插件
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/deploy/ack.yaml
# 创建StorageClass
cat > alicloud-disk-ssd.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-ssd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_ssd
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
EOF
kubectl apply -f alicloud-disk-ssd.yaml
6.2 负载均衡配置
使用阿里云SLB暴露服务:
bash复制# 创建LoadBalancer类型的Service
cat > nginx-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: nginx
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
EOF
kubectl apply -f nginx-svc.yaml
7. 运维与监控方案
7.1 日志收集配置
使用阿里云Logtail收集容器日志:
bash复制# 安装Logtail DaemonSet
kubectl apply -f https://raw.githubusercontent.com/aliyun/aliyun-log-kubernetes/master/logtail-daemonset.yaml
# 创建日志配置
cat > nginx-log-config.yaml <<EOF
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
name: nginx-log
spec:
logstore: k8s-nginx
shardCount: 2
lifeCycle: 90
machineGroups:
- k8s-group
inputDetail:
type: plugin
plugin:
inputs:
- type: service_docker_stdout
detail:
IncludeLabel:
app: nginx
EOF
kubectl apply -f nginx-log-config.yaml
7.2 监控方案实施
部署Prometheus-Operator监控集群:
bash复制# 添加Helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 安装kube-prometheus-stack
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
--set grafana.adminPassword=your_password
8. 常见问题排查指南
8.1 节点NotReady问题排查流程
-
检查kubelet服务状态:
bash复制
journalctl -u kubelet -n 50 --no-pager -
验证网络插件是否正常运行:
bash复制
kubectl get pods -n kube-system | grep calico -
检查节点资源是否耗尽:
bash复制kubectl describe node <node-name> | grep -A 10 "Allocated resources"
8.2 Pod创建失败常见原因
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| ImagePullBackOff | 镜像拉取失败 | 检查镜像地址或配置阿里云镜像加速 |
| CrashLoopBackOff | 应用启动失败 | 查看Pod日志kubectl logs |
| Pending状态超过5分钟 | 资源不足或调度问题 | 检查kubectl describe pod输出 |
| NetworkPluginNotReady | CNI插件未正确安装 | 重新部署网络插件 |
9. 性能优化实践
9.1 内核参数深度调优
对于高负载生产环境,建议调整以下参数:
bash复制# 追加到/etc/sysctl.d/k8s.conf
echo "net.core.somaxconn = 32768" >> /etc/sysctl.d/k8s.conf
echo "net.ipv4.tcp_max_syn_backlog = 8096" >> /etc/sysctl.d/k8s.conf
echo "vm.overcommit_memory = 1" >> /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
9.2 Kubelet资源配置
优化Worker节点的kubelet配置:
bash复制# 编辑/var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
maxPods: 150
kubeAPIQPS: 50
kubeAPIBurst: 100
serializeImagePulls: false
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
10. 安全加固措施
10.1 RBAC权限控制
创建最小权限ServiceAccount:
bash复制cat > dev-sa.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: dev-user
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: dev-role
namespace: default
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev-rolebinding
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: dev-role
subjects:
- kind: ServiceAccount
name: dev-user
namespace: default
EOF
kubectl apply -f dev-sa.yaml
10.2 Pod安全策略
启用PSP(PodSecurityPolicy):
bash复制# 创建策略
cat > restricted-psp.yaml <<EOF
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
EOF
kubectl apply -f restricted-psp.yaml
在实际部署过程中,我发现阿里云ECS的突发性能实例(t5)不太适合运行Kubernetes节点,特别是在集群初始化阶段容易出现CPU积分耗尽导致部署失败的情况。建议至少选择计算型(c6)或通用型(g6)实例系列。另外,合理设置自动伸缩组可以显著降低运维成本,我通常会在Worker节点组配置基于CPU利用率的伸缩策略,阈值设置在60%-70%之间效果最佳。
