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集群部署与配置心得的主要内容,如果未能解决你的问题,请参考以下文章