kubernetes是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。之前部署K8S集群都是参照文档逐步执行完成的,需要大量时间且部署过程中会出现各种各样的问题,本篇文章以kubernetes1.14.0为例,介绍如何使用ansible进行K8S三台服务器非高可用的一键式离线安装。
1.K8S:是一个开源的,用于管理云平台多个主机上的容器化应用,Kubernetes目标是使部署容器化的应用简单且高效,Kubernetes提供了应用部署、规划、更新、维护的一种机制;
2.Ansible:是新出现的自动化运维工具,基于Python开发,集合了多数运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能;
3.机器名:在局域网或者是INTERNET上,每台主机都有一个IP地址,它可以区分每台主机,并可以根据IP进行通讯。但IP地址不方便记忆,所有又有了域名。在一个局域网中,每台机器都有一个主机名,用于区分主机,便于相互访问;
4.Selinux:是部署在 Linux 系统中增强安全的功能模块,它通过对进程和文件资源采用 MAC(强制访问控制方式)为 Linux 系统提供改进的安全性;
5.防火墙:FirewallD提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。centos有两种防火墙FirewallD和iptables防火墙,centos7使用的是FirewallD防火墙。FirewallD是iptables的一个封装,可以让你更容易地管理 iptables规则,但它并不是iptables的替代品。
首先介绍3台服务器,各个服务器上部署的应用,其次介绍相关使用的命令,最后介绍ansible脚本使用到的文件大体作用。
这里分为服务器架构和K8S集群架构两类。
以部署3台服务器为例:
1台master:
部署:1个nginx ,1个数据库(可以单独服务器部署),1个NFS服务端,1个私有镜像库,1个umc ,1个umc使用的redis;
要求:cpu要大,内存和硬盘适中。
2台worker:
部署:2个ingress-controller, 2个NFS客户端,若干产品服务,对应产品的redis集群(开发环境单机);
要求:cpu,内存和硬盘都要尽可能大些。
说明: 单master版适用于演示环境,生成环境一定要使用多master版K8S高可用模式。
介绍本次使用的相关文件,方便大家使用时,知道执行的原理和流程,而不仅只是个执行者。
3个文件,如下图:
1.ansible-install.zip
ansible程序的安装文件,一键部署使用的命令就是ansible。
2.ansible-install-K8S-master.zip
一键K8S部署相关文件,包括部署执行文件,设置全局变量文件,初始化文件等。
3.binary_pkg.zip
部署所需安装包存放目录。
简单就ansible-install-K8S-master文件夹进行说明,如下图:
说明:
1.group_vars:全局变量目录,包含all.yml文件;
2.roles:能够根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们;
3.add-node.yml:节点扩容执行部署文件;
4.hosts:配置服务器hosts文件;
5.multi-master-deploy.yml:高可用Master版K8S部署执行文件(本次搭建为非高可用);
6.single-master-deploy.yml:非高可用Master版K8S部署执行文件。
下面开始一些重要的准备工作,为一键部署K8S集群做准备。
1.确保所有节点系统时间一致
2.设置主机名
注意:黄色部分根据实际情况酌情修改 。
3.创建目录(3台服务器执行)
4.只在master服务器/opt/kubernetes/tools目录下,上传ansible-install.zip、ansible-install-K8S-master.zip、binary_pkg.zip
5.解压3个压缩包
6.关闭selinux(注意:此步骤建议手动执行,然后手动重启服务器reboot,因为有时候修改后状态不是Disabled,需要重启生效)
ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。
1.启用epel仓库,安装ansible ;
2.确认安装 ;
1.初始化hosts
修改主机文件,根据规划修改对应的IP和名称(即hostname) 。
样例说明:
hosts文件,只修改下图中三个地方。[master]为主节点Ip,[node]为两个工作节点ip,[etcd]为数据库节点Ip,目前用master+2台Node当作etcd节点,所以[etcd]中Ip修改为三台服务器Ip。
2.初始化all.yml
修改多个目录和证书可信任IP:
样例说明:
all.yml修改示例如下:只修改K8S和etcd下面的三行Ip地址就可以,其他不要动。
执行single-master-deploy.yml文件,等待执行结果:
部署产生的证书都会存放到目录“ansible-install-K8S-master/ssl”,如下图:
检查是否安装成功:
若出现下面结果,说明安装K8S集群成功,如下图:
开启防火墙,设置IP白名单,设置端口。
1.linux服务器/etc/firewalld/zones目录对public.xml、trusted.xml进行调整(如果没有、则创建);
2.vi编辑public.xml文件,加入需要开放的端口;
3.vi编辑trusted.xml文件,加入ip白名单地址;
4.重启防火墙,systemctl restart firewalld.service;
public.xml是公共网络配置,只需要开启端口或服务即可,比如:ssh服务、dhcpv6-client服务,80、443端口。
配置样例如下:
trusted.xml是受信任网络配置,把ip白名单或者网段添加进来即可,比如:
10.244.0.0/16网段(B级别网段,K8S容器集群ip网段),172.30.128.0/24(K8S物理服务器节点ip网段,通常是C级别网段,根据实际情况来调整);10.23.237.71是单个特定要访问的ip地址(根据实际情况来调整)。
配置样例如下:
关于K8S集群防火墙调整的详细说明请查看《K8S集群搭建开放防火墙调整说明》文档。
1.ansible搭建K8S:
ansible搭建K8S - 又逢落花时节 - 博客园 (cnblogs.com)
GitHub - lizhenliang/ansible-install-K8S
2.二进制K8S部署包下载地址,注意版本 ;
https://dl.K8S.io/v1.14.0/kubernetes-server-linux-amd64.tar.gz
这次学习使用ansible搭建K8S(非高可用),让我对K8S的安装又打开了新思路,之前是使用软件安装的,而本次是直接使用二进制编译安装,也初步学习了解了ansible的一些基本用法和语法结构,并进行梳理总结。
因为网上使用的是比较新的K8S版本,考虑到和我们产品使用的版本跨度太大,API版本的调用,故调整相关文件和安装包版本,调整如下:
1.K8S镜像改用1.14.0;
2.docker版本18.06.1-ce;
3.ingress改用0.29.0;
4.修改kube-controller-manager.conf配置文件,因为版本不同,配置参数不一样;
5.网络插件由calico改用flannel;
6.移除Dashboard。
在之前有考虑过脚本化K8S部署,准备使用shell脚本的方式实现,现在看来这个想法还不够成熟。ansible的使用方法和之前想到的脚本不太相同,ansible的语法逻辑对于我来说是比较陌生的。经过1天半的学习研究,加上实际操作成功把K8S部署制作出来。同时因为需要调整K8S版本,让我深入了解了ansible的使用方法。
本次成功只是阶段性的胜利,后面还有外围产品、软件的一键部署安装,K8S高可用的一键部署安装。目前只是初步了解,后面还有更加困难的问题在等待着我,但我相信我一定可以攻克困难,取得成功。
这里要说明下,其实不仅是K8S相关的需要一键部署,我们现在做的许多事情都可以写成脚本一键执行,比如传统的redis部署,MySQL安装等。后续在做重复工作时,一定要考虑简化操作一键部署的可能性,这样即节省时间,又可以降低人工操作失误导致的问题。