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

资讯详情

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

K8s集群部署的方法原理

K8s集群部署的方法原理 前言Kubernetes简称 K8s是容器编排平台负责管理容器化应用的部署、扩缩容、故障自愈。搭建 K8s 集群是学习云原生的基础不同部署方式底层原理一致但操作复杂度、适用场景差异很大本文梳理主流部署方式同时讲解底层核心原理。一、K8s 集群核心组件原理K8s 集群分为控制平面Master和工作节点Node集群所有能力都由各个组件协同完成。1.控制平面管理整个集群kube‑apiserver集群唯一入口所有操作都走它提供 REST API校验请求把数据存入 etcd。截图点kubectl get cs查看控制平面组件状态etcd键值数据库保存集群全部配置、状态数据是集群的 “记忆”必须做好备份。kube‑controller‑manager各类控制器监控资源状态发现实际状态和期望状态不一致就自动调谐比如节点掉线回收 Pod。kube‑scheduler调度器接收新建 Pod筛选合适的 Node 节点把 Pod 分配到节点上。2.工作节点 Node跑业务容器kubelet每个节点的代理跟 apiserver 通信管理本机 Pod保证 Pod 正常运行。截图点kubectl get nodes查看节点就绪状态kube‑proxy网络代理维护节点网络规则实现 Service 访问、负载均衡。容器运行时如 containerd、docker真正负责拉镜像、启动容器。二、主流 K8s 集群部署方式对比与原理1.kubeadm原理kubeadm 只是部署工具它不会直接安装所有二进制而是通过容器化方式部署控制平面组件自动生成证书、配置 etcd、初始化集群生成 join 命令让工作节点加入集群。2.minikube原理封装虚拟机 / 容器在单机上跑一套完整 K8s所有组件全部跑在一个实例中只有单节点集群不能做多节点集群。 适合本地练手不用于生产。3.k3s原理裁剪原版 K8s把多个组件合并为单个二进制内置 containerd简化证书降低资源消耗。适合树莓派、边缘服务器。 一条命令即可完成集群初始化节点加入简单。4. 二进制部署原理手动下载所有组件二进制文件手动生成 SSL 证书手动编写 systemd 服务文件启动每个组件手动搭建 etcd 集群手动配置 kube‑config。三、部署共性原理无论哪种部署方式底层必须完成几件事生成 SSL 证书集群内部组件之间通信全部 TLS 加密没有证书组件之间无法通信。etcd 存储集群数据。apiserver 对外提供 API 接口。每个节点部署 kubelet、kube‑proxy、容器运行时。部署 CNI 网络插件实现 Pod 之间跨节点网络互通。kube‑config 配置文件保存访问集群的认证信息kubectl 依靠它连接 apiserver。四、K8s 集群部署实战Docker cri‑dockerd实验环境规划主机名IP 地址角色harbor-server192.168.100.200Harbor 私有镜像仓库主机k8s‑master01192.168.100.10K8s 控制平面 Master 节点k8s‑worker01192.168.100.11Worker 工作节点k8s‑worker02192.168.100.12Worker 工作节点4.1.1 构建 Harbor 私有镜像仓库# 安装httpd与rpm仓库生成工具 dnf install httpd createrepo -y # 创建仓库存放目录 mkdir /var/www/html/docker/ -p # 修改httpd监听端口为4444 sed -i s/^Listen 80/Listen 4444/ /etc/httpd/conf/httpd.conf # 启动开机自启httpd服务 systemctl enable --now httpd # 下载docker-ce安装包到本地 dnf install docker-ce --downloadonly --destdir /mnt/ -y # 将rpm包移动到http发布目录 mv /mnt/*.rpm /var/www/html/docker/ # 生成yum仓库元数据 createrepo -v /var/www/html/docker/4.1.2 配置本地 docker 软件源cat /etc/yum.repos.d/docker.repo EOF [docker] name docker local repo baseurl http://192.168.100.200:4444/docker gpgcheck 0 EOF # 安装docker-ce dnf install docker-ce -y4.1.3 生成 Harbor 自签名 TLS 证书mkdir /data/certs -p openssl req -newkey rsa:4096 \ -nodes -sha256 -keyout /data/certs/myharbor.key \ -x509 -days 3650 -out /data/certs/myharbor.crt \ -subj /CNharbor.local \ -addext subjectAltNameDNS:harbor.local,IP:192.168.100.2004.1.4 修改 harbor 配置并启动 harbormkdir -p /data/harbor # 解压harbor离线包到/data/harbor修改harbor.yml vim /data/harbor/harbor.yml4.1.5 Docker 信任私有仓库证书mkdir /etc/docker/certs.d/harbor.local/ -p cp /data/certs/myharbor.crt /etc/docker/certs.d/harbor.local/ca.crt # 配置hosts解析 vim /etc/hosts # 添加内容 192.168.100.200 harbor-server harbor.local systemctl restart docker # 登录harbor仓库默认账号admin docker login harbor.local -u admin4.2 K8s 集群所有节点基础环境准备4.2.1 彻底关闭 swapsystemctl disable --now swap.target systemctl mask swap.target sed /swap/s/^/#/g -i /etc/fstab4.2.2 分发 harbor 证书、安装 docker、配置 daemon.jsonfor i in 10 11 12 do ssh root192.168.100.$i mkdir -p /etc/docker/certs.d/harbor.local/ scp /data/certs/myharbor.crt root192.168.100.$i:/etc/docker/certs.d/harbor.local/ca.crt done三台 k8s 节点执行systemctl enable docker systemctl restart docker cat /etc/docker/daemon.json EOF { registry-mirrors:[https://harbor.local] } EOF systemctl restart docker4.2.3 配置所有节点 hosts 解析vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.100.10 k8s-master01 192.168.100.11 k8s-worker01 192.168.100.12 k8s-worker02 192.168.100.200 harbor.local4.3 部署 Kubernetes 集群4.3.1 安装 cri‑dockerdwget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.4/cri-dockerd-0.4.4.amd64.tgz tar zxf cri-dockerd-0.4.4.amd64.tgz cd cri-dockerd cp cri-dockerd /usr/bin/ # 复制systemd unit文件到系统服务目录 cp packaging/systemd/* /lib/systemd/system/4.3.2 修改 cri‑dockerd systemd 服务配置vim /lib/systemd/system/cri-docker.service4.3.3 Master 节点拉取集群镜像并推送到私有 Harbor仅 k8s‑master01# 安装kubeadm kubelet kubectl dnf install -y kubelet kubeadm kubectl systemctl enable --now kubelet # 拉取k8s组件镜像 kubeadm config images pull \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.30.0 \ --cri-socketunix:///var/run/cri-dockerd.sock # 打标签推送到本地harbor仓库 docker images --format {{.Repository}}:{{.Tag}} | grep google_containers | while read img do tagName$(echo $img | awk -F / {print $2}) docker tag $img harbor.local/k8s/$tagName docker push harbor.local/k8s/$tagName done4.3.4 kubeadm 初始化集群仅 k8s‑master01kubeadm init --pod-network-cidr10.244.0.0/16 \ --image-repository harbor.local/k8s \ --kubernetes-version v1.30.0 \ --cri-socketunix:///var/run/cri-dockerd.sock # 配置kubectl环境变量 echo export KUBECONFIG/etc/kubernetes/admin.conf ~/.bash_profile source ~/.bash_profile # 此时节点状态NotReady尚未部署CNI网络插件 kubectl get node4.3.5 部署 Flannel 网络插件仅 masterwget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml # 拉取flannel镜像上传私有harbor docker pull docker.io/flannel/flannel:v0.25.5 docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1 docker tag flannel/flannel:v0.25.5 harbor.local/flannel/flannel:v0.25.5 docker push harbor.local/flannel/flannel:v0.25.5 docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 harbor.local/flannel/flannel-cni-plugin:v1.5.1-flannel1 docker push harbor.local/flannel/flannel-cni-plugin:v1.5.1-flannel14.3.6 Worker 节点加入集群# worker节点执行join kubeadm join 192.168.100.10:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ --cri-socketunix:///var/run/cri-dockerd.sock4.4 集群功能验证master 节点# 创建测试pod kubectl run demo-nginx --image nginx kubectl get pods # 测试pod访问 kubectl exec -it demo-nginx -- curl 127.0.0.1 # 删除测试pod kubectl delete pod demo-nginx五、个人总结K8s1.24 彻底移除 dockershimDocker 不能直接作为 CRI 运行时必须借助cri‑dockerd中间层做适配自建 Harbor 私有仓库实验环境可以把所有 k8s 组件镜像、flannel 镜像全部缓存本地避免外网拉取镜像慢或者失败swap 必须关闭swap 开启会导致 kubelet 调度异常节点 NotReadykubeadm 初始化完成后 master 节点默认 NotReady必须部署 CNI 网络插件 Flannel/Calico节点才会进入 Ready 状态worker 节点 join 时必须指定--cri‑socket指定 cri‑dockerd 套接字否则 kubeadm 默认去找 containerd 套接字会加入失败。
返回列表