阿里云Ubuntu 16.04上,手把手教你用kubeadm搭建K8S 1.18集群(保姆级避坑指南)
阿里云Ubuntu 16.04环境下的Kubernetes 1.18集群实战部署指南
在云计算和容器化技术蓬勃发展的今天,Kubernetes已成为企业级容器编排的事实标准。对于刚接触K8s的开发者而言,从零开始搭建一个生产可用的集群往往充满挑战。本文将基于阿里云Ubuntu 16.04环境,详细解析如何避开常见陷阱,成功部署Kubernetes 1.18集群。
1. 环境准备与基础配置
1.1 阿里云ECS选型建议
对于学习和测试环境,推荐以下配置组合:
- 计算型实例:2核4GB内存(如ecs.c6.large)
- 系统盘:40GB高效云盘
- 操作系统:Ubuntu 16.04 64位
- 网络配置:按流量计费,峰值带宽设置为100Mbps
注意:虽然Ubuntu 16.04已接近EOL,但在特定场景下仍需使用该版本时,建议内核升级至4.4以上以获得更好的Docker兼容性。
1.2 系统初始化设置
在多节点部署前,需确保所有节点具备正确的网络标识:
# 设置主机名(分别在master和node节点执行) hostnamectl set-hostname master01 # 主节点 hostnamectl set-hostname node01 # 工作节点1 hostnamectl set-hostname node02 # 工作节点2 # 编辑/etc/hosts文件(所有节点相同配置) cat >> /etc/hosts <<EOF 172.24.88.146 master01 172.24.88.148 node01 172.24.88.147 node02 EOF关键检查点:
- 确认
/etc/hostname文件内容已更新 - 测试节点间主机名解析是否正常
- 关闭swap分区:
swapoff -a并注释掉/etc/fstab中的swap行
1.3 内核参数调优
Kubernetes对Linux内核有特定要求,需调整以下参数:
# 创建内核参数配置文件 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 EOF # 应用配置 sysctl --system常见问题排查:
- 若出现
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables错误,需先加载br_netfilter模块:modprobe br_netfilter lsmod | grep br_netfilter
2. 容器运行时环境部署
2.1 Docker安装与配置
阿里云环境下推荐使用镜像加速安装Docker CE:
# 安装基础依赖 apt-get update && apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - # 设置稳定版仓库 add-apt-repository \ "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable" # 安装Docker apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io2.2 Docker关键配置调整
需要特别注意的两个核心配置项:
cgroup驱动配置:
// /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://<your-aliyun-mirror>.mirror.aliyuncs.com"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" }解决FORWARD链策略问题:
# 修改Docker服务配置 sed -i '/^ExecStart=/a ExecStartPost=/sbin/iptables -P FORWARD ACCEPT' \ /lib/systemd/system/docker.service # 重启服务 systemctl daemon-reload && systemctl restart docker
2.3 典型问题解决方案
问题1:WARNING: No swap limit support
解决方法:
# 编辑grub配置文件 vi /etc/default/grub # 在GRUB_CMDLINE_LINUX中添加: GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 ..." # 更新grub并重启 update-grub && reboot问题2:镜像拉取缓慢
阿里云用户可配置专属镜像加速器:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker3. Kubernetes组件安装
3.1 配置阿里云Kubernetes源
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 >/etc/apt/sources.list.d/kubernetes.list <<EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update3.2 安装指定版本组件
对于1.18版本集群,建议锁定软件包版本:
apt-get install -y \ kubelet=1.18.20-00 \ kubeadm=1.18.20-00 \ kubectl=1.18.20-00 \ --allow-downgrades防止自动升级:
apt-mark hold kubelet kubeadm kubectl4. 集群初始化与节点加入
4.1 Master节点初始化
生成定制化配置文件:
kubeadm config print init-defaults > kubeadm-init.yaml关键配置修改项:
apiVersion: kubeadm.k8s.io/v1beta2 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 172.24.88.146 # 主节点内网IP bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: master01 taints: null --- apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration imageRepository: registry.aliyuncs.com/google_containers kubernetesVersion: v1.18.20 networking: dnsDomain: cluster.local podSubnet: 192.168.0.0/16 # 与CNI插件匹配 serviceSubnet: 10.96.0.0/12执行初始化:
kubeadm init --config kubeadm-init.yaml --upload-certs4.2 网络插件部署
推荐使用Calico作为CNI插件:
kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml验证部署状态:
watch kubectl get pods -n kube-system4.3 Worker节点加入集群
在Master节点获取加入命令:
kubeadm token create --print-join-command在Worker节点执行输出命令,格式类似:
kubeadm join 172.24.88.146:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:8009eeba6c73ad14380d3bbaf81f407660e887a12eefc6bfae12c6138afacd3b4.4 集群验证
基础检查命令:
# 查看节点状态 kubectl get nodes -o wide # 检查核心组件健康状态 kubectl get componentstatuses # 测试DNS解析 kubectl run -it --rm --restart=Never busybox --image=busybox -- nslookup kubernetes.default5. 常见故障排查指南
5.1 初始化失败分析
典型错误1:kubelet isn't running or healthy
解决方法:
journalctl -xeu kubelet # 查看kubelet日志 systemctl restart kubelet && systemctl enable kubelet典型错误2:port 6443 is in use
解决方法:
ss -tulnp | grep 6443 # 查找冲突进程5.2 节点NotReady状态处理
检查步骤:
- 确认kubelet服务运行正常
- 检查CNI插件是否部署成功
- 验证网络连通性:
ping <master-node-ip> telnet <master-node-ip> 6443
5.3 镜像拉取失败处理
阿里云镜像加速配置:
kubeadm config images pull \ --image-repository registry.aliyuncs.com/google_containers手动拉取镜像示例:
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20 docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20 k8s.gcr.io/kube-apiserver:v1.18.206. 生产环境优化建议
6.1 安全加固措施
禁用匿名访问:
kubectl create clusterrolebinding cluster-system-anonymous \ --clusterrole=cluster-admin \ --user=system:anonymous配置RBAC权限
启用Pod安全策略
6.2 性能调优参数
调整kubelet配置:
# /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration evictionHard: memory.available: "500Mi" nodefs.available: "10%" nodefs.inodesFree: "5%" imagefs.available: "15%" maxPods: 1506.3 监控方案部署
推荐使用Prometheus-Operator:
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup.yaml kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/在阿里云Ubuntu 16.04上部署Kubernetes 1.18集群时,最耗时的往往不是标准流程的执行,而是各种环境差异导致的问题排查。建议在正式部署前,先使用相同配置的测试环境验证所有步骤。遇到问题时,善用journalctl -xe和kubectl describe命令查看详细错误信息,多数情况下都能找到解决方案线索。
