K8S云平台搭建说明

Posted 数通畅联

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8S云平台搭建说明相关的知识,希望对你有一定的参考价值。

随着科技的发展,联网时代的到来,会有越来越多技术概念出现,比如大数据、云、中台等技术概念,而云的概念,云平台是一种抽象的名词,它通过云这种方式,将数据和想要展示的东西存储在云上,企业机构等销售自己产品或者产品的公司不需要将精力放在产品管理上,只需要根据用户需求将已经布置好的产品组合或者展示界面等交付给用户,实现方便的统一管理。

对于企业而言,已建立的内部集成并不能支撑其快速搭建开发环境、快速部署集群服务,并且动态水平扩展对多组织情况许可费用高昂、没有敏捷快速迭代机制,导致开发完毕就落伍,以及不能快速进行产品扩展等现象,解决这一问题的根本方法就是引入k8S云平台。

1整体介绍

云平台管理系统是一种管理公有云、私有云和混合云环境的整合性产品,为企业提供管理跨多个云基础设施的云计算产品。随着IT基础架构的不断发展,跨厂商云资源、物理资源及虚拟资源并存现象的不断涌现,企业对于云管理、云安全、云成本等的要求也不断提高,因此云平台管理系统的出现,就是帮助企业全面解决混合云IT架构下的跨云、多云管理等问题,以及针对云平台下开发、部署、管理、运维、集群配置、运行状态等统一管理的服务产品。

1.1系统框架

UMC云管理平台是为k8s可视化管理而开发的,主要功能是通过调用k8s Api将各租户使用的k8s集群进行可视化管理,简化系统使用者的操作过程和操作难度,提高了工作效率。整体系统架构如下图所示:

底层通过容器化的不同产品作为支撑,包含ESB应用集成平台、MDM基础数据平台、IDM身份管理平台、DAP数据分析平台、BPM流程集成平台、Portal门户集成平台等产品。

中层通过k8s技术可根据企业自身需求对底层容器化的AEAI套件进行统一调度管理。

UMC云管理平台可以对调度过来的各容器化的AEAI集成套件进行统一管理和监控。

1.2功能框架

UMC云管理平台大致分为8个功能:许可查看,可以查看具体内容;租户管理和租户配置,通过管理租户树形结构,将机构、方案、环境、服务器关联起来,统一管理;实例监控,以左树右表的方式,将方案、环境、服务器和容器关联起来,统一监视容器信息,包括基本、状态、心跳、性能等;开发部署分为开发部署和数据处理2个功能,开发部署与实例监控功能基本相同,追加查看部署日志功能,数据处理就是本次要讲解的数据库处理功能;集群管理,用来管理和监视k8s集群的运行状态;基本配置,用来管理方案,产品的具体信息;系统管理,主要沿用数通畅联规范的系统管理。

1.3部署架构

需要部署的程序为:

1台master:

部署:redis单机、NFS、nginx单机、k8s、数据库、镜像库、umc产品;

要求:cpu要大,内存和硬盘适中。

2台worker:

部署:Ingress Controler、k8s、NFS Client;

要求:cpu、内存和硬盘都要尽可能大些。

2环境准备

使用root账户调整配置,以下步骤所有机器都要配置和安装。

如果用户不是root,需要执行下面命令,赋予root权限,如果就是root用户,此步骤忽略。

1)修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,tommy是当前用户,如下所示:

2)修改完毕,现在可以用tommy帐号登录,然后用命令 su - ,输入tommy用户登录密码,即可获得root权限进行操作。

2.1修改主机名称

设置主机名,添加主机名与IP对应关系:

修改hosts文件:

2.2修改安全策略

1.关闭防火墙:

2.关闭selinux:

3.关闭swap:

4.如果虚拟机无需此操作,时间同步【启动chronyd系统服务】。

2.3修改网络映射

将桥接的IPv4流量传递到iptables的链:

添加完毕后执行生效:

