kubernetes是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。之前部署K8S集群都是参照文档逐步执行完成的,需要大量时间且部署过程中会出现各种各样的问题,本篇文章以kubernetes1.14.0为例,介绍如何使用ansible进行K8S三台服务器非高可用的一键式离线安装

1名词解释 

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的替代品。 

2整体说明 

首先介绍3台服务器,各个服务器上部署的应用,其次介绍相关使用的命令,最后介绍ansible脚本使用到的文件大体作用。 

2.1部署架构 

这里分为服务器架构和K8S集群架构两类。 

2.1.1服务器 

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,内存和硬盘都要尽可能大些。 

2.1.2K8S集群 

Ansible搭建K8S说明_K8S_02

说明: 单master版适用于演示环境,生成环境一定要使用多master版K8S高可用模式。 

2.2脚本说明 

介绍本次使用的相关文件,方便大家使用时,知道执行的原理和流程,而不仅只是个执行者。 

2.2.1文件说明 

3个文件,如下图: 

Ansible搭建K8S说明_服务器_03

1.ansible-install.zip 

ansible程序的安装文件,一键部署使用的命令就是ansible。 

2.ansible-install-K8S-master.zip 

一键K8S部署相关文件,包括部署执行文件,设置全局变量文件,初始化文件等。 

3.binary_pkg.zip 

部署所需安装包存放目录。 

2.2.2部署文件 

简单就ansible-install-K8S-master文件夹进行说明,如下图: 

Ansible搭建K8S说明_K8S_04

说明: 

1.group_vars:全局变量目录,包含all.yml文件; 

2.roles:能够根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们;

Ansible搭建K8S说明_K8S_05

3.add-node.yml:节点扩容执行部署文件; 

4.hosts:配置服务器hosts文件; 

5.multi-master-deploy.yml:高可用Master版K8S部署执行文件(本次搭建为非高可用); 

6.single-master-deploy.yml:非高可用Master版K8S部署执行文件。 

2.3相关命令 

Ansible搭建K8S说明_Ansible_06

3配置过程 

下面开始一些重要的准备工作,为一键部署K8S集群做准备。 

3.1前置条件 

1.确保所有节点系统时间一致 

Ansible搭建K8S说明_K8S_07

2.设置主机名 

注意:黄色部分根据实际情况酌情修改

Ansible搭建K8S说明_K8S_08

Ansible搭建K8S说明_Ansible_09

Ansible搭建K8S说明_Ansible_10

Ansible搭建K8S说明_高可用_11

  

3.创建目录(3台服务器执行) 

Ansible搭建K8S说明_K8S_12

Ansible搭建K8S说明_高可用_13

  

4.只在master服务器/opt/kubernetes/tools目录下,上传ansible-install.zip、ansible-install-K8S-master.zip、binary_pkg.zip 

Ansible搭建K8S说明_服务器_14

Ansible搭建K8S说明_服务器_15

5.解压3个压缩包 

Ansible搭建K8S说明_高可用_16

Ansible搭建K8S说明_Ansible搭建_17

  

6.关闭selinux(注意:此步骤建议手动执行,然后手动重启服务器reboot,因为有时候修改后状态不是Disabled,需要重启生效) 

Ansible搭建K8S说明_Ansible搭建_18

Ansible搭建K8S说明_高可用_19

Ansible搭建K8S说明_K8S_20

  

3.2安装ansible 

ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。 

1.启用epel仓库,安装ansible  ;

Ansible搭建K8S说明_高可用_21

Ansible搭建K8S说明_高可用_22

2.确认安装 ;

Ansible搭建K8S说明_高可用_23

Ansible搭建K8S说明_K8S_24

3.3初始化配置 

1.初始化hosts 

修改主机文件,根据规划修改对应的IP和名称(即hostname) 。

Ansible搭建K8S说明_服务器_25

Ansible搭建K8S说明_Ansible搭建_26

  

样例说明: 

