K8S集群部署与配置心得

Posted 数通畅联

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8S集群部署与配置心得相关的知识,希望对你有一定的参考价值。

K8S云平台是目前公司核心产品的主推部署方式,通过云平台进行产品、方案部署,可以加快部署效率,特别是针对集群式、高可用部署,云平台具有天然的优势。云平台部署模式在满足常规部署的同时,也提供了对于服务器资源的监控、运维的辅助,能协助运维人员快速进行服务器升级、扩容、启停等操作,降低运维难度。

最近参与了实际项目的K8S集群部署工作,参考已有的部署文档顺利地完成云平台部署,所以在原有的集群部署方案基础上对相关内容进行了梳理,同时也总结了在云平台部署时UMC产品的一些配置内容。 

1基础环境 

基础环境主要是对服务器进行一些配置工作,以满足K8S云平台部署的需要,由于本次部署采用的是Centos7系统,因此以Centos7为例进行说明,包括各服务器之间的通信、防火墙策略以及一些系统参数等。 

1.1主机名称 

1.为了便于K8S集群各台服务器之间的通信,对主机名称进行修改。 

2.修改hosts文件,添加主机名与IP对应: 

1.2安全策略 

本文的服务器安全主要针对于服务器防火墙进行处理,包括防火墙端口的开放以及IP白名单配置,以保证云平台部署和后续运行时各服务器之间的通信,以及部署后外部访问的需要。 

1.2.1防火墙端口 

1.编辑public.xml: 

2.添加80端口: 

3.保存退出,重启防火墙: 

注意:这里采用直接修改配置文件的方式,也可以通过firewall-cmd命令添加。 

1.2.2防火墙白名单 

1.编辑trusted.xml: 

2.添加各服务器IP:  

注意:10.244.0.0/16为K8S内部通信IP。 

3.保存退出,重启防火墙: 

1.3其他配置 

服务器一些其他参数的配置,K8S基础环境(非高可用)的部署主要是处理网络映射以及selinux和swap模块,以屏蔽K8S集群部署时的异常信息。 

1.3.1网络映射 

添加配置文件,将桥接的IPv4流量传递到iptables的链; 

1.编辑k8s.conf文件:

2.添加配置: 

  

3.添加完毕后执行生效: 

  

1.3.2selinux 

1.修改selinux配置文件: 

2.关闭selinux: 

3.立即生效: 

1.3.3swap 

1.临时关闭swap: 

2.修改配置文件: 

3.永久关闭swap: 

2软件安装 

主要是安装K8S云平台必要的一些资源,如docker、K8S组件以及一些配置参数,这一部分的内容不论是高可用部署还是非高可用部署都需要安装。 

2.1安装Docker 

在K8S集群的各台服务器上部署Docker并进行设置启动项。 

1.所有服务器都需要安装; 

2.非root用于在命令前加“sudo”,并且输入root账户服务器密码; 

3.系统没有wget时需要先安装:yum -y install wget。 

2.2添加yum源 

在/etc/yum.repos.d目录下创建kubernetes.repo文件; 

2.3安装K8S组件 

安装kubeadm、kubelet、kubectl等K8S组件; 

kubeadm: 部署集群用的命令; 

kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期; 

kubectl: 集群管理工具(可选,只要在控制集群的节点上安装即可)。 

2.4修改Cgroup 

修改cgroup driver,消除相应的警告信息; 

1.查看Cgroup; 

  

2.修改Cgroup; 

3.重新加载docker; 

4.修改验证; 

 

3集群配置 

主要是在服务器端配置K8S的集群环境,包括Master和Worker节点上软件的部署,集群的启动及节点的加入,同时部署网络插件以实现集群节点的通信。 

3.1部署Master 

Master是K8S集群部署的关键,集群部署大部分工作都是在Master上处理,包括集群的部署、初始化以及启动,一般Worker节点只是在Master部署完成后加入集群即可。 

3.1.1部署步骤 

1.在/opt目录下创建kubeadm-config.yaml; 

  

参数解释: 

2.通过阿里源预先拉镜像; 

3.查看镜像(共7个镜像); 

4.执行节点初始化; 

5.执行如下命令; 

6.查看nodes; 

 

7.查看pods; 

注意:node现在是NotReady状态,pod中coredns是Pending状态,是因为CNI网络插件未安装,继续3.2。 

3.1.2集群重置 

注意:如果修改过配置,修改完之后,需要重新初始化,重新搭建(没问题直接跳过)。 

注意:如果使用kubeadm reset命令重置集群,CNI插件也需要重新安装。 

3.2部署CNI插件 

CNI是集群各节点进行通信的网络插件,是集群部署时的必需步骤,只有部署网络插件才能建立集群,加入节点,当然网络插件不止一种,这里我们采用flannel插件。 

