CentOS7。6系统主机3台,基于公网IP搭建1主2从的Kubernetes集群一、准备工作1。版本信息 Docker 20。10。21 Kubernetes 1。21。00 Flannel 0。20。22。集群角色规划 3台CentOS7。6主机,集群角色规划如下 Master Worker01 Worker02 公网IP 139。196。219。92 1。116。156。102 121。37。169。103 内网IP 172。21。253。164 10。0。4。15 192。168。0。89 服务器厂商 阿里云 腾讯云 华为云3。修改hosts文件 设置master主机的hostname为msudohostnamectlsethostnamem 分别设置2台worker主机的hostnamesudohostnamectlsethostnamew1sudohostnamectlsethostnamew2 分别修改3台主机的hosts文件,这里配置的是公网IP。因为云服务器厂商不同,无法搭建局域网K8s集群vimetchosts139。196。219。92m1。116。156。102w1121。37。169。103w24。创建虚拟网卡 3台主机分别填写对应的公网IP打开文件vimetcsysconfignetworkscriptsifcfgeth0:1填入内容NAMEeth0:1DEVICEeth0:1TYPEEthernetONBOOTyesBOOTPROTOstaticNETMASK255。255。255。0IPADDRpublicip重启网络systemctlrestartnetwork。service 创建虚拟网卡前,查看eth0〔rootw1networkscripts〕ipagrepeth02:eth0:BROADCAST,MULTICAST,UP,LOWERUPmtu1500qdiscmqstateUPgroupdefaultqlen1000inet10。0。4。1522brd10。0。7。255scopeglobaleth0 创建虚拟网卡后,查看eth0,可以发现多了一条记录eth0:1〔rootw1〕ipagrepeth02:eth0:BROADCAST,MULTICAST,UP,LOWERUPmtu1500qdiscmqstateUPgroupdefaultqlen1000inet10。0。4。1522brd10。0。7。255scopeglobaleth0inet1。116。156。10224brd1。116。156。255scopeglobaleth0:1 华为云主机通过上述方式添加虚拟网卡时失败,改为使用Tunctl安装虚拟网卡,参考这篇文章:CentOS7Tunctl安装虚拟网卡tom。ma的博客CSDN博客tunctl 但需要注意的是,需要将这篇文章中的tap0改为eth0:1,命名与其他主机保持一致5。云服务器安全组设置 搭建K8s集群需要对云服务器安全组入方向规则进行配置,开启相应的端口 master节点 协议 端口 作用 使用者 TCP 2379~2380 etcd客户端API kubeapiserver,etcd TCP 6443hrapiserverAPI 所有组件 UDP 8472hrVxLanOverlay网络通信 Flannel网络插件 TCP 10250hrkubeletAPI kubelet,ControlPlane组件 TCP 10251hrkubescheduler kubescheduler TCP 10252hrkubecontrollermanager kubecontrollermanager worker节点 协议 端口 作用 使用者 UDP 8472hrVxLanOverlay网络通信 Flannel网络插件 TCP 10250hrkubeletAPI kubelet,ControlPlane组件 TCP 3000032767 NodePort服务 所有组件 二、系统基础配置1。更新并安装依赖 准备好3台主机后,每台主机均需要更新并安装依赖sudoyumyupdatesudoyuminstallyconntrackipvsadmipsetjqsysstatcurliptableslibseccompsudoyuminstallyyumutils2。基础配置 关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld 关闭SELinux(SecurityEnhancedLinux)setenforce0sedisSELINUXenforcingSELINUXpermissiveetcselinuxconfig 关闭swapswapoffasediswaps(。)1getcfstab 配置iptables的ACCEPT规则iptablesFiptablesXiptablesFtnatiptablesXtnatiptablesPFORWARDACCEPT 设置系统参数catEOFetcsysctl。dk8s。confnet。bridge。bridgenfcallip6tables1net。bridge。bridgenfcalliptables1EOFsysctlsystem 三、安装Docker1。配置阿里云镜像源sudoyumconfigmanageraddrepohttp:mirrors。aliyun。comdockercelinuxcentosdockerce。repo查看DockerCEyumlistgrepdockerce更新yum缓存sudoyummakecachefast2。安装Docker 安装指定版本20。10。21sudoyuminstallydockerce20。10。21dockercecli20。10。21containerd。io3。启动Docker启动Dockersudosystemctlstartdocker设置开机启动Dockersudosystemctlenabledocker 四、安装Kubernetes集群所需组件(一)安装kubeadm,kubelete,kubectl1。配置yum源catEOFetcyum。repos。dkubernetes。repo〔kubernetes〕nameKubernetesbaseurlhttp:mirrors。aliyun。comkubernetesyumreposkubernetesel7x8664enabled1gpgcheck0repogpgcheck0gpgkeyhttp:mirrors。aliyun。comkubernetesyumdocyumkey。gpghttp:mirrors。aliyun。comkubernetesyumdocrpmpackagekey。gpgEOF2。开始安装确认yum中是否有指定版本yumlistkubeadmshowduplicatessortr安装1。21。00yuminstallykubeadm1。21。00kubelet1。21。00kubectl1。21。003。Docker和K8s设置为同一个cgroup(1)修改daemon。jsonvimetcdockerdaemon。json设置cgroupexecopts:〔native。cgroupdriversystemd〕(2)重启Dockersystemctlrestartdocker(3)检查kubelet,如果在输出信息中发现Nosuchfileordirectory,说明没问题sediscgroupdriversystemdcgroupdrivercgroupfsgetcsystemdsystemkubelet。service。d10kubeadm。conf4。修改kubelet启动参数 每台主机都要添加并指定对应的公网IP,然后才能使用公网IP进行集群间通信vimusrlibsystemdsystemkubelet。service。d10kubeadm。conf 在KUBELETKUBECONFIGARGS后面追加nodeip w2节点的改动如下图所示 修改之后执行daemonreload让修改生效systemctldaemonreload5。启动kubelet重启kubelet 启动kubeletsystemctlenablekubeletsystemctlstartkubelet 重启kubeletsystemctlrestartkubelet(二)拉取kubeproxy,scheduler等镜像 需要通过国内镜像源下载镜像1。查看kubeadm所需镜像kubeadmconfigimageslist 输出信息如下k8s。gcr。iokubeapiserver:v1。21。14k8s。gcr。iokubecontrollermanager:v1。21。14k8s。gcr。iokubescheduler:v1。21。14k8s。gcr。iokubeproxy:v1。21。14k8s。gcr。iopause:3。4。1k8s。gcr。ioetcd:3。4。130k8s。gcr。iocorednscoredns:v1。8。0 遗憾的是需要科学上网才能下载这些镜像2。尝试用国内镜像源拉取镜像dockerpullregistry。cnhangzhou。aliyuncs。comgooglecontainerskubeapiserver:v1。21。14 经过测试,可以正常拉取,因此编写一个Shell脚本,通过国内镜像源拉取kubeadm所需镜像 切换到一个目录,编写kubeadmimage。sh,用于从阿里云镜像源拉取镜像重新打tag删除原镜像!usrbinenvbash镜像处理过程中,如果遇到错误,立即退出sete版本定义readonlyKUBEVERSIONv1。21。0readonlyPAUSEVERSION3。4。1readonlyETCDVERSION3。4。130readonlyCOREDNSVERSIONv1。8。0readonlyOFFICIALURLk8s。gcr。ioreadonlyALIYUNURLregistry。cnhangzhou。aliyuncs。comgooglecontainers镜像列表imageList(kubeapiserver:{KUBEVERSION}kubecontrollermanager:{KUBEVERSION}kubescheduler:{KUBEVERSION}kubeproxy:{KUBEVERSION}pause:{PAUSEVERSION}etcd:{ETCDVERSION}coredns:{COREDNSVERSION})镜像转换操作forimageItemin{imageList〔〕};do从国内镜像源拉取镜像dockerpullALIYUNURLimageItem给镜像重新打一个标签,命名为kubeadm所需的镜像dockertagALIYUNURLimageItemOFFICIALURLimageItem删除原有镜像dockerrmiALIYUNURLimageItemdonecoredns的镜像比较特殊,单独处理dockertag{OFFICIALURL}coredns:{COREDNSVERSION}{OFFICIALURL}corednscoredns:{COREDNSVERSION}dockerrmi{OFFICIALURL}coredns:{COREDNSVERSION} 运行脚本sh。kubeadmimage。sh 五、搭建Kubernetes集群(一)用kubeadm初始化master节点1。执行kubeadminitkubeadminitkubernetesversion1。21。0apiserveradvertiseaddress139。196。219。92podnetworkcidr10。244。0。016v5 输出日志中出现如下信息时,说明master节点已经初始化成功了 YourKubernetescontrolplanehasinitializedsuccessfully! 将末尾的kubeadmjoin信息保存起来,后面的步骤中需要在worker节点执行 2。集群健康检查 执行如下命令mkdirpHOME。kubesudocpietckubernetesadmin。confHOME。kubeconfigsudochown(idu):(idg)HOME。kubeconfig 集群健康检查检查集群状态kubectlclusterinfo健康检查curlkhttps:localhost:6443healthz3。修改kubeapiserver配置 kubeapiserver添加bindaddress0。0。0。0,确认advertiseaddres公网IPvimetckubernetesmanifestskubeapiserver。yaml 修改后如下图所示 (二)安装网络插件Flannel1。当前集群状态kubectlgetpodsnkubesystemkubectlgetnodes 可以看到,两个coredns还是Pending状态,此时还缺少网络插件2。安装Flannel网络插件 Kubernetes为了让网络功能更加灵活,制定了CNI规范,由第三方实现网络的细节功能。目前有多种网络插件可供选择,使用较多的是Calico和Flannel,其他的网络插件参考官方文档:https:kubernetes。iodocsconceptsclusteradministrationaddons 由于公网环境使用Calico网络插件配置比较复杂,也没有调试成功,因此本文使用Flannel网络插件,安装命令如下,在master节点执行进入一个目录,假设为varlocalk8swgethttps:raw。githubusercontent。comcoreosflannelmasterDocumentationkubeflannel。yml 修改kubeflannel。yml,新增2个配置vimkubeflannel。yml 第1处containers:name:kubeflannelimage:flannelcniflannel:v0。20。2forppc64leandmips64le(dockerhublimitationsmayapply)image:docker。ioranchermirroredflannelcniflannel:v0。20。2command:optbinflanneldargs:publicip(PUBLICIP)ifaceeth0ipmasqkubesubnetmgr 第2处env:name:PUBLICIPvalueFrom:fieldRef:fieldPath:status。podIP 修改后的配置如下 执行安装命令kubectlapplyfkubeflannel。yml(三)用kubeadm将从节点加入集群 执行如下命令,将worker节点加入集群kubeadmjoin139。196。219。92:6443tokeno0zxc6。fmmh2sn8wlbt9onmdiscoverytokencacerthashsha256:a52cec58178c402ecaecc74375d49495c1bf13661dd0b25b158e7caf5d619fa6v5 输出日志中出现如下信息时,说明worker节点已经成功加入集群 Thisnodehasjoinedthecluster 将2个从节点都加入集群后,集群状态如下 可以看到,3个节点都处于可用状态,3个Flannelpod也是绑定的公网IP 六、自定义Pod测试 podnginx。ymlapiVersion:appsv1kind:ReplicaSetmetadata:name:mynginxlabels:tier:frontendspec:replicas:6selector:matchLabels:tier:frontendtemplate:metadata:name:mynginxlabels:tier:frontendspec:containers:name:mynginximage:nginxports:containerPort:80apiVersion:v1kind:Servicemetadata:name:mynginxservicespec:type:NodePortports:port:80targetPort:80protocol:TCPnodePort:30992selector:tier:frontend 执行切换到podnginx。yml所在目录kubectlapplyfpodnginx。yml 查看mynginx对外暴露的端口查看已暴露的端口kubectlgetservices w1节点的公网IP为1。116。156。102,w2节点的公网IP为121。37。169。103,NodePort对外暴露的端口为30992,访问结果如下 测试通过,K8s集群搭建成功 七、参考文档 CentOS7Tunctl安装虚拟网卡 选择Kubernetes网络插件 公网环境搭建K8s集群