hosts文件,只修改下图中三个地方。[master]为主节点Ip,[node]为两个工作节点ip,[etcd]为数据库节点Ip,目前用master+2台Node当作etcd节点,所以[etcd]中Ip修改为三台服务器Ip。 

Ansible搭建K8S说明_高可用_27

2.初始化all.yml 

修改多个目录和证书可信任IP:

Ansible搭建K8S说明_Ansible搭建_28

Ansible搭建K8S说明_服务器_29

样例说明: 

all.yml修改示例如下:只修改K8S和etcd下面的三行Ip地址就可以,其他不要动。 

Ansible搭建K8S说明_Ansible搭建_30

3.4一键部署集群 

执行single-master-deploy.yml文件,等待执行结果:

Ansible搭建K8S说明_高可用_31

Ansible搭建K8S说明_服务器_32

Ansible搭建K8S说明_K8S_33

Ansible搭建K8S说明_Ansible搭建_34

3.5生成证书位置 

部署产生的证书都会存放到目录“ansible-install-K8S-master/ssl”,如下图:

Ansible搭建K8S说明_高可用_35

4验证集群 

检查是否安装成功: 

Ansible搭建K8S说明_高可用_36

若出现下面结果,说明安装K8S集群成功,如下图: 

Ansible搭建K8S说明_K8S_37

Ansible搭建K8S说明_K8S_38

5恢复安全 

开启防火墙,设置IP白名单,设置端口。 

1.linux服务器/etc/firewalld/zones目录对public.xml、trusted.xml进行调整(如果没有、则创建); 

2.vi编辑public.xml文件,加入需要开放的端口; 

3.vi编辑trusted.xml文件,加入ip白名单地址; 

4.重启防火墙,systemctl restart firewalld.service; 

5.1public.xml 

public.xml是公共网络配置,只需要开启端口或服务即可,比如:ssh服务、dhcpv6-client服务,80、443端口。  

配置样例如下: 

Ansible搭建K8S说明_Ansible搭建_39

5.2trusted.xml 

trusted.xml是受信任网络配置,把ip白名单或者网段添加进来即可,比如: 

10.244.0.0/16网段(B级别网段,K8S容器集群ip网段),172.30.128.0/24(K8S物理服务器节点ip网段,通常是C级别网段,根据实际情况来调整);10.23.237.71是单个特定要访问的ip地址(根据实际情况来调整)。 

配置样例如下: 

Ansible搭建K8S说明_Ansible_40

5.3参考文档 

关于K8S集群防火墙调整的详细说明请查看《K8S集群搭建开放防火墙调整说明》文档。 

6参考连接 

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​

7写在最后 

这次学习使用ansible搭建K8S(非高可用),让我对K8S的安装又打开了新思路,之前是使用软件安装的,而本次是直接使用二进制编译安装,也初步学习了解了ansible的一些基本用法和语法结构,并进行梳理总结。 

7.1调整部分 

因为网上使用的是比较新的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。 

7.2技能收获 

在之前有考虑过脚本化K8S部署,准备使用shell脚本的方式实现,现在看来这个想法还不够成熟。ansible的使用方法和之前想到的脚本不太相同,ansible的语法逻辑对于我来说是比较陌生的。经过1天半的学习研究,加上实际操作成功把K8S部署制作出来。同时因为需要调整K8S版本,让我深入了解了ansible的使用方法。 

7.3后续展望 

本次成功只是阶段性的胜利,后面还有外围产品、软件的一键部署安装,K8S高可用的一键部署安装。目前只是初步了解,后面还有更加困难的问题在等待着我,但我相信我一定可以攻克困难,取得成功。 

这里要说明下,其实不仅是K8S相关的需要一键部署,我们现在做的许多事情都可以写成脚本一键执行,比如传统的redis部署,MySQL安装等。后续在做重复工作时,一定要考虑简化操作一键部署的可能性,这样即节省时间,又可以降低人工操作失误导致的问题。