3.2.1资料准备 

直接使用下列文件: 

 

3.2.2安装过程 

1.安装flannel; 

2.再次查看nodes和pods(需要等待flannel初始化完成); 

注意:quay.io国内无法访问,可能会报错Init:ImagePullBackOff,需要多等待一会进行重试。 

如果网络完全不通,使用flanneld-v0.12.0-amd64.docker手动安装在所有节点上。 

注意:如果使用kubeadm reset命令重置集群,CNI插件也需要重新安装。 

3.3加入Node 

在192.168.1.222/223(Node)上执行。 

1.向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:这个在master init初始化时会有提示。 

2.在192.168.1.221(Master)上查看nodes和pods。 

3.192.168.1.223(worker2)采用同样方式加入即可。 

注意:如果提示如下错误,需要删除/etc/kubernetes下面的manifests文件夹然后重新init和安装kube-flannel.yml,步骤同上: 

删除操作步骤: 

  

3.4部署Ingress 

Ingress也叫Ingress-nginx,实际是Nginx的一种实现,主要是用于K8S集群内部代理转发的需要。 

3.4.1镜像上传 

nginx-ingress.tar上传到192.168.1.221(Master)上,路径自己能找到就行(如果下面的mandatory.yaml里配置指定master,这里可以只放到指定的master就可以),导入镜像: 

3.4.2配置文件 

参考文件如下: 

 

1)编辑添加212行,表示使用主机网络; 

hostNetwork: true 

关于上面yaml文件中写入的“hostNetwork: true”具体解释:如果添加了此字段,意味着pod中运行的应用可以直接使用node节点端口,这样node节点主机所在网络的其他主机,就可以通过访问该端口访问应用。(类似于docker映射到宿主机的端口)。 

2)编辑221行,修改镜像版本,改成上面导入的0.29.0; 

上传到192.168.1.221(Master)服务器,路径自己能找到就行。 

3)设置pod时间,通常情况云服务器的时区为世界标准时间,和中国标准时间相差8个小时; 

加入红框部分,如下图: 

3.4.3节点部署 

1.因为ingress-controller我们需要部署到master服务器上,而默认master不允许部署pod,所以使用如下方法解决; 

输出如下:node “k8s” untainted。 

输出error: taint “node-role.kubernetes.io/master:” not found错误忽略。 

2.执行mandatory.yaml; 

3.确认Ingress-nginx容器; 

注意:Ingress-nginx部署后为Pending状态,需要添加标签后采用变成Running状态,可以通过UMC添加标签,所以只需要确认Ingress-nginx容器已经存在即可。 

3.4.4开启变量 

 

1.内部ingress-nginx,data参数说明: 

1)proxy-add-original-uri-header: "true"

作用:获取到ingress的完整路径。 

2)enable-underscores-in-headers: "true"

作用:允许ingress支持自定义变量。 

3)use-forwarded-headers: "true" 

作用:获取X-Forwarded-Proto,如https。 

2.外部nginx.conf配置追加: 

proxy_set_header proxy-by-outer-ng true 

作用:如果true,说明是外部nignx,不带ingress路径。 

如果false,不是外部nginx,需要加ingress路径。 

4NFS安装 

NFS主要是搭建共享资源库,用于产品部署后的资源共享,包括配置文件、日志文件以及Server部署的资源文件等。 

4.1服务端 

1.在192.168.1.221(Master)上安装NFS和rpc; 

2.启动服务和设置开启启动; 

3.建立共享文件夹; 

  

4.设置共享; 

说明: 

