Ubuntu 20.04搭建Keubernets1.22 keepalived + haproxy高可用集群
文章目录
前言
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具十分广泛可用,也是我们云计算工程师现阶段必须掌握的一门技术。网上类似的教程有很多,在这里我仅站在我的角度来进行一次平台的搭建,希望大家多多点赞、多多批判,就当是抛砖引玉了。
一、Kubernets是什么?
说到Keubernets,就不得不讲讲Docker了。
听到Docker大家应该很熟悉吧。DockerDocker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。docker是目前非常流行的技术,很多公司都在生产环境中使用。但是想要将 Docker 应用于庞大的业务实现,却存在困难的编排、管理和调度问题。于是,我们迫切需要一套管理系统,对 Docker 及容器进行更高级更灵活的管理。所以 Kubernets 就出现了,它为应用程序开发人员提供编排Docker 容器的强大工具,而无需与底层基础设施交互;他就是用于管理容器化的工作负载和服务,可促进声明式配置和自动化;它是一个可移植的、可扩展的开源平台。
二、集群环境准备
1.虚拟机基础环境准备
首先安装一台虚拟机,将基本的软件环境调试好后再进行克隆。
本文从日常使用的笔记本作为宿主机,安装Centos8 作为操作系统,使用KVM虚拟机作为Keubernets集群的主要节点来演示安装的过程。安装 Docker、Kubernetes (使用 kubeadm部署 理由:简单、强大、使用广泛)、Calico(容器网络方案)、kubeadm、kubelet 和 kubectl。为了使集群顺利搭建,我将宿主机以及各个虚拟机节点所要做的设置提前列出来统一进行设置。
环境规划
虚拟机操作系统:CentOS-7-x86_64-DVD-2009
master节点虚拟机配置:2cpu+2GB内存 worker节点虚拟机配置:2cpu+4GB内存
虚拟机网卡:
网卡1:使用KVM的net模式生成,开启DHCP,连接互联网,拉取容器镜像。(默认安装,无需手动生成)
网卡2:使用KVM的lsolated模式创建,用作集群管理地址 ,使用静态IP地址。(需手动添加)
虚拟机和宿主机的网络uuid和MAC地址要保持唯一,主机名及IP对应如下
IP(Internal_network) | hostname |
---|---|
192.168.100.201 | master1 |
192.168.100.202 | master2 |
192.168.100.203 | master3 |
192.168.100.204 | worker1 |
初始化配置
禁用交换分区
禁用 SELINUX
关闭防火墙
加载br_netfilter内核模块,开启IP转发
2. 虚拟机安装
首先使用下面的命令安装好KVM。
2.1 安装KVM
使用下面的命令安装好KVM。
sudo yum groupinstall "Virtualization Host"
sudo yum install -y virt-manager
打开 Virtual Machine Manager (KVM的图形化界面)开始安装虚拟机。
2.2 使用KVM创建虚拟机网络
KVM安装时已默认安装net模式的网络,配置文件名为 default.xml,所以我们只需安装KVM的lsolated 网络。
打开/etc/libvirt/qemu/networks,新建 Internal_isolated.xml 作为lsolated 网络的配置文件。
[root@openstack_node1 networks]# ll
total 8
drwx------ 2 root root 45 Aug 11 00:40 autostart
-rw------- 1 root root 576 Aug 9 21:46 default.xml
-rw------- 1 root root 553 Aug 11 00:37 Internal_isolated.xml
配置文件中的网络参数都是根据上文中我们规划好的网段来规划的。
[root@openstack_node1 networks]# cat Internal_isolated.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit default
or other application using the libvirt API.
-->
<network>
<name>isolated</name>
<uuid>51e3d7df-1e7a-4170-978b-d73248e2d1c3</uuid>
<bridge name='virbr3' stp='on' delay='0'/>
<mac address='52:54:00:c4:e4:a2'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.2' end='192.168.100.254'/>
</dhcp>
</ip>
</network>
这个配置文件可使用net模式的配置文件 default.xml 作为模板,但是uuid和mac都要修改,修改地址最后三小节(只需要修改一个字符就好),保证唯一性。配置文件内的参数就是KVM生成在宿主机上虚拟网卡的参数,我们就使用这张网卡与虚拟机通信,按照前文要求使用静态IP地址。
修改完配置文件保存退出,再重启"libvirted"服务。
systemctl restart libvirtd.service && virsh net-list
root@openstack_node1 ~]# systemctl restart libvirtd.service && virsh net-list
Name State Autostart Persistent
---------------------------------------------
default active yes yes
isolated active no no
可以看到lsolated 网络已经存在了。
1.2
2.3 安装虚拟机
打开Virtual Machine Manager,在左上角依次点击 “file”>“New Virtual Machine”,或者直接点击File下方图标。
这里默认选择net模式,先让虚拟机连接互联网,lsolated网络可后续添加。
至此虚拟机就创建完毕了,下一步就是安装操作系统了,虚拟机安装配置可参考下图。
系统组件安装完成,点击“Reboot"重启进入系统.
2.4 初始化虚拟机网络配置
第一步:激活网卡
在KVM的虚拟机控制台,输入账户密码,使用"ifconfig"查看网络配置,可以看到一张名为"eth0"
的以太网卡,这行网卡就是KVM通过net模式自动生成的网卡,这就是我们的网卡1,作用就是连接互联网,拉取容器镜像。由于这张网卡是默认关闭的,我们使用"ifup eth0"命令临时启用这张网卡。启用后就可以看到已经自动获得了IP地址,此时我们就可以利用这个IP使用宿主机远程访问虚拟机啦。
使用SSH远程访问并查询系统配置如下:
[root@openstack_node1 ~]# ssh root@192.168.122.192
The authenticity of host '192.168.122.192 (192.168.122.192)' can't be established.
ECDSA key fingerprint is SHA256:LSJRsJzqhx25jE1KtLpnLB+MtaHntmc7eQ5VoWfLQj4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.122.192' (ECDSA) to the list of known hosts.
root@192.168.122.192's password:
Last login: Fri Aug 13 13:14:10 2021
[root@localhost ~]# hostnamectl
Static hostname: localhost.localdomain
Icon name: computer-vm
Chassis: vm
Machine ID: 2cf91e028ad04848a6e1947bceab65ef
Boot ID: 87bc548ad5534e7bb1c615382dc6c6b0
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.el7.x86_64
Architecture: x86-64
由于这张网卡是默认关闭的,所以我们需要将他设置为开机自启,否则重启机器后会断连。
只需修改该网卡对应的配置文件中"ONBOOT"(下文中第15行)的参数由no修改为yes,保存退出即可:
[root@master1 ~]# cat -n /etc/sysconfig/network-scripts/ifcfg-eth0
1 TYPE=Ethernet
2 PROXY_METHOD=none
3 BROWSER_ONLY=no
4 BOOTPROTO=dhcp
5 DEFROUTE=yes
6 IPV4_FAILURE_FATAL=no
7 IPV6INIT=yes
8 IPV6_AUTOCONF=yes
9 IPV6_DEFROUTE=yes
10 IPV6_FAILURE_FATAL=no
11 IPV6_ADDR_GEN_MODE=stable-privacy
12 NAME=eth0
13 UUID=022610de-714c-45e3-912c-fdd5fc4f3b54
14 DEVICE=eth0
15 ONBOOT=yes
第二步:增加lsolated网络网卡
首先打开Virtual Machine Manager,选择我们刚刚创建的虚拟机,双击进入虚拟机控制台。
点击左上角的淡黄色小灯泡,打开"show virtual hardware details"这里就是虚拟机的资源控制界面,我们可以在这里对虚拟机的各类配置进行增减。
点击左下角的"Add Hardware"再选择"Network"
"Network source"选项默认会选择NAT网络,这里我们要改成我们前文创建的“lsolated 网络“如下图:
再点击finish就好了。
我们在回到虚拟机:使用"ifconfig"查看网络配置,可以看到多了一张"eth1"的网卡,
[root@master1 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.192 netmask 255.255.255.0 broadcast 192.168.122.255
inet6 fe80::1e5b:7111:84e7:e4e2 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:10:28:8c txqueuelen 1000 (Ethernet)
RX packets 17180 bytes 1097633 (1.0 MiB)
RX errors 0 dropped 3 overruns 0 frame 0
TX packets 862 bytes 76112 (74.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.243 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::6f03:a902:3e3f:5c46 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:7f:f3:1d txqueuelen 1000 (Ethernet)
RX packets 43 bytes 4961 (4.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 15 bytes 2018 (1.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 32 bytes 2592 (2.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 32 bytes 2592 (2.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
由于eth1网卡默认开启DHCP,所以此时获得的IP地址是我们创建的lsolated 网络自动分配的,为了各节点后期配置高可用及稳定性,我们将会在其他节点都安装完成后将IP地址配置为静态IP.
3. Master节点初始化配置
以下操作的目的就是为了集群的规范化管理和成功搭建,其中有很多设置都是集群安装运行的最基本条件,至于为什么,感兴趣的童鞋可以借助百度或自行深入了解,这里不进行展开。(反正不做这些配置安装会报错。。)
3.1修改各节点主机名
第一步:使用hostnamectl set-hostname 主机名 命令修改master节点主机名。
[root@localhost ~]# hostnamectl set-hostname master1
[root@localhost ~]# hostname
hostname
master1
[root@localhost ~]# exit
[root@openstack_node1 ~]# ssh root@192.168.122.192
root@192.168.122.192's password:
Last login: Fri Aug 13 13:21:00 2021 from gateway
ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1628875260
[root@master1 ~]#
3.2添加各节点主机名和IP的映射
编辑 /etc/fstab文件,在文件末尾添加上文中规划好的集群的主机名和对应的IP地址。(3-6行)
首先回到宿主机操作:
[root@openstack_node1 ~]# cat -n /etc/hosts
1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
3 192.168.100.201 master1
4 192.168.100.202 master2
5 192.168.100.203 master3
6 192.168.100.204 worker1
登陆到master1节点操作:
[root@master1 ~]# cat -n /etc/hosts
1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
3 192.168.100.201 master1
4 192.168.100.202 master2
5 192.168.100.203 master3
6 192.168.100.204 worker1
3.3关闭SWAP(交换)分区
第一步:使用 swapoff -a 临时关闭(重启后会恢复原配置)
[root@localhost ~]# free
total used free shared buff/cache available
Mem: 1881844 220440 1372532 17044 288872 1493708
Swap: 2097148 0 2097148
[root@localhost ~]# swapoff -a
[root@localhost ~]# free
total used free shared buff/cache available
Mem: 1881844 218784 1374208 17044 288852 1495372
Swap: 0 0 0
第二步:修改/etc/fstab配置文件
在/dev/mapper/centos-swap swap 前面加上#号,注释掉这一行,使其开机不自动挂载分区。
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Aug 13 13:04:58 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=f0d3a5a3-c876-4d59-9cba-c39d401cb24a /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
3.4禁用 SElinux
SElinux 有三个模式(可由用户设置)。这些模式将规定 SELinux 在主体请求时如何应对。这些模式是:
Enforcing 强制— SELinux 策略强制执行,基于 SELinux 策略规则授予或拒绝主体对目标的访问
Permissive 宽容— SELinux 策略不强制执行,不实际拒绝访问,但会有拒绝信息写入日志
Disabled 禁用— 完全禁用SELinux
第一步:使用“getenforce"命令查询SElinux状态。
[root@master1 ~]# getenforce
Enforcing
第二步:使用"setenforce 0"临时改变运行状态为 “Permissive“,(这一步可跳过)
[root@master1 ~]# setenforce 0
[root@master1 ~]# getenforce
Permissive
第三步:修改SElinux配置文件 /etc/selinux/config ,永久改变SElinux状态。
将配置文件中"SELINUX=“的参数改为"disabled”,保存退出,重启master1.再次查看,状态已修改为"Disabled"
[root@master1 ~]# cat -n /etc/selinux/config
1
2 # This file controls the state of SELinux on the system.
3 # SELINUX= can take one of these three values:
4 # enforcing - SELinux security policy is enforced.
5 # permissive - SELinux prints warnings instead of enforcing.
6 # disabled - No SELinux policy is loaded.
7 SELINUX=disabled
8 # SELINUXTYPE= can take one of three values:
9 # targeted - Targeted processes are protected,
10 # minimum - Modification of targeted policy. Only selected processes are protected.
11 # mls - Multi Level Security protection.
12 SELINUXTYPE=targeted
13
14
[root@master1 ~]# getenforce
Disabled
3.5关闭防火墙
关闭防火墙使用如下两条命令即可关闭:
systemctl stop firewalld.service ##停止防火墙服务
systemctl disable firewalld.service ##禁止开机启动
查看服务,防火墙已关闭
[root@master1 ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
Aug 20 13:31:16 master1 systemd[1]: Starting firewalld - dynamic firewall daemon...
Aug 20 13:31:16 master1 systemd[1]: Started firewalld - dynamic firewall daemon.
Aug 20 13:31:16 master1 firewalld[717]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.
Aug 20 13:37:36 master1 systemd[1]: Stopping firewalld - dynamic firewall daemon...
Aug 20 13:37:36 master1 systemd[1]: Stopped firewalld - dynamic firewall daemon.
3.6加载br_netfilter 模块、开启IP转发
1.开启IP转发
修改 /usr/lib/sysctl.d/00-system.conf 文件:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
添加:
net.ipv4.ip_forward = 1
完整配置如下:
[root@master1 sysctl.d]# cat 00-system.conf
# Kernel sysctl configuration file
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_forward = 1
- 加载br_netfilter 模块
使用"modprobe br_netfilter"加载 br_netfilter 模块
[root@master1 ~]# modprobe br_netfilter
[root@master1 ~]# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
但是重启后后模块会失效,编写开机自动加载脚本
在/etc/新建rc.sysinit 文件
[root@master1 ~]# cat /etc/rc.sysinit
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
在/etc/sysconfig/modules/目录下新建文件如下
vim /etc/sysconfig/modules/br_netfilter.modules
[root@master1 ~]# cat /etc/sysconfig/modules/br_netfilter.modules
modprobe br_netfilter
使用"chmod 755 br_netfilter.modules"增加权限
[root@master1 ~]# cd /etc/sysconfig/modules/
[root@master1 modules]# chmod 755 br_netfilter.modules
重启后 模块自动加载
[root@localhost ~]# lsmod |grep br_netfilter
br_netfilter 22209 0
bridge 136173 1 br_netfilter
3.7安装ipvsadm
使用"yum install ipvsadm -y"安装ipvsadm。
[root@master1 ~]# yum install ipvsadm -y
安装完成使用"ipvsadm --save > /etc/sysconfig/ipvsadm" 命令生成默认配置文件,避免服务启动失败。
ipvsadm --save > /etc/sysconfig/ipvsadm
启动ipvsadm服务,并设置开机启动。
systemctl start ipvsadm && systemctl enable ipvsadm
验证服务状态:
[root@master1 ~]# systemctl status ipvsadm.service
● ipvsadm.service - Initialise the Linux Virtual Server
Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor preset: disabled)
Active: active (exited) since Sat 2021-08-28 14:10:25 EDT; 3min 24s ago
Main PID: 1860 (code=exited, status=0/SUCCESS)
Aug 28 14:10:25 master1 systemd[1]: Starting Initialise the Linux Virtual Server...
Aug 28 14:10:25 master1 systemd[1]: Started Initialise the Linux Virtual Server.
至此我们的虚拟机基础配置已经做完,接下来就是以此虚拟机为模板,克隆其他节点。
4、安装K8S其他节点
4.1、使用master1克隆K8S其他节点
使用master1为模板克隆其他节点。右键点击"clone".名称改一下,其他默认即可。
依次clone其他三个节点,master2、master3、worker1.
4.2、配置节点网络及ssh免密登陆
4.2.1、配置节点网络
克隆自master1的其他节点的 net网络和 isolated网络均是DHCP获取ip地址,且克隆时MAC地址已自动变更所以无需改动。
这里我们只需要将 isolated网络,对应的网卡设置为我们前文规划好的静态IP即可。
以下是修改好的配置文件,大家可参考修改。
由于isolated网络对应的配置文件没有被创建,这里我们需要手动创建一个,由上文得知我们isolated网络对应的网卡是eth1. 所以在/etc/sysconfig/network-scripts下 创建eth1配置文件
使用eth0 配置文件作为模板
[root@master2 ~]# cd /etc/sysconfig/network-scripts/
[root@master2 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
```javascript
[root@master2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
**BOOTPROTO=static ##由"dhcp"改为"static"**
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth1 ##将 NAME 由"eth0"改为"eth1"
UUID=022610de-714c-45e3-912c-fdd5fc4f3b64 ##需保持唯一性,修改最后字符便可
DEVICE=eth1 ##将 DEVICE 由"eth0"改为"eth1"
ONBOOT=yes
IPADDR=192.168.100.202 ##新增配置
NETMASK=255.255.255.0 ##新增配置
GATEWAY=192.168.100.1 ##新增配置
DNS1=192.168.100.1 ##新增配置
依次修改完所有的节点配置文件,重启虚拟机。(在每个节点都需要执行)
在宿主机使用"ping 主机名 "依次测试,能够ping 通则说明网络配置完成。
[root@openstack_node1 networks]# ping worker1
PING worker1 (192.168.100.204) 56(84) bytes of data.
64 bytes from worker1 (192.168.100.204): icmp_seq=1 ttl=64 time=0.273 ms
4.2.1、配置ssh免密登陆
为了使各个节点之间方便登陆,这里我们做一下ssh免密登陆。
依次在每个节点执行以下命令:
ssh-keygen -t rsa ##生成公钥
ssh-copy-id master1 ##拷贝公钥到除自己以外的其他节点上
拷贝按照要求输入"yes"以及"密码"
5、Kubernets环境部署
5.1、配置NTP服务
1、安装ntp,需要在所有节点执行。
[root@master1 ~]# sudo yum install ntp -y ## 安装ntp
[root@master1 ~]# systemctl restart ntpd && systemctl enable ntpd && systemctl status ntpd
2、修改集群ntp服务器配置文件
root@Worker:/etc# vim /etc/ntp.conf
root@Worker:/etc# vim /etc/ntp.conf