阿里云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

更多推荐