尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

K8s集群部署

K8s集群部署 一、整体思路与部署原理说明在开始动手之前先梳理一下Kubernetes集群部署的整体思路。K8s集群本质上是由一组节点组成的分布式系统其中master节点负责集群的调度、控制和管理worker节点负责实际运行业务容器。整个部署过程可以拆解为四个关键环节镜像仓库准备、基础环境配置、集群初始化、网络插件 安装。为什么需要先搭建Harbor镜像仓库因为 Kubernetes 集群中的各个组件如 kube-apiserver、kube-controller-manager、kube-scheduler 等都是以容器镜像的形式运行的。在国内网络环境下直接从官方源拉取 镜像往往不稳定因此我们先把所需镜像同步到本地 Harbor 仓库后续所有节点都从内网仓库拉取既保证了速度也保证了版本的一致性。部署方式上这里采用 kubeadm工具进行集群初始化。kubeadm是Kubernetes官方提供的集群部署工具它把复杂的证书生成、组件配置、节点注册等过程封装成了标准化的命令大大降低了部署门槛。整个部署链路可以概括为Harbor仓库提供镜像 → 各节点安装容器运行时Docker cri-dockerd→ kubeadm 初始化 master → 工作节点加入集群 → 安装网络插件打通 Pod 通信。二、三大主流K8s集群部署方法原理实操解析目前行业内K8s集群部署主要分为三种方式kubeadm部署、二进制部署、容器化部署k3s/microk8s三种方式的底层组件完全一致区别仅在于自动化程度、部署形态、适用场景。下面逐一拆解原理和优缺点。1. kubeadm部署企业主流标准方式1部署原理kubeadm是K8s官方推出的集群快速部署工具核心原理是自动化拉取官方组件镜像以容器的方式运行控制面和数据面核心组件自动完成证书生成、etcd初始化 、组件注册、节点加入等核心操作屏蔽了复杂的底层配置。简单来说kubeadm把原本需要手动配置的组件、证书、服务全部封装成容器一条命令即可完成集群初始化极大降低部署门槛。2核心部署流程基于实操简化的核心流程也是生产环境通用流程所有节点统一系统环境配置关闭swap、防火墙策略放行、开启ip转发所有节点安装containerd运行时配置国内镜像源所有节点安装kubeadm、kubelet、kubectl工具锁定版本保证集群统一Master节点执行kubeadm init初始化控制面生成集群join令牌和证书所有Node节点通过kubeadm join命令加入集群部署Calico/Flannel CNI网络插件打通Pod网络校验集群状态部署核心插件完成集群初始化。3个人实操总结优缺点优点官方原生工具、兼容性最强、版本升级平滑、生产环境稳定性高、部署速度快、配置标准化几乎是企业生产环境的首选缺点自动化程度适中部分个性化配置高可用负载均衡、自定义证书时效需要手动修改组件以容器形式运行不方便直接修改组件启动参数。适用场景企业生产集群、测试集群、标准K8s环境搭建90%企业的选择。2. 二进制部署原生手动部署吃透底层必备1部署原理二进制部署是最原始、最底层的K8s部署方式核心原理不依赖任何自动化工具手动下载K8s、etcd所有组件的二进制可执行文件手动生成CA证书、手动配置组件启动参数、手动注册系统服务一步步搭建完整集群。这种方式完全暴露K8s集群的所有底层细节没有任何封装集群的每一个组件、每一份配置、每一个证书都由手动控制。2核心部署逻辑整体流程最繁琐但逻辑最清晰系统环境初始化同kubeadm手动部署etcd集群二进制方式搭建分布式数据库手动制作CA根证书、各组件通信证书apiserver、kubelet、proxy等依次部署控制面组件apiserver、scheduler、controller-manager配置系统守护进程依次部署数据面组件kubelet、kube-proxy手动配置组件认证、授权、网络参数部署CNI网络插件完成集群组网。3个人实操总结优缺点优点自由度100%可自定义所有组件参数、证书配置、集群架构无任何工具封装能彻底吃透K8s底层原理适合深度调优、定制化集群场景缺点部署极其繁琐、步骤多、极易出错对运维技术要求极高版本升级、故障排查成本高不适合快速搭建适用场景技术深度学习、集群深度定制、特殊私有化部署场景不建议生产常规使用。3. 轻量容器化部署k3s /microk8s轻量化场景首选1部署原理以k3s为代表的轻量化K8s部署方案核心原理是组件精简单二进制封装内置依赖。官方对标准K8s组件进行精简剔除冗余功能将控制面、数据面组件、etcd、网络插件 、DNS插件全部封装为一个独立二进制文件同时默认集成容器运行时实现单命令秒级部署。本质上它是简化版、轻量化的标准K8s完全兼容K8s原生API只是去除了企业级高可用的冗余配置适配轻量化场景。2核心部署逻辑部署极简无需复杂环境配置执行官方一键安装脚本自动下载k3s核心程序Master节点一键启动server模式自动初始化集群、证书、网络Node节点通过token一键加入集群集群自动集成CoreDNS、本地存储、网络插件无需额外配置。3个人实操总结优缺点优点部署极速、资源占用极低、配置极简、兼容原生K8s、适合低配服务器/虚拟机缺点精简了部分高级功能高可用扩展性不如标准kubeadm集群不适合大规模生产集群适用场景个人学习测试、边缘计算、小型私有化项目、低配环境部署、CI/CD测试环境。三构建Harbor镜像仓库1. 部署Docker本地仓库Harbor本身以容器方式运行因此需要先准备Docker环境。这里先在Harbor节点上搭建一个内网 Yum 仓库用于后续向集群各节点分发Docker安装包避免每台机器都从外网下载。[rootharbor ~]# cat /etc/yum.repos.d/docker.repo EOF [docker] name docker baseurl https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/ gpgcheck 0 EOF [rootharbor ~]# dnf install httpd createrepo-y [rootharbor ~]# mkdir /var/www/html/docker/ -p [rootharbor ~]# vim /etc/httpd/conf/httpd.conf Listen 4444 [rootharbor ~]# systemctl enable --now httpd [rootharbor ~]# dnf install docker-ce -downloadonly --destdir /mnt/ -y [rootharbor ~]# mv /mnt/*.rpm /var/www/html/docker/ [rootharbor ~]# createrepo -v /var/www/html/docker/ [rootharbor ~]# cat /etc/yum.repos.d/docker.repo EOF [docker] name docker baseurl http://172.25.254.254:4444/docker gpgcheck 0 EOF [rootharbor ~]# dnf install docker-ce -y2. 安装Docker并配置内核参数[rootharbor ~]# dnf install docker-ce -y [rootharbor ~]# echo br_netfilter /etc/modules-load.d/docker_mod.conf [rootharbor ~]# modprobe -a br_netfilter [rootharbor ~]# vim /etc/sysctl.d/docker.conf net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 [rootharbor ~]# systemctl restart systemd-modules-load.service [rootharbor ~]# sysctl --system [rootharbor ~]# vim /lib/systemd/system/docker.service ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock --iptablestrue [rootharbor ~]# systemctl daemon-reload [rootharbor ~]# systemctl enable --now docker3. 生成HTTPS证书[rootharbor ~]# mkdir /data/certs -p [rootharbor ~]# openssl req -newkey rsa:4096 \ -nodes -sha256 -keyout /data/certs/timinglee.org.key \ -addext subjectAltName DNS:reg.timinglee.org \ -x509 -days 365 -out /data/certs/timinglee.org.crt4. 编辑Harbor配置文件并启动[rootharbor ~]# tar zxf harbor-offline-installer-v2.5.4.tgz -C /opt/ [rootharbor ~]# cd /opt/harbor/ [rootharbor harbor]# cp harbor.yml.tmpl harbor.yml [rootharbor harbor]# vim harbor.yml hostname: reg.timinglee.org certificate: /data/certs/timinglee.org.crt private_key: /data/certs/timinglee.org.key harbor_admin_password: lee [rootharbor harbor]# ./install.sh --with-chartmuseum5. 验证Harbor仓库可用性[rootharbor harbor]# mkdir /etc/docker/certs.d/reg.timinglee.org/ -p [rootharbor harbor]# cp /data/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt [rootharbor harbor]# vim /etc/hosts 172.25.254.200 harbor reg.timinglee.org [rootharbor harbor]# systemctl restart docker [rootharbor harbor]# docker compose up -d [rootharbor harbor]# docker login reg.timinglee.org -u admin Password: Login Succeeded四、Kubernetes集群部署1. 安装cri-dockerd所有主机# 方式一RPM包部署 [rootmaster ~]# rpm -ivh cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm vim /lib/systemd/system/cri-docker.service ExecStart/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugincni --pod-infra-container-imagereg.timinglee.org/k8s/pause:3.10.1 方式二二进制包部署 [rootdocker-node1 ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.4/cri-dockerd-0.4.4.amd64.tgz [rootdocker-node1 ~]# tar zxf cri-dockerd-0.4.4.amd64.tgz [rootdocker-node1 cri-dockerd]# install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd [rootdocker-node1 cri-dockerd]# cp cri-docker.s* /lib/systemd/system [rootdocker-node1 cri-dockerd]# vim /lib/systemd/system/cri-docker.service [Service] Typenotify ExecStart/usr/local/bin/cri-dockerd --network-plugincni --pod-infra-container-imagereg.timinglee.org/k8s/pause:3.10.1 --container-runtime-endpoint fd:// ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways [rootdocker-node1 cri-dockerd]# systemctl daemon-reload [rootdocker-node1 cri-dockerd]# systemctl enable --now cri-docker.service2. 安装Kubernetes集群所需软件# master节点 dnf install kubelet kubeadm kubectl -y systemctl enable --now kubelet.service node节点 dnf install kubelet kubeadm -y systemctl enable --now kubelet.service master节点中 kubectl 和kubeadm 补齐 [rootmaster ~]# echo source (kubectl completion bash) ~/.bashrc [rootmaster ~]# echo source (kubeadm completion bash) ~/.bashrc [rootmaster ~]# source ~/.bashrc3. 下载Kubernetes集群所需镜像并上传到Harbor# 查看所需镜像列表 [rootk8s-master ~]# kubeadm config images list registry.k8s.io/kube-apiserver:v1.35.7 registry.k8s.io/kube-controller-manager:v1.35.7 registry.k8s.io/kube-scheduler:v1.35.7 registry.k8s.io/kube-proxy:v1.35.7 registry.k8s.io/coredns/coredns:v1.13.1 registry.k8s.io/pause:3.10.1 registry.k8s.io/etcd:3.6.6-0 从阿里云镜像源拉取 [rootmaster ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.35.7 --cri-socketunix:///var/run/cri-dockerd.sock 上传镜像到本地harbor [rootmaster ~]# docker login reg.timinglee.org -u admin [rootmaster ~]# docker images --format {{.Repository}}:{{.Tag}} | awk -F / /google/{system(docker tag $0 reg.timinglee.org/k8s/$3)} [rootmaster ~]# docker images --format {{.Repository}}:{{.Tag}} | awk -F / /timinglee/{system(docker push $0)}4. 在Master中初始化Kubernetes集群[rootmaster ~]# kubeadm init --pod-network-cidr10.244.0.0/16 \ --image-repository reg.timinglee.org/k8s \ --kubernetes-version v1.35.7 \ --cri-socketunix:///var/run/cri-dockerd.sock 初始化成功后其他主机加入本集群的凭证 kubeadm join 172.25.254.100:6443 --token tdwjoc.8d1yw3wl4r4tm6c4 --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927 如果忘记join命令 [rootmaster ~]# kubeadm token create --print-join-command 如果初始化出问题可以重置集群设定 [rootmaster ~]# kubeadm reset --cri-socketunix:///var/run/cri-dockerd.sock 添加kubernets环境变量到本机 [rootmaster ~]# echo export KUBECONFIG/etc/kubernetes/admin.conf ~/.bash_profile [rootmaster ~]# source ~/.bash_profile [rootmaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane 102s v1.35.35. 添加Node节点到集群[rootnode1 ~]# kubeadm join 172.25.254.100:6443 --token jl4ztx.cax3iysvu7onsh5s --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927 --cri-socketunix:///var/run/cri-dockerd.sock 测试 [rootmaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane 5m16s v1.35.3 node1 NotReady none 66s v1.35.3 node2 NotReady none 58s v1.35.36. 安装Flannel网络插件[rootk8s-master ~]# tar zxf kube-flannel-v0.28.9.tar.gz [rootk8s-master ~]# cd flannel/ [rootk8s-master flannel]# docker load -i kube-flannel-v0.28.9.tar 上传flannel镜像到本地harbor [rootmaster ~]# docker tag ghcr.io/flannel-io/flannel-cni-plugin:v1.9.0-flannel1 reg.timinglee.org/flannel-io/flannel-cni-plugin:v1.9.0-flannel1 [rootmaster ~]# docker push reg.timinglee.org/flannel-io/flannel-cni-plugin:v1.9.0-flannel1 [rootmaster ~]# docker tag ghcr.io/flannel-io/flannel:v0.28.1 reg.timinglee.org/flannel-io/flannel:v0.28.1 [rootmaster ~]# docker push reg.timinglee.org/flannel-io/flannel:v0.28.1 修改kube-flannel.yml中的镜像地址为本地harbor [rootmaster ~]# vim kube-flannel.yml image: flannel-io/flannel:v0.28.1 image: flannel-io/flannel-cni-plugin:v1.9.0-flannel1 [rootmaster ~]# kubectl apply -f kube-flannel.yml 测试 [rootmaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane 13m v1.35.3 node1 Ready none 9m44s v1.35.3 node2 Ready none 9m36s v1.35.3五、个人部署实战心得1. 集群稳定的核心是环境统一所有节点系统版本、内核版本、kube组件版本必须一致否则极易出现节点离线、Pod调度异常问题2. 网络是K8s的重中之重90%的集群故障都来自CNI网络插件异常、端口未放行、swap未关闭部署前期一定要做好环境预检3. 生产环境优先kubeadm不要为了追求底层原理用二进制部署生产集群维护成本极高学习阶段一定要手动搭一次二进制集群彻底理解组件运行逻辑4. 证书和etcd是集群命脉所有集群故障、集群迁移、版本升级核心都围绕etcd数据和证书生产环境必须定期备份etcd数据。
返回列表