/opt/mnt/volumes 192.168.1.0/24(fsid=0,rw,async,no_root_squash

目录 授权给 网段 权限 

注意:192.168.1.0/24是Master的网段,如果需要修改,只修改前3个位置,保留最后一位是0,即可表示全网段可以访问。 

5.启动NFS; 

6.查看2049端口是否打开; 

  

4.2客户端 

1.在192.168.1.222/223(Worker)上也安装nfs,确保每个节点安装nfs(客户端上不需要启动nfs服务,只是为了使用showmount工具); 

2.查看挂载配置; 

  

3.在客户端创建目录,并挂载共享目录; 

4.检查(有就行,和顺序无关); 

5镜像库安装 

搭建镜像库,用于存储上传的镜像文件,包括系统镜像、产品Server、Redis镜像等。 

5.1部署安装 

1.将registry镜像pull下来; 

2.启动; 

  

5.2基础镜像 

1.上传基础镜像:base-centos-v3.0.tar; 

2.导入基础镜像;

5.3推送镜像 

1.查询docker镜像:docker images; 

2.通过对base-centos镜像打标,准备发布到Registry中; 

3.推送给Registry; 

注意:如果上传、获取本地镜像会提示如下报错,需要设置daemon.json文件。 

1.设置daemon.json文件; 

2.其他节点获取本地镜像会提示。 

由于Registry为了安全性考虑,默认是需要https证书支持的,但是我们可以通过一个简单的办法解决: 

注意:<ip>:Registry的机器ip地址,在安装registry的节点和客户端需要访问私有Registry的节点都需要执行此步操作。 

  

5.4查看镜像 

1.查看仓库有哪些镜像,运行如下命令: 

查看具体镜像标签(黄色是镜像名): 

6UMC配置 

UMC产品以及JDK、mysql、Nginx、Redis的部署安装与配置可以参考相关部署手册,不做重点说明,这里主要介绍UMC中集群的配置与启动。 

6.1集群配置 

1.首先需要配置镜像仓库,打开UMC的镜像仓库,点击新增,配置地址: 

2.打开租户管理,新增一个租户,也可以使用默认的预置集团租户,在基础信息中选择刚才添加的镜像库地址: 

3.打开集群配置,新增一个集群,配置共享目录(部署NFS时的共享目录): 

4.先从192.168.1.221(Master)的/etc/kubernetes/admin.conf文件复制到本地,然后点击上传授权按钮上传文件: 

5.在节点信息中配置3台服务器的各个节点(Master、Worker1、Worker2): 

6.创建命名空间(可以先不建立,在集群配置时增加命名空间): 

7.创建标签,UMC初始化有预置标签信息,可以手动新增: 

8.新增镜像,并选择相应的产品,选择配置的镜像仓库: 

9.上传产品压缩包(rar格式),并根据按钮的高亮,构造镜像、推送镜像: 

6.2租户配置 

1.在租户配置功能下新增方案: 

2.在方案下新增环境: 

3.选择环境的集群名称: 

4.新增命名空间(和集群配置的命名空间同步): 

5.切换参数配置标签,配置数据库、Redis连接信息: 

6.生成并保存访问地址: 

7.依次点击Deploy、Service、Ingress的编辑按钮进行创建: 

8.访问测试: 

7分析总结 

K8S云平台部署模式是后续所有产品和方案统一采用的部署方案,通过云平台模式不仅可以降低产品部署、运维的难度,同时对于服务器的资源监控、统计分析也能发挥作用,实现集中的、一体化管理。 

7.1问题总结 

笔者是第一次在实际项目中整体进行K8S云平台的部署,虽然是第一次部署,但是借鉴于部署文档以及以往项目的部署经验,整体部署过程还是比较顺利的。但是在部署的过程中难免会遇到一些问题,后续梳理了一遍部署过程,出现的问题在文档中都有体现和说明,只是浏览文档不认真或者由于文档记录的相对简单,所以才忽略了。这也提醒了自己后续工作中一定要仔细认真,在做事情前最好有一个总体地了解,这样工作中才能尽量减少问题的发生。 

7.2产品方案 

UMC云平台实际是一个K8S的管理平台,通过Web端配置实现对K8S集群的配置、启停、监控、扩容等操作,并且通过UMC的管理功能可以将产品组件方案直接融合到平台中,实现不同产品、不同方案的快速部署,同时也提供租户、方案、环境等不同粒度的管控,可集中、可分散,并且通过命名空间有效地实现数据隔离。 

目前K8S部署都是采用手动部署的模式,即手动在服务器上部署一个个软件,后续部署方式会进行升级,提供一键部署方案,预置一键部署脚本,只需要在服务器执行脚本,就能对相关软件自动安装、自动部署集群、添加节点,大大提升部署速度,提高工作效率的同时,更能体现出专业性。 

7.3个人提升 

通过手动部署K8S集群,对K8S集群的相关组件,K8S内部的一些处理机制有了比较全面的了解,同时也加深了对于Linux系统及常用命令用法的认识,对于后续产品、环境部署、项目运维等工作也能更加方便有效,遇到问题也能更加准确地分析以及问题定位。 

对于一名项目经理来说,掌握项目管理的能力固然重要,但是对于技术能力也不能完全放下。无论是项目中遇到的技术问题,还是在实施过程中评估工作,了解技术,具备一定的技术能力将大大提升对项目的掌握,才能有效地推送项目进展。 

以上是关于K8S集群部署与配置心得的主要内容,如果未能解决你的问题,请参考以下文章

在k8s集群部署ELK

二进制部署k8s集群:部署kubelet

k8s kubeadm节点退出集群

k8s部署mongo集群

K8S云平台下云ESB迁移心得

《前端运维》五k8s--2podservices与Ingress部署