基于kubeadm快速部署Kubernetes集群实战指南
环境准备与系统调优
部署Kubernetes集群前,需对所有节点执行以下系统级配置:
- 停用防火墙与SELinux(生产环境建议按需配置)
- 统一集群节点时间同步,可采用公共NTP服务或自建时间服务器
- 禁用swap交换分区,避免影响kubelet资源调度
- 配置主机名解析,确保各节点可通过主机名互相访问
- 配置控制节点到工作节点的SSH免密登录
- 启用网桥流量过滤,确保容器网络流量可被iptables处理
执行内核参数配置:
modprobe br_netfilter
cat >> /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
软件源配置与组件安装
配置阿里云镜像源加速软件包获取:
cd /etc/yum.repos.d
rm -f CentOS-*
curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
cat > kubernetes.repo <<'EOF'
[kubernetes]
name=Kubernetes Repository
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
curl -o docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all && yum makecache fast
安装指定版本的核心组件(以v1.12.3为例):
yum install -y docker-ce kubelet-1.12.3 kubeadm-1.12.3 kubectl-1.12.3 kubernetes-cni-0.6.0
配置Docker使用阿里云镜像加速器,并启动服务:
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl enable --now docker kubelet
容器镜像本地化获取
由于网络限制,需通过国内镜像仓库拉取K8s所需镜像并重新标记:
#!/bin/bash
mirror_prefix="registry.cn-hangzhou.aliyuncs.com/kuberimages"
target_images=(
"kube-apiserver:v1.12.3"
"kube-controller-manager:v1.12.3"
"kube-scheduler:v1.12.3"
"kube-proxy:v1.12.3"
"etcd:3.2.24"
"coredns:1.2.2"
"pause:3.1"
)
for img in "${target_images[@]}"; do
docker pull "${mirror_prefix}/${img}"
docker tag "${mirror_prefix}/${img}" "k8s.gcr.io/${img}"
docker rmi "${mirror_prefix}/${img}"
done
验证镜像就绪:
docker images | grep k8s.gcr.io
控制平面初始化
在首个控制节点执行集群初始化(v1.13+可直接指定镜像仓库):
# v1.12及以下版本
kubeadm init \
--kubernetes-version=v1.12.3 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.199.116
# v1.13及以上版本(推荐)
kubeadm init \
--apiserver-advertise-address=192.168.199.116 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.13.1 \
--pod-network-cidr=10.244.0.0/16
初始化成功后,配置kubectl访问凭证:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
或设置环境变量:
export KUBECONFIG=/etc/kubernetes/admin.conf
CNI网络插件部署
集群初始化后节点状态为NotReady,需部署网络插件。以Flannel为例:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Flannel支持多种后端模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| VxLAN | 封装二层报文实现跨主机通信 | 通用场景,默认启用 |
| Directrouting | 同网段直接路由,跨网段自动降级为VxLAN | 性能优先场景 |
| host-gw | 纯主机路由,无跨网段能力 | 二层互通环境 |
| UDP | 早期兼容模式,性能较差 | 不推荐生产使用 |
修改ConfigMap可切换至Directrouting模式提升性能。部署完成后等待片刻,执行kubectl get nodes确认控制节点状态变为Ready。
工作节点加入集群
在初始化输出中获取加入命令,于各工作节点执行:
kubeadm join 192.168.199.116:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxx...
若token过期,可在控制节点重新生成:
kubeadm token create --print-join-command
返回控制节点验证集群状态:
kubectl get nodes -o wide
kubectl get pods --all-namespaces
待所有工作节点Pod调度完成,集群部署即告成功。