马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
用 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-master1 | 192.168.2.130 | 4C / 8G / 100G | apiServer、controller-manager、scheduler、etcd |
| k8s-node1 | 192.168.2.131 | 4C / 6G / 100G | kubelet、kube-proxy、docker、etcd |
| k8s-node2 | 192.168.2.132 | 4C / 6G / 100G | kubelet、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 $USER USER $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企服评测-应用市场 编辑提示 |