执行效果:

3软件安装

所有节点安装Docker/kubeadm/kubelet,以下步骤所有机器都要配置和安装。

3.1安装Docker

1.正常在服务开外围情况下直接执行以下命令即可:

注意:非root用户命令前需要添加“sudo”,并输入当前登录账户服务器密码:

2.如果服务器没有外围,但本地有镜像库的安装docker 步骤如下:

修改YUM中CentOS-Base.Repo地址参数enabled值改成0:

把原来epel.repo的地址修改,原地址如下:

将地址改成如下:

查询docker 版本:

执行:安装docker。

注:如果服务器没有网,只能把已经有网的下载后拷贝到没有网的服务器中进行安装。

以上命令下载后制定目录中命令如下:通过黄色标记部分制定目录,只下载不安装。

然后拷贝到没有网的服务器中手动安装,命令如下:

查看docker版本:

3.2添加YUM软件源

注意:服务器没有网无需此步,直接用下载的安装包往下进行。

在/etc/yum.repos.d目录下vi kubernetes.repo

3.3安装kubeadm

以下是对kubeadm、kubelet、kubectl部署,本次部署也是通过下载好的安装包手动安装。

3.3.1 工具说明

kubeadm: 部署集群用的命令;

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

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

3.3.2安装方法

下载部署包:

然后拷贝到没有网的服务器中进行手动安装,命令如下:

3.4修改Cgroup Driver

注意:非root用户命令前需要添加“sudo”。 

修改cgroup driver是为了消除初始化集群时提示的告警:

查看:

sudo docker info | grep Cgroup

编辑追加代码:

重新加载docker:

再次查看:

sudo docker info | grep Cgroup

4安装redis

安装redis也需要网络下载部署包,如果没有网络就使用公司已经下载的部署包安装。

4.1前置条件

1.更新linux自带的gcc 与make,下载部署包:

上传到服务其中创建一个redis目录中,手动安装。

安装完成后会有提示“完毕!”并自动返回到命令行。

2.如果wget提示无此命令,安装wget。

1)检查wget是否安装:

如下显示则已经安装:

如果没有显示则表示没有安装,需要通过以下命令安装:

Redis是通过ruby 来启动集群的,因此要先安装ruby环境。以便后续启动集群。

安装结果如下:

4.2安装步骤

安装命令如下:

命令的解释说明:

首先进入/usr/local目录下,通过wget下载redis的压缩包,通过tar命令解压,最后进入对应解压出来的文件夹中进行编译安装。

首先它提示是否继续链接,输入”yes”即可,之后会提示输入对方root用户的密码,对应输入后就会直接传输,相比较而言,scp命令比wget命令要快。

传输完成后继续上面命令中的3开始执行,即解压缩-编译安装。

4.3配置调整

需要修改redis.conf文件中三处,位置如下:

5Nginx安装

Nginx需要很多前置包,所以在安装nginx前需要更新前置安装包。

5.1前置条件

下载到root目录nginx中:

安装部署:

5.2步骤说明

将附件中对应Nginx的安装包通过XShell放入 /root目录下。

1.将nginx对应三个安装包移动到/usr/local/src目录中:

2.解压这三个安装包:

将nginx_upstream_check_module-0.3.0.tar.gz 解压出来的目录重命名为 nginx-sticky-module-ng-1.2.5。

这样保证后面编译运行时的目录是准确的。

3.接着进入 nginx-1.6.3目录中。

进行编译安装:

这样代表nginx已经编译安装完成。

可以通过以下命令检测Nginx是否安装完成:

6JDK安装

1.卸载自带JDK

检查安装了那些jdk。

卸载这些jdk。

即:

6.1安装JDK

通过XShell传输JDK到/root目录下之后进行解压:

6.2配置变量

配置java环境变量,编辑profile文件,注意备份:cp /etc/profile /etc/profile.bak。

添加如下代码:

6.3配置生效

检测是否生效:

