知识点8---虚拟化编排工具Kubernetes

张开发
2026/4/21 20:12:32 15 分钟阅读

分享文章

知识点8---虚拟化编排工具Kubernetes
本篇知识点开始为各位读者介绍本系列知识点最后一个大内容Kubernetes业内简称K8s从能力上来讲它其实是一个虚拟化编排工具无论是容器还是虚拟机都可以编排但由于业内使用习惯出于成本和法律风险原因常常配合Docker使用成本指容器比虚拟机使用更经济更容易超卖法律风险指基于源码二次开发容易处理不当相比之下docker用的Apache 2.0开源协议是可操作性最高的而反观kvm他用的是GPL协议该协议要求软件发布时如果原GPL协议源码不可被分离则整个项目都必须免费开源否则许可失效原先对此作出的修改开发都被视为著作权侵权先不说像国内容器编排常见的容器直连插件这种比较底层的更改就成果商用这一项就毕了因此由于常见就是配合docker所以k8s也被称为容器编排工具。不过各位读者可以看两篇文献https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation、https://kubernetes.io/blog/2022/02/17/dockershim-faq/就可以发现k8s在1.20开始声明不再默认支持docker并在 1.24 删除了兼容docker的核心模块 dockershim 不过有个叫 cri-dockerd 的社区版插件可以代替原来的官方代码让 k8s 继续兼容docker这个插件是社区和 docker 官方合作的将原来的 dockershim 维护在外部从而更加倾向于标准CRI接口。k8s官方自身开始支持containerd等更加符合CRI标准的运行时。就国内而言基本还是k8s docker的组合即使需要安装社区插件本质原因大家懂的都懂1.24以后才彻底删除支持在此之前体系已经很成熟各大厂商基于源码开发了很多扩展的东西真要迁移成本很大了要各位读者自己坐在决策位置上你也不敢那自己的前途去押宝因此本系列知识点同样基于docker部署。其实 docker 它底层也是containerdk8s 弃用的也只是作为中间商的 docker 应用层商用环境稳健大于性能因此普遍不激进的更近变动而已使用插件维持现状容器编排工具也不是一上来就是K8s它也经历了一系列的演化流程。前面介绍的Docker除了它本身它的生态圈中还有 Compose、Swarm、Machine。在介绍私有化部署时顺带介绍了Compose其他两个由于现在主流都是用K8s所有本系列知识点不涉及有兴趣的可以看看其他资料。本文只串联一次容器编排工具的发展史最开始是docker-machine主要用于准备docker host(Docker主机)简单易用但功能有限是早期的Docker引擎管理工具2021年开始已弃用官方建议使用docker desktop(一个收费软件)替代。docker-compose和docker-machine是同时期的产物通过单一命令即可创建并启动单节点上单一完整服务的容器编排工具仅适用于单机环境无法管理多主机集群因其核心的、不可替代的本地编排价值一直活跃至今。docker-swarm和前面两个是同时期产品也就是2014年当时并称运维三剑客它的作用是把多个 Docker 主机“伪装”成一个巨大的虚拟 Docker 主机采用声明式服务模型通过YAML文件定义应用状态服务规模可扩大可缩小保持期望状态支持服务发现、负载均衡、滚动更新等Swarm 在2016-2017年间和 Kubernetes 激烈竞争2017年Docker 公司在自己企业版里内置了 Kubernetes标志着“编排之争”落下帷幕。不过 Swarm 依然活着也有市场占比但是非常小现在作为 Docker 内置的集群功能适合中小规模、追求简单易用的场景。K8s全球75%企业采用无替代方案。比Docker Swarm和Kubernetes还要早的是Apache Mesos Marathon编排框架它兼容Hadoop、Kafka、Spark等大数据框架但是系统复杂学习困难使用独立API接口2019年被Twitter弃用Kubernetes采用有中心节点的分布式架构管理节点Master和工作节点Worker/Node管理节点接收并处理所有用户请求、管理集群状态和调度决策、确保应用高可用自动处理节点故障工作节点实际运行容器化应用、接收并执行Master节点指令、上报节点状态和资源使用情况管理节点有四个核心组件组件本身可运行在任意节点但通常集中部署在一台主机上且不运行用户容器各组件通过etcd共享数据形成完整的管理体系kube-apiserver集群出入口所有资源请求/操作都通过其提供的接口进行类似OpenStack中的CON storm组件kube-controller-manager管理集群中的控制器后台线程相当于企业中的总经理管理各小组长kube-scheduler监控未调度的Pod请求为Pod选择运行节点etcd集群默认存储系统保存所有集群数据API数据、调度数据等工作节点的核心组件有三个kubelet管理Pod生命周期创建/销毁pod负责存储卷和网络管理kube-proxy通过维护iptables/ipvs规则实现service访问解决pod IP变化问题开源版本下建议通过service而非直接访问pod IPcontainer runtime支持docker/containerd/Rkt等多种运行时负责镜像管理和容器实际运行除此之外Kubernetes还有增强集群功能的附件非必需但能丰富使用体验CoreDNS/kube-dns为集群提供DNS服务关键服务Ingress Controller提供集群外部访问入口突破铜墙铁壁Heapster/Metrics-server集群资源监控可配合Prometheus使用Dashboard提供GUI管理界面Fluentd-elasticsearch集群日志采集存储方案Kubernetes提供了四种方式本地化部署方式。至于公有云部署方式那就多了像阿里云ACK、华为云CCE、腾讯云EKS这种就是买服务了运维主力不需要用户太多的操心1、kubeadm Kubernetes官方支持的工具提供创建集群的快速路径最佳实践只关注集群引导(bootstrapping)不关心机器配置不包含插件安装(如仪表盘、监控方案等)可部署最小化可行性集群(包含master和worker节点)适合测试/学习环境也可用于生产环境初始化速度快(约1分钟)节点加入仅需十几秒。官方文档https://kubernetes.io/docs/reference/setup-tools/kubeadm/2、minikube :官方推荐的本地单节点集群部署工具功能有限不适合复杂场景仅用于测试/学习目的不支持生产环境使用可快速部署(单主机)且跨平台支持(Linux/Mac/Windows)3、二进制部署方式纯手动部署准备工作多但维护和故障排查简单资源占用少(APIServer等组件占用系统资源少)适合生产环境4、国内第三方部署工具RKE(基于Docker的快速部署工具通过配置文件快速完成集群部署支持节点动态添加/删除)、KubeKey(基于Go语言开发底层使用kubeadm并行安装支持在线或离线高可用集群一键部署)Kubeasz(基于二进制方式Ansible实现自动化支持分步安装组件提供集群管理功能(备份恢复等))通常最基本的具备kubeadm 、二进制部署这两种方式就可以了其他的要是还有精力就当扩展去了解即可。本文下面使用 kubeadm 带各位读者部署一套学习以及未来测试环境用的K8s集群本次测试集群使用CentOS 7系统共三台节点采用1个master节点2个worker节点的部署方案注意后续自己部署时每台主机的主机名必须唯一且不同master节点CPU4核最低不能低于2核内存8GB建议不低于3-4GB硬盘50GB主机名master01worker节点配置CPU4核内存8GB硬盘50GB主机名worker01和worker02第一步部署环境准备首先所有主机的IP配置与实际使用的网段一致比如使用VMware虚拟机保持NAT或者桥接的策略即可不要在服务器上自己自定义子网配置文件/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTOnone或BOOTPROTOstatic禁用DHCPIPADDR192.168.239.70设置静态IPPREFIX24等同于255.255.255.0GATEWAY192.168.239.2默认网关DNS1114.114.114.114DNS服务器ONBOOTyes开机自动启用网卡所有集群主机均需添加主机名与IP地址的映射关系配置文件/etc/hosts192.168.239.70 master01.k8s.com192.168.239.71 worker01.k8s.com192.168.239.72 worker02.k8s.com所有主机关闭防火墙配置服务执行如下命令停止服务systemctl stop firewalld 禁用自启systemctl disable firewalld所有主机关闭SELinux/etc/selinux/config# 设置为禁用SELINUXdisabled#或者执行非交互式命令sed-ris/SELINUXenforcing/SELINUXdisabled//etc/selinux/config所有主机时间需要同步 -》https://blog.csdn.net/dudadudadd/article/details/110947177或者最小化安装 ntpdate同步阿里云yuminstallntpdate ntpdate time1.aliyun.com# 后续同步使用 crontab -ecrontab-e0* * * * /usr/sbin/ntpdate time1.aliyun.com# 或者你有自己的批量执行命令脚本(crontab-l2/dev/null;echo0 * * * * /usr/sbin/ntpdate time1.aliyun.com)|crontab-# 也可以批量删除crontab-l|grep-vtime1.aliyun.com|crontab-所有主机升级系统内核K8s有很多插件需要的内核版本比较高并且新内核的一些软件旧内核可能没有# 首先看一下当前内核centos 7 默认内核是3.xuname-r24年底所有的在线 os7系统可用源基本都关了因此不能在线安装只能手动编译内核目前能下载到的只有清华源所以去下载源码包编译下载个差不多的就行本文用5.6.15 https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.6.15.tar.gz# 安装编译依赖yum groupinstall-yDevelopment Toolsyuminstall-yncurses-devel bison flex elfutils-libelf-devel openssl-devel\bcrpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed\pesign xmlto audit-libs-devel binutils-devel elfutils-devel\newt-devel numactl-devel pciutils-devel python-devel zlib-devel\gcc gcc-cmakeperl diffutils gettext# 编译并安装tar-zxflinux-5.6.15.tar.gzcdlinux-5.6.15# 开始编译会出现巨多的选项这些是内核微调选项按住回车别松手一路默认直到出现 gcc 开始编译的日志make-j$(nproc)# 编译完成先安装内核模块makemodules_install# 再安装内核makeinstall所有主机设置GRUB引导从而设置新安装内核为默认启动项# 查看当前有启动项awk-F\$1menuentry {print i : $2}/boot/grub2/grub.cfg# 预期安装上面的内核后它应当在第一个所以设置默认启动第 0 位的内核grub2-set-default0# 重新生成内核引导配置文件必须重新生成grub2-mkconfig-o/boot/grub2/grub.cfg重启所有节点reboot# 重启后确定内核版本uname-r# 对于旧的内核比如自带的3.x可以直接删掉了[rootmaster01 ~]# rpm -qa | grep kernelkernel-3.10.0-1160.71.1.el7.x86_64 kernel-debug-devel-3.10.0-1160.119.1.el7.x86_64 kernel-tools-3.10.0-1160.71.1.el7.x86_64 kernel-3.10.0-1160.119.1.el7.x86_64 kernel-tools-libs-3.10.0-1160.71.1.el7.x86_64 kernel-headers-3.10.0-1160.119.1.el7.x86_64#删除后刷新启动项grub2-mkconfig-o/boot/grub2/grub.cfg# 如果你未来要更新这个手动编译升级的内核先去更新你的新内核旧内核需要手动删除如下的文件列表rm-f/boot/vmlinuz-5.6.15rm-f/boot/initramfs-5.6.15.imgrm-f/boot/System.map-5.6.15rm-rf/lib/modules/5.6.15所有节点修改系统配置文件让系统自身拥有转发能力和网桥过滤就和前面知识点KVM同一个操作只不过多了个网桥流量进入防火墙过滤。按照官方建议新建/etc/sysctl.d/k8s.conf文件写入如下配置。和直接修改/etc/sysctl.conf的区别在于/etc/sysctl.conf是传统的配置方式不过同配置项它的优先级最低且不方便管理#让原本在OSI模型第二层数据链路层的网桥数据也进入第三层网络层的防火墙net.bridge.bridge-nf-call-ip6tables1net.bridge.bridge-nf-call-iptables1#启用IPv4转发net.ipv4.ip_forward1#禁用swap分区vm.swappiness0网桥过滤需要加载一个模块所有主机执行后加入持久化# 加载模块这个 -- 可以不写他是因为有些模块名称里面有 - 所以 -- 是modprobe 命令的一个参数告诉它参数的识别方式modprobe -- br_netfilter# 查看结果lsmod|grepbr_netfilter# 生成配置文件持久化echobr_netfilter|tee/etc/modules-load.d/k8s.conf随后刷新内核配置sysctl-p/etc/sysctl.d/k8s.conf所有主机安装ipset及ipvsadmIPSET是一个IP地址集合工具用来优化防火墙配置时的IP列表可能很多或者很长的问题IPVS是内核级别的服务代理功能你可以理解为它是一个内核自带的Nginx但它比Nginx强大很多K8s使用它来完成内部转发这类防火墙功能安装ipvsadm工具主要用于通过命令行查看和管理IPVS功能yum-yinstallipset ipvsadm随后开始配置IPVS首先创建/etc/sysconfig/modules/ipvs.modules文件用来系统启动时自动调用加载IPVS需要的模块它本质是一个脚本所以不放在/etc/modules-load.d下面cat/etc/sysconfig/modules/ipvs.modulesEOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOFip_vs基础模块ip_vs_rr轮询算法模块ip_vs_wrr加权轮询算法模块ip_vs_sh哈希算法模块nf_conntrack连接跟踪模块第一次先手动执行一次chmod755/etc/sysconfig/modules/ipvs.modulesbash/etc/sysconfig/modules/ipvs.modules lsmod|grep-eip_vs-enf_conntrack现在检查所有节点是否有交换分区如果有官方建议关掉# 临时工关闭swapoff-a# 注释 /etc/fstab 文件中的Swap分区即可后续也不再启用再次重启所有节点reboot# 验证内核版本uname-r# 验证模块lsmod|grep-eip_vs-enf_conntrack-ebr_netfilter# 验证内核参数sysctl-a|grep-enet.bridge.bridge-nf-call-enet.ipv4.ip_forward-evm.swappiness所有节点 SSH 互信 -》https://blog.csdn.net/dudadudadd/article/details/117816179同时取消SSH显示输入yes -》https://blog.csdn.net/dudadudadd/article/details/117899463到此 K8s 的安装前置准备完成第二步所有节点部署 docker -》https://blog.csdn.net/dudadudadd/article/details/158845838务必确保docker使用20.10版本本文使用26.1.4。由于要和 k8s 一起使用需要在配置文件下添加一行vi/etc/docker/daemon.json 追加exec-opts:[native.cgroupdriversystemd]systemctl daemon-reload systemctl restartdocker第三步所有节点安装 cri-dockerd 接口服务。先在master01上安装其他节点同步文件就行# 先确定系统是那个架构本文部署环境是 x86_64uname-m# 随后去下载 0.3.7 的注意不要下错架构x86 下载amd的就行https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.7/cri-dockerd-0.3.7.amd64.tgz# 它就是一条二进制命令解压后放入系统 bin 路径下tar-zxfcri-dockerd-0.3.7.amd64.tgzmvcri-dockerd/cri-dockerd /usr/local/bin/chmodx /usr/local/bin/cri-dockerd cri-dockerd--version创建 systemd 服务文件让系统能识别到 cri-dockerd 服务文件内容不用改直接复制即可vi/etc/systemd/system/cri-dockerd.service[Unit]DescriptionCRI InterfaceforDocker Application Container EngineDocumentationhttps://docs.mirantis.comAfternetwork-online.target firewalld.service docker.serviceWantsnetwork-online.target[Service]TypenotifyExecStart/usr/local/bin/cri-dockerd --pod-infra-container-imageregistry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 --network-plugincni --cni-conf-dir/etc/cni/net.d --cni-bin-dir/opt/cni/bin --container-runtime-endpointunix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory/var/lib/dockershim --docker-endpointunix:///var/run/docker.sock --cri-dockerd-root-directory/var/lib/dockerExecReload/bin/kill-sHUP$MAINPIDTimeoutSec0RestartSec2RestartalwaysStartLimitBurst3StartLimitInterval60sLimitNOFILEinfinityLimitNPROCinfinityLimitCOREinfinityTasksMaxinfinityDelegateyesKillModeprocess[Install]WantedBymulti-user.targetvi/etc/systemd/system/cri-dockerd.socket[Unit]DescriptionCRI Docker Socketforthe APIPartOfcri-docker.service[Socket]ListenStream/var/run/cri-dockerd.sockSocketMode0660SocketUserrootSocketGroupdocker[Install]WantedBysockets.target启动服务。服务启动没有问题则另外两台节点同步二进制命令和配置启动服务即可systemctl daemon-reload systemctl start cri-dockerd systemctl status cri-dockerd systemctlenablecri-dockerd.service第四步现在开始正式安装 k8s 。先去github上看好你自己要安装的 k8s 版本https://github.com/kubernetes/kubernetes/releases一定要是 1.24 的本文安装1.28.0。在未来无论工作还是自己使用尽量不要选择 1.20 - 1.24 之间的版本要不你就去安装低版本默认支持docker要不就安装新版配合插件所有节点准备k8s的国内镜像yum一般是阿里云新建/etc/yum.repos.d/kubernetes.repo文件[kubernetes]nameKubernetesbaseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/gpgcheck0gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgenabled1刷新yum正常会出现 kubernetes 仓库yum clean all yum makecache yum repolist开始安装 k8s 服务先查询yum中是否有你需要的版本和文本同版本就不用看了已经确定有了yum--showduplicateslist kubeadm|grep1.28.0随后 master01 节点上安装核心服务yuminstall-ykubelet-1.28.0-0 kubeadm-1.28.0-0 kubectl-1.28.0-0另外两台节点上安装除客户端外的核心服务yuminstall-ykubelet-1.28.0-0 kubeadm-1.28.0-0安装完成后所有节点修改配置文件/etc/sysconfig/kubelet禁用 k8s 对交换分区的检查因为上面已经关了没必要再让它执行。以及指定 cri-dockerd 服务数据路径和启动方式(和docker统一)KUBELET_EXTRA_ARGS--fail-swap-onfalse --container-runtime-endpointunix:///var/run/cri-dockerd.sock --cgroup-driversystemd确保 k8s 和 docker 是开启自启的systemctlenablekubeletdocker第五步在主节点 master01.k8s.com 上操作集群主节点的初始化kubeadm init --kubernetes-versionv1.28.0 --pod-network-cidr10.10.0.0/16 --service-cidr10.11.0.0/16 --ignore-preflight-errorsSwap,SystemVerification --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock --apiserver-advertise-address192.168.10.11init的参数都可以通过–help查帮助--kubernetes-version指定安装版本如果不指定默认stable-1--pod-network-cidr设置pod网络的ip地址范围你自己用的话随便选一个就行就和docker内部容器的ip一样的意思但是切记不要和宿主机网段冲突因为单跑docker可以自定义网络策略并且桥接继承宿主机的网卡但是k8s不能这样用它有一套自己独有的网络模式而且其本身也会生成几张特有的网卡如果占了宿主机的网络策略会造成冲突的。并且你这里设置的pod网络策略往后所有加入的worker节点都会使用该策略。注意该配置很多地方你会看到写的都是 10.244.0.0/16 这是因为有一个必备 k8s 插件存在有些许狗血的默认配置大部分人偷懒就不改了但是工作中普遍要变--service-cidrService的ip和pod网络一样的情况所以也选一个没被占用的虽然service本质上也是一个附件类pod但是它的不融于pod体系反而起到代理的作用所以需要一个独立的网段--ignore-preflight-errors是忽略某些警告--image-repository设置镜像下载的远程仓库一定要设置成阿里云当然你要是有自己的 harbor 服务也可以用自己的。不过使用感官上25年以后这个配置意义不大你可以理解为它是一个兜底的仓库但是能不能或者说用不用另说--cri-socket是设置使用那个CRI接口因为1.24以后不默认支持docker所以会去查询系统上有的CIR如果不指定会识别到 cri-dockerd 和 containerd 两个--apiserver-advertise-address设置API Server的通信地址通常不带默认就是主节点自身还可以改端口号不过一般也默认这里要特别说明SystemVerification警告的忽略不同的发行版可能会有一个模块叫做config但这个模块不属于标准内核的范围所以上面编译的5.6.15并没有因此需要忽略它的警告初始化需要一点时间最后会输出如下的信息表示初始化成功。最后一行的信息一定要保存下来后面worker节点加入要用各位读者最好和这里一样将成功提示开始的后面所有信息单独保存一份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/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config Alternatively,ifyou are the root user, you can run:exportKUBECONFIG/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Runkubectl apply -f [podnetwork].yamlwith one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you canjoinany number of worker nodes by running the following on each as root: kubeadmjoin192.168.239.70:6443--tokenu03dy1.4zo5d3q11ifs4thq\--discovery-token-ca-cert-hash sha256:1ce08a2e73685fa117b67a7452ff7ec196c499d463a6ea6e57d1e30747ec73f6后续使用要知道几个关键路径k8s内部也有自己生成的证书存储在/etc/kubernetes/pki目录所有集群配置文件存储在/etc/kubernetes目录下静态Pod也就是调度组件、Service暴露组件等等在/etc/kubernetes/manifests此时按照输出的日志已经告诉了你下一步该做什么To start using your cluster, you need to run the following as a regular user就是用一个普通的用户执行三条命令在项目上使用的话就需要严格执行个人自己的虚拟机上使用直接用root用户把上面的环境变量加载到你的用户级别PATH里。总之上面三条命令的最终目的就是让一个日后负责k8s的运维人员执行k8s命令的时候有证书文件而已因为一般不可能拿到root# 准备一个普通用户useraddk8sadminpasswdk8sadmin# 在root用户身份下该配置文件给上面的普通用户 sudo 权限visudo#追加一行你自己的环境可以写所有命令都允许且无需密码k8sadminALL(ALL)NOPASSWD: ALL# 工作中要限制k8sadminALL(ALL)ALL# 或者 只允许执行某些命令k8sadminALL(ALL)/usr/bin/systemctl, /bin/rm# 切换到该用户下执行命令suk8sadminmkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config现在查看集群服务状态[k8sadminmaster01 opt]$ kubectl get cs Warning: v1 ComponentStatus is deprecatedinv1.19 NAME STATUS MESSAGE ERROR controller-manager Healthy ok etcd-0 Healthy ok scheduler Healthy ok[k8sadminmaster01 opt]$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01.k8s.com NotReady control-plane 43m v1.28.0根据上面的输出你会发现各组件都已经处于健康状态但是看所有节点信息中主节点一直是未准备就绪这是因为 k8s 需要单独安装网络组件静态Pod该组件 k8s 官方一直用的是第三方组件本身不自带一般是Flannel。去git上找Flannel并安装-》https://github.com/flannel-io/flannel看Deploying flannel manually会告诉你如何安装官方仓库中已经告诉你如果你是1.17的版本你可以直接运行命令下载相应的镜像并安装刚好本篇中的版本够线。但是你要注意它下面的小字如果初始化集群时用的Pod网络策略不是10.244.0.0/16就要自己设置# 命令不要看官方仓库的因为国内访问不到官方的 helm 仓库# 需要手动创建命名空间kubectl create ns kube-flannel kubectl label--overwritens kube-flannel pod-security.kubernetes.io/enforceprivileged pod-security.kubernetes.io/warnprivileged pod-security.kubernetes.io/auditprivileged# 下载安装文件版本方面用稳定版就行本文用v0.25.6curl-L-okube-flannel.yml https://cdn.jsdelivr.net/gh/flannel-io/flannelv0.25.6/Documentation/kube-flannel.yml#随后修改下载的到文件搜索 Network: 10.244.0.0/16 换成你自己的sed-is|10.244.0.0/16|10.10.0.0/16|gkube-flannel.yml# 一下命令可以查看是否修改全了grep-A5-B5Networkkube-flannel.yml# 手动拉取镜像因为本文在同步验证文档部署时发现依靠k8s自己拉不下来# 具体的镜像名称看 kube-flannel.yml 中的 image 如果各位读者用的和本文版本一直直接执行命令就行dockerpull docker.io/flannel/flannel:v0.25.6dockerpull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2# 执行安装kubectl apply-fkube-flannel.yml# 如果中途遇到问题需要先删除然后从创建nc哪一步重头开始kubectl delete-fkube-flannel.yml# 部署需要一点时间你可以陆续查询关注状态[k8sadminmaster01 opt]$ kubectl get pods-nkube-flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-zvggr0/1 Init:0/2021s# 直到它变为 运行状态[k8sadminmaster01 opt]$ kubectl get pods-nkube-flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-d2nwc1/1 Running055s# 现在 再去看集群节点主节点就时 ready 状态了[k8sadminmaster01 opt]$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01.k8s.com Ready control-plane 135m v1.28.0到此主节点的安装部署就算完成了第六步所有 worker 节点使用上面初始化时日志给你的命令加入集群记得带上CRI接口选择参数kubeadmjoin192.168.239.70:6443--tokenu03dy1.4zo5d3q11ifs4thq --discovery-token-ca-cert-hash sha256:1ce08a2e73685fa117b67a7452ff7ec196c499d463a6ea6e57d1e30747ec73f6 --cri-socket unix:///var/run/cri-dockerd.sock --ignore-preflight-errorsSwap,SystemVerification加入后主节点查询node列表就可以看到了和master一样node节点在刚加入集群的时候也是notready需要等待一会它会从master同步flannel不需要你手动拉取镜像[k8sadminmaster01 opt]$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01.k8s.com Ready control-plane 153m v1.28.0 worker01.k8s.com NotReadynone108s v1.28.0 worker02.k8s.com NotReadynone94s v1.28.0[k8sadminmaster01 opt]$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01.k8s.com Ready control-plane 153m v1.28.0 worker01.k8s.com Readynone108s v1.28.0 worker02.k8s.com Readynone94s v1.28.0在master节点还可以查询到k8s系统pod情况[k8sadminmaster01 opt]$ kubectl get pods-nkube-system-owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-6554b8b87f-74frl1/1 Running0154m10.10.0.2 master01.k8s.comnonenonecoredns-6554b8b87f-974x91/1 Running0154m10.10.0.3 master01.k8s.comnonenoneetcd-master01.k8s.com1/1 Running0154m192.168.239.70 master01.k8s.comnonenonekube-apiserver-master01.k8s.com1/1 Running0154m192.168.239.70 master01.k8s.comnonenonekube-controller-manager-master01.k8s.com1/1 Running0154m192.168.239.70 master01.k8s.comnonenonekube-proxy-47l241/1 Running02m56s192.168.239.71 worker01.k8s.comnonenonekube-proxy-4g6421/1 Running0154m192.168.239.70 master01.k8s.comnonenonekube-proxy-8825q1/1 Running02m42s192.168.239.72 worker02.k8s.comnonenonekube-scheduler-master01.k8s.com1/1 Running0154m192.168.239.70 master01.k8s.comnonenone到此单主节点 k8s 集群就部署完成了后续如果各位读者需要使用低版本默认支持 docker 的 1.20 以下版本在部署方式上是一样的只需去掉 cri-dockerd 相关配置即可。版本方面本文实操测试 Docker 18.06.3 和 k8s 1.17.0 是没有问题可以直接使用的

更多文章