从零到一:基于kubeadm的K8s集群搭建实战指南
1. 环境准备打造K8s集群的基石搭建Kubernetes集群就像盖房子地基打得好才能建得稳。我遇到过不少新手在环境准备阶段就翻车最常见的就是硬件配置不足导致后续安装失败。我们先来看看需要准备哪些建筑材料。硬件要求是第一个门槛。官方建议每台机器至少2核CPU和2GB内存但根据我的实测经验这个配置只能算是勉强能用。如果你打算跑实际业务建议至少4核8GB起步。我曾经在一个2核4GB的测试环境部署刚装上监控组件系统就卡死了不得不重新来过。操作系统方面CentOS 7/8、Ubuntu 18.04/20.04都是不错的选择。这里有个小技巧选择操作系统时最好用官方长期支持(LTS)版本避免遇到奇怪的兼容性问题。我去年用CentOS 8 Stream就踩过坑某些依赖包版本冲突导致kubelet服务起不来。网络环境准备是另一个关键点。你需要确保所有节点间能互相ping通内网优先每个节点有唯一主机名关闭防火墙或配置好规则禁用SELinux临时永久关闭swap分区# 设置主机名各节点不同 hostnamectl set-hostname k8s-master # 关闭SELinux setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config # 关闭swap swapoff -a sed -ri s/.*swap.*/#/ /etc/fstab # 允许iptables检查桥接流量 cat EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 EOF sysctl --system2. 核心组件安装三剑客到位环境准备好后就该安装Kubernetes的三剑客了kubeadm、kubelet和kubectl。这就像装修房子前要先准备好锤子、钉子和锯子。Docker安装是第一步。虽然现在K8s也支持containerd等其他运行时但Docker还是最成熟的选择。建议使用阿里云镜像源加速下载# 移除旧版本 sudo yum remove docker* -y # 配置yum源 sudo yum install -y yum-utils sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装并启动 sudo yum install -y docker-ce docker-ce-cli containerd.io systemctl enable docker --now # 配置加速器和cgroup驱动 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://82m9ar63.mirror.aliyuncs.com], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, storage-driver: overlay2 } EOF sudo systemctl daemon-reload sudo systemctl restart dockerKubernetes组件安装需要注意版本匹配问题。我强烈建议锁定特定版本避免自动升级带来意外。下面是配置阿里云镜像源安装1.20.9版本的示例cat EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttp://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck0 repo_gpgcheck0 gpgkeyhttp://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 安装指定版本 sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 systemctl enable --now kubelet3. 集群初始化主节点诞生记万事俱备现在可以初始化主节点了。这个过程就像选举村长要先确定一个领导核心。镜像拉取是第一个坎。由于网络原因直接从谷歌仓库拉镜像经常会失败。我的解决方案是使用国内镜像源sudo tee ./images.sh -EOF #!/bin/bash images( kube-apiserver:v1.20.9 kube-proxy:v1.20.9 kube-controller-manager:v1.20.9 kube-scheduler:v1.20.9 coredns:1.7.0 etcd:3.4.13-0 pause:3.2 ) for imageName in ${images[]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName done EOF chmod x ./images.sh ./images.sh主节点初始化命令需要特别注意几个参数--apiserver-advertise-address主节点内网IP--pod-network-cidr要与后续安装的网络插件匹配--image-repository使用国内镜像源kubeadm init \ --apiserver-advertise-address172.31.0.2 \ --control-plane-endpointcluster-endpoint \ --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \ --kubernetes-version v1.20.9 \ --service-cidr10.96.0.0/16 \ --pod-network-cidr192.168.0.0/16初始化成功后你会看到类似这样的输出Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config记得保存最后的kubeadm join命令这是其他节点加入集群的入场券。这个token默认24小时有效过期后可以用kubeadm token create --print-join-command重新生成。4. 网络插件与节点加入完成集群搭建刚初始化完的集群就像没有铺路的村庄各个节点间无法通信。我们需要安装网络插件来打通村道。Calico网络插件是我的首选它性能不错而且配置简单# 下载calico配置文件 curl https://docs.projectcalico.org/manifests/calico.yaml -O # 部署calico kubectl apply -f calico.yaml部署完成后你可以通过watch kubectl get pods -n kube-system观察状态等所有pod都变成Running就说明网络通了。工作节点加入就简单多了在各个工作节点执行之前保存的join命令即可kubeadm join cluster-endpoint:6443 --token x5g4uy.wpjjdbgra92s25pp \ --discovery-token-ca-cert-hash sha256:6255797916eaee52bf9dda9429db616fcd828436708345a308f4b917d3457a22加入后在主节点执行kubectl get nodes应该能看到类似输出NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 10m v1.20.9 k8s-node1 Ready none 2m v1.20.9 k8s-node2 Ready none 1m v1.20.95. 验证与Dashboard部署给集群装上仪表盘集群搭建完成后我们需要验证它的健壮性。最简单的办法就是模拟节点故障# 随机删除一个pod验证自愈能力 kubectl delete pod -n kube-system $(kubectl get pods -n kube-system | grep kube-proxy | head -1 | awk {print $1}) # 查看pod是否自动重建 kubectl get pods -n kube-system -wDashboard部署可以让我们有个图形化管理界面。虽然老手更喜欢命令行但对新手来说可视化界面更友好# 部署dashboard kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml # 修改服务类型为NodePort kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard # 将type: ClusterIP改为type: NodePort创建管理员账号cat EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF获取访问令牌kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath{.secrets[0].name}) -o go-template{{.data.token | base64decode}}最后通过https://节点IP:NodePort访问Dashboard输入上面获取的token即可登录。