7mysql安装

 Mysql是传统服务安装方式,服务解压后进行安装。

7.1前置条件

由于CentOS7内置了一个数据库Mariadb,需要先卸载它,完毕之后才能安装MySQL。

1.输入命令查询出来已安装的Mariadb:

2.卸载Mariadb,文件名为上述命令查询出来的文件名:

3.删除etc目录下的my.cnf(如果以前安装了MySQL需要操作)。

7.2步骤说明

前置条件参数发现没有安装过mysql后,就可以通过以下部署安装mysql。

7.2.1安装部署

1.打开Xftp将Linux环境的MySQL压缩包放入/usr/local/tools目录下,利用Xshell进入该目录,然后将MySQL解压。

2.将压缩包解压:

3.将解压好的文件夹重命名为MySQL,并放置在/usr/local下。

4.在/usr/local/mysql目录下创建data目录:

5.检查mysql用户组和用户是否存在,如果没有,则创建:

6.更改mysql目录下所属的用户组和用户,以及权限:

7.在 etc 下新建配置文件my.cnf,并在该文件中添加以下代码:

选择执行步骤:copy一份/usr/local/mysql/support-files/下的my-default.cnf文件到/etc下。

8.然后配置/etc目录下的my.cnf文件(如果第5步没有复制,直接进行这一步是会直接创建一个名称为my.cnf的文件的)。

注意备份:cp /etc/my.cnf /etc/my.cnf.bak

9.通过vi编辑器编辑my.cnf代码如下:

10.编译安装并初始化mysql:

注意:一定要记住日志最后的初始化密码。

注意事项:

1)若执行以上最后一个命令出现以下问题:

解决方法 :安装autoconf库。

2)如果出现下面问题:

解决方法 :yum install libaio。

安装后重新执行上述10的安装命令。至到出现:

11.继续操作:

12.授予my.cnf最大权限。

13.复制启动脚本到资源目录,以方便后续MySQL的启动。

14.增加mysqld服务控制脚本执行权限。

15.将mysqld服务加入到系统服务。

16.检查mysqld服务是否已经生效。

命令输出类似下面的结果:

表明mysqld服务已经生效,在2、3、4、5运行级别随系统启动而自动启动,以后可以使用service命令控制MySQL的启动和停止。

7.2.2启动MySQL

出现如下效果即为成功:

注意:如果出现XshellMySQL服务关闭情况按照如下命令进行重启:

7.2.3设置密码

1.将MySQL的bin目录加入PATH环境变量,编辑 ~/.bash_profile文件。

注意备份:cp ~/.bash_profile ~/.bash_profile.bak。

添加如下内容:

2.执行下面的命令使修改的内容立即生效:

以root账户登录MySQL,默认是没有密码的:

要输入密码的时候输入上面安装后回显的密码回车即可。

3.设置root账户密码为12345(也可以修改成你要的密码)。

4.设置远程主机登录,注意下面的your username 和 your password改成你需要设置的用户和密码。

例如密码为123456,用户名也是root执行下方语句即可。

5.退出MySQL。

7.3防火墙处理

1.开启防火墙端口:

2.加载设置:

3.查看端口是否开启:

这样通过外部也能够链接MySQL。

7.4安装验证

因为MySQL安装时已经设置了能够通过外部访问,所以通过navicat直接链接对应地址即可验证配置和安装是否正确:    

8K8S集群

本次部署属于单机环境部署。

8.1部署Kubernetes Master

以下是Kubernetes 搭建:

8.1.1安装步骤

1.在192.168.1.241(Master1)执行。

准备集群配置文件(参考:目前用的api版本为v1beta1,具体配置可以参考官方https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1)

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

参数解释:

2.执行节点初始化,初始化时间比较长一些,大概1分钟左右,当出现以下结果,表示初始化完成。

注意:初始化时要留意输出的英文提示,可以及时知道初始化失败的原因,初始化完成,不代表集群运行正常。

