【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0

[复制链接]
发表于 2026-10-3 13:48:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

用 kubeadm 快速拉起一个 K8s 1.19 集群

kubeadm 是官方推荐的集群快速部署工具,把证书、kubelet 配置、控制平面组件启动这些脏活都封装成几条命令。这篇按「规划 → 初始化 → 装 Docker → 部署 Master → Join Node → 配 CNI → 验证」的顺序走一遍 Kubernetes 1.19.0 的部署全过程,并补齐原流程里容易漏掉的 sysctl 和镜像源配置。

一、Kubernetes 是什么

Kubernetes 是可移植、可扩展的开源平台,用于管理容器化工作负载和服务,支撑声明式配置与自动化。名字源于希腊语,意为「舵手」/「飞行员」;k8s 这个缩写是因为 k 和 s 之间有 8 个字符。Google 在 2014 年开源了它,建立在 Google 十几年大规模跑生产负载的经验之上,如今生态已非常庞大。

二、服务器规划

先规划角色,别一上来就开始装:

角色IP配置组件
k8s-master1192.168.2.1304C / 8G / 100GapiServer、controller-manager、scheduler、etcd
k8s-node1192.168.2.1314C / 6G / 100Gkubelet、kube-proxy、docker、etcd
k8s-node2192.168.2.1324C / 6G / 100Gkubelet、kube-proxy、docker、etcd

三节点起步、master 也跑 etcd 是最小可用拓扑。生产环境 master 至少 3 台做高可用,但学习/验证一套就够了。

三、所有节点初始化

3.1 关防火墙 / SELinux / Swap

# 关防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关 SELinux(永久 + 临时)
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

# 关 Swap(永久禁用:注释掉 /etc/fstab 里 swap 那行)
swapoff -a
vim /etc/fstab

# 设主机名
hostnamectl set-hostname k8s-master1

swap 必须关——1.19 版本 kubelet 默认强制要求,不关会卡在 [WARNING Swap] 甚至节点 NotReady。

3.2 配 hosts、sysctl 与 docker daemon.json

# hosts:master 上 push 所有节点
cat >> /etc/hosts <<EOF
192.168.2.130 k8s-master1
192.168.2.131 k8s-node1
192.168.2.132 k8s-node2
EOF

# sysctl 桥接流量转发
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
modprobe br_netfilter
sysctl --system

# docker daemon.json(国内镜像加速 + 指定 cgroupdriver)
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": { "max-size": "100m" }
}
EOF

exec-opts: native.cgroupdriver=systemd 这行很关键:kubelet 用 systemd cgroup 驱动时,Docker 也必须一致,否则 Pod 起来后资源统计异常、节点莫名 NotReady。

四、装 Docker / kubeadm / kubelet(所有节点)

4.1 装 Docker(阿里云源)

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum makecache fast
yum -y install docker-ce docker-ce-cli containerd.io
systemctl enable docker && systemctl start docker
docker version

4.2 加 Kubernetes 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=0
EOF
yum makecache fast

4.3 装三个组件(锁 1.19.0)

yum -y install kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0
systemctl enable kubelet

kubelet 装完是不会自动启动的(等 kubeadm init 生成配置后才起),这是正常的,别去手动 start。

五、部署 Master

kubeadm init \
  --kubernetes-version=v1.19.0 \
  --image-repository=registry.aliyuncs.com/google_containers \
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.96.0.0/12 \
  --apiserver-advertise-address=192.168.2.130
  • --image-repository:用阿里云镜像仓库拉 control plane 镜像,否则会卡在 k8s.gcr.io 拉不下来。
  • --pod-network-cidr:Pod 网段,必须和后面 CNI 插件一致(flannel 常用 10.244.0.0/16,calico 常用 192.168.0.0/16)。

成功后会打印 kubeadm join ... 这一行,务必复制保存,节点加入要靠它。然后配 kubeconfig:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $USERUSER $HOME/.kube/config

kubectl get nodes
kubectl get pods -n kube-system

此时 master 状态是 NotReady(正常,因为 Pod 网络还没装)。

六、部署容器网络(CNI)

没有 CNI 就没有 Pod 网络,集群永远 Ready 不了。二选一:

# flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 或 calico(改 CIDR 与上面 pod-network-cidr 对齐)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

国内环境建议先把这些 yaml 下载下来,把 image: 里的 quay.io/docker.io 镜像前缀换成国内镜像站对应的路径,再 kubectl apply -f,不然会卡在 ImagePullBackOff。

七、Node 加入集群

在每台 node 上执行 master 初始化结束时打印的那条 join 命令:

kubeadm join 192.168.2.130:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx

默认 token 24 小时过期,过期了就在 master 上重新生成:

kubeadm token create --print-join-command

八、验证集群

kubectl get nodes                    # 三台都 Ready
kubectl get pods -A                  # kube-system 下所有 Pod Running
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc
curl http://节点IP:暴露端口

能跑通这个闭环,集群就可用了。

九、常见坑

  • [ERROR Swap] → 关 swap,并注释 /etc/fstab 里的 swap 行,重启也别让它回来。
  • docker 与 kubelet cgroup driver 不一致 → 两边统一 systemd。
  • ImagePullBackOff → 镜像拉不到,换 --image-repository 或手动 docker pull 后打 tag。
  • rpc error: code = Unavailable desc = transport is closing(kubelet 起不来)→ 多半是 docker 版本与 k8s 1.19 不匹配,docker 锁 19.03 / 20.10,别用 24.x+(新版移除了 dockershim 相关兼容)。
  • etcd 数据目录在 /var/lib/etcd,定期备份,参考 etcd snapshot save 流程。
  • 重置重来:kubeadm reset,然后 rm -rf /etc/kubernetes /var/lib/etcd 再重新 init。

小结

kubeadm 部署的核心顺序:关 firewalld/SELinux/swap → 配 hosts + sysctl + docker daemon(cgroupdriver=systemd)→ 装 docker 与 kubelet/kubeadm/kubectl(锁版本)→ master kubeadm init(指定阿里云镜像仓库 + pod cidr)→ apply CNI → node kubeadm join → kubectl get nodes 验 Ready。三个最容易翻车的点:swap 没关、cgroup driver 不一致、pod-network-cidr 和 CNI 网段对不上——这三条踩中任意一条,节点都会停在 NotReady。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表