阿里云Ubuntu 16.04上,从Docker配置到K8S 1.18集群搭建的保姆级避坑实录
阿里云Ubuntu 16.04上Kubernetes 1.18集群搭建实战指南
在云计算和容器化技术蓬勃发展的今天,Kubernetes已成为容器编排领域的事实标准。本文将带您深入探索如何在阿里云Ubuntu 16.04环境下,从零开始搭建一个稳定可靠的Kubernetes 1.18集群。不同于简单的步骤罗列,我们将重点关注实际部署过程中可能遇到的各种"坑点"及其解决方案,帮助中级开发者和运维人员避开常见陷阱,顺利完成集群部署。
1. 环境准备与系统配置
1.1 阿里云服务器选购建议
对于Kubernetes集群的搭建,建议选择至少3台阿里云ECS实例(1台Master和2台Node)。配置方面:
- Master节点:推荐2核4G内存起步
- Worker节点:根据实际负载需求,可选择2核4G或更高配置
- 操作系统:Ubuntu 16.04 64位(内核版本建议4.4以上)
提示:阿里云按量付费实例适合测试环境,可随时释放避免不必要的费用支出。
1.2 基础系统配置
在所有节点上执行以下基础配置:
# 设置主机名(分别在三个节点执行)
hostnamectl set-hostname master01 # 主节点
hostnamectl set-hostname node01 # 工作节点1
hostnamectl set-hostname node02 # 工作节点2
# 配置hosts文件(所有节点相同配置)
cat >> /etc/hosts <<EOF
172.24.88.146 master01
172.24.88.148 node01
172.24.88.147 node02
EOF
验证配置是否生效:
hostname # 验证主机名
cat /etc/hosts # 验证hosts配置
1.3 系统参数调优
Ubuntu 16.04默认需要调整几个关键参数:
# 关闭swap(Kubernetes 1.8+要求)
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 启用IP转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 加载br_netfilter模块
modprobe br_netfilter
echo "br_netfilter" >> /etc/modules-load.d/modules.conf
2. Docker环境配置与优化
2.1 Docker安装与版本选择
在Ubuntu 16.04上安装Docker时,版本选择至关重要。建议使用Docker CE 19.03.x版本:
# 安装必要工具
apt-get update && apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# 设置稳定版仓库
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 安装Docker
apt-get update && apt-get install -y \
docker-ce=5:19.03.15~3-0~ubuntu-xenial \
docker-ce-cli=5:19.03.15~3-0~ubuntu-xenial \
containerd.io
2.2 解决常见Docker问题
问题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:Docker与iptables规则冲突
# 修改Docker服务配置
vi /lib/systemd/system/docker.service
# 在[Service]部分添加
ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
# 重启Docker服务
systemctl daemon-reload && systemctl restart docker
2.3 Docker镜像加速与cgroup驱动配置
配置阿里云镜像加速和正确的cgroup驱动:
# 创建/修改daemon.json
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://<your-aliyun-mirror>.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 重启Docker服务
systemctl restart docker
注意:将
<your-aliyun-mirror>替换为您在阿里云容器镜像服务中获取的专属加速地址。
3. Kubernetes组件安装与配置
3.1 配置阿里云Kubernetes镜像源
Ubuntu 16.04上配置阿里云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 update
3.2 安装kubeadm、kubelet和kubectl
安装特定版本的Kubernetes组件(1.18.x):
# 查看可用版本
apt-cache madison kubeadm
# 安装指定版本
apt-get install -y \
kubelet=1.18.20-00 \
kubeadm=1.18.20-00 \
kubectl=1.18.20-00
# 禁止自动更新
apt-mark hold kubelet kubeadm kubectl
3.3 配置kubelet cgroup驱动
确保kubelet使用与Docker相同的cgroup驱动:
# 创建kubelet配置文件
cat > /etc/default/kubelet <<EOF
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
EOF
# 重启kubelet
systemctl daemon-reload && systemctl restart kubelet
4. Kubernetes集群初始化与节点加入
4.1 Master节点初始化
生成初始配置文件并修改关键参数:
kubeadm config print init-defaults > init-master.yaml
编辑init-master.yaml文件,主要修改以下部分:
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.24.88.146 # Master节点内网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 # 与后续网络插件匹配
serviceSubnet: 10.96.0.0/12
执行初始化:
kubeadm init --config init-master.yaml
初始化成功后,按照提示配置kubectl:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
4.2 安装网络插件
选择Calico作为网络插件(与之前配置的podSubnet匹配):
kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
验证Master节点状态:
kubectl get nodes
# 应显示STATUS为Ready
4.3 Worker节点加入集群
在Master节点上获取加入命令:
kubeadm token create --print-join-command
在Worker节点上执行输出的加入命令,格式类似:
kubeadm join 172.24.88.146:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
在所有节点加入后,验证集群状态:
kubectl get nodes
# 所有节点应显示为Ready状态
5. 集群验证与常见问题排查
5.1 基本功能验证
部署测试Pod验证集群功能:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods,svc
访问测试:
curl http://<任一节点IP>:<NodePort>
5.2 常见问题排查指南
问题1:节点NotReady
检查组件状态:
journalctl -u kubelet -f # 查看kubelet日志
systemctl status kubelet # 检查kubelet服务状态
问题2:Pod一直处于Pending状态
检查资源情况:
kubectl describe pod <pod-name> # 查看具体原因
kubectl get events --sort-by=.metadata.creationTimestamp
问题3:网络不通
检查Calico组件:
kubectl get pods -n kube-system | grep calico
kubectl logs <calico-pod-name> -n kube-system
6. 生产环境优化建议
6.1 阿里云特定优化
利用阿里云基础设施优势:
- 镜像加速:配置所有节点使用阿里云容器镜像服务
- 云盘存储:考虑使用阿里云云盘作为持久卷
- SLB集成:使用阿里云SLB作为Ingress Controller的外部负载均衡
6.2 安全加固措施
基础安全配置:
# 限制kube-apiserver的匿名访问
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: disable-anonymous-access
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: User
name: system:anonymous
namespace: default
EOF
6.3 监控与日志方案
推荐部署:
- 监控:Prometheus-Operator + Grafana
- 日志:EFK(Elasticsearch+Fluentd+Kibana)栈
- 阿里云服务:可集成阿里云ARMS和SLS服务
# 示例:部署Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
更多推荐
所有评论(0)