原来的kubeadm版本,join命令只用于工作节点的加入,而新版本加入了 --experimental-contaol-plane 参数后,控制平面(master)节点也可以通过kubeadm join命令加入集群。

3.Master初始化完毕后最下面这个必须记录下来,后面node服务器加入需要用到。

4.按提示执行命令:

5.查看:

kubectl get nodes

kubectl get pods -n kube-system

参考链接:
https://blog.csdn.net/weixin_44631350/article/details/88956320

8.1.2重试机制

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

8.2安装Pod网络插件

以下是Pod网络插件的安装:

8.2.1资料准备

安装pod保障K8s内部网络互通,在192.168.1.241(Master)执行。

如果下载失败,可以直接使用下列文件:

kube-flannel.yml地址:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

8.2.2安装过程

1.安装flannel

安装结果:

查看pods:

kubectl get pods -n kube-system

参考:quay.io国内无法访问,解决Kubernetes应用flannel失败,报错Init:ImagePullBackOff。

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

https://blog.csdn.net/qq_43442524/article/details/105298366

8.3加入Kubernetes Node

在192.168.1.242/243(Node)执行。

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:这个在master init初始化时会有提示,更换为自己的IP和token。

到master节点查看node状态,都显示ready:

kubectl get node

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

删除操作步骤:

参考链接:
https://blog.csdn.net/you227/article/details/79277595

8.4配置Ingress-nginx

参考链接:
https://blog.51cto.com/14157628/2472849?source=dra
https://www.cnblogs.com/panwenbin-logs/p/9915927.html

8.4.1原理及流程图

后端有多个pod,pod与service进行关联,service又被ingress规则发现并动态写入到ingress-nginx-controller容器中,然后又为ingress-nginx-controller创建了一个Service映射到群集节点上的端口,来供client来访问。

8.4.2镜像上传导入

nginx-ingress.tar镜像压缩包在附件中下载即可。

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

8.4.3YAML下载修改

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

hostNetwork: true

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

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

上传到master服务器,路径自己能找到就行。

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

加入红框部分,如下图:

参考链接:https://blog.51cto.com/14268033/2463671

8.4.4允许master节点部署pod

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

输出如下:

node “k8s” untainted。

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

参考链接:
https://blog.csdn.net/BigData_Mining/article/details/88683459
https://www.jianshu.com/p/54f252347d2d

8.4.5执行mandatory.yaml

kubectl apply -f mandatory.yaml

8.4.6确认Ingress-nginx容器

确认Ingress-nginx容器正常运行:

kubectl get pod -n ingress-nginx -o wide

注意Ingress-nginx容器部署在192.168.0.4上了。

8.4.7开启指定变量

kubectl apply -f configmap.yaml

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路径

8.4.8修改pod的hosts文件

在1.7版本后使用HostAliases修改pod的hosts文件,在deployment的yaml文件中添加即可:

8.4.9Ingress暴露tcp端口

1.断点调试端口需要使用tcp方式连接,所以需要暴露tcp端口,但Ingress不支持TCP和UDP服务,我们可以通过Ingress controller来实现,默认mandatory.yaml已经添加了,如下图:

2.通过tcp-services-configmap.yaml设置映射tcp

通过 udp-services-configmap.yaml 映射udp

esb tcp配置如下:

3.更新tcp-services-configmap.yaml

提示已配置configmap/tcp服务。

4.查看configmap

5.通过在node节点查看9797端口,进程已存在,如下图:

8.5配置标签

nodeSelector是节点选择约束的最简单的形式,通过给node添加标签,将pod分配到指定的node上。

8.5.1节点添加标签

通过以下命令给节点添加标签:

例如:

8.5.2配置添加nodeSelector

添加nodeSelector和值,注意“=”号改成“:”号。

8.6NFS安装

以下是NFS搭建:

8.6.1服务端安装NFS服务

1.新建立一个主机。

master:192.168.0.161

2.安装NFS和rpc。

3.启动服务和设置开启启动。

4.建立共享文件夹:

5.设置共享:

说明:
/opt/mnt/volumes 18.0.16.0/24(fsid=0,rw,async,no_root_squash)

目录 授权给 网段 权限

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

6.启动NFS。

7.查看2049端口是否打开。

8.6.2NFS客户端挂载配置

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

2.查看挂载配置:

3.在node1上测试挂载是否成功(测试,可以跳过

挂载失败提示如下:

取消挂载:

4.在客户端创建目录,并挂载共享目录。

5.检查(有就行,和顺序无关)。

8.7镜像库安装

注意:非root用户命令前需要添加“sudo”,并且输入当前登录账户服务器密码。

1.将registry镜像pull下来。

2.启动。

8.7.1基础镜像

8.7.2上传镜像

1.可以拉取一个busybox镜像(因为体积小),进行实验:

2.打标,准备发布到Registry中:

3.标签样例:

4.推送给Registry。

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

设置daemon.json文件。

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

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

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

8.7.3查看镜像

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

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

8.7.4拉取镜像

拉取镜像:

8.7.5删除镜像

注意删除镜像必须要root用户。

1.配置hosts映射:

2.下载:

3.查看:

4.授权:

5.查找备份路径:

find / -name registry

6.设置镜像仓库的位置:

7.删除:

8.重启docker。

删除镜像之后要重启docker,不然还是会出现相同镜像push不成功的问题。

9总结分析

对于数通畅联而言,产品已经实现容器化,那么容器化后产品具体能够带来哪些方便、哪些优势呢?容器化后产品和UMC平台如何结合使用?对于产品未来发展方向是什么?

9.1问题总结

本次部署K8S是在其中2台没有外网的情况下进行的,很多下载命令无法进行,所以通过有外网服务把需要安装的部署包和依赖下载到一个目录下,然后再传输到其他服务器上手动安装,目前已经验证成功,这样对以后部署工作提供了一个方向,在没有外网的情况下就可以直接使用此次下载的安装包安装即可。

9.2功能作用

容器化首先带来的好处就是产品的迭代升级有了保证,能够快速的升级部署不同产品,而UMC平台可以通过平台级操作部署、升级我们的所有产品,所以本次升级数据库处理也是对云平台一次升级,它不仅可以对我们公司的产品进行管理,也可以对外围工具进行管理,数据库处理功能就是进行数据对比、数据同步等产品升级、项目实施时,需要对数据库进行处理时直接在云平台中就可以进行了。

9.3产品组合

首先云平台管理软件可以有效的解决企业的业务数据和应用程序跨云、多云等情况,实现快速对云平台开发、部署、管理、运维统一管理中心,对集群配置、运行状态等进行统一管理,并帮助企业全面解决云管理、云安全、云成本等问题。

UMC支持搭建不同的方案,UMC可以通过搭建方案支撑起产品之间灵活组合推出不同的方案场景,来满足不同的项目需求,目前我们主要推出的产品组合也是要在公司UMC云平台搭建典型样例的有IDM统一身份管理平台+ESB应用集成开发平台、ESB应用集成开发平台+MDM主数据管理平台、MDM主数据管理平台+ESB应用集成开发平台、DAP数据分析平台+ESB应用集成开发平台,这些方案组合都要通过项目来萃取出典型集成场景,这样就确保以后项目中有快又好。

以上是关于K8S云平台搭建说明的主要内容,如果未能解决你的问题,请参考以下文章

如何搭建云原生大数据平台的K8s底座

K8S云平台环境调优说明

K8S云平台环境调优说明

云原生 • Kubernetes搭建 k8s 集群(Kubeadm 方式)

如何搭建自己的CI/CD平台:Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台(持续集成部署Hexo博客Demo)

(十五)从零开始搭建k8s集群——使用KubeSphere管理平台搭建一个EFAK服务平台管理kafka集群