欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kubernetes(5)——如何从零开始自己搭建一套K8S集群

程序员文章站 2022-05-28 13:24:39
...

创建VM

无论以何种方式计算,首要都是搭建虚拟机。

我们以Centos7.6部署k8s v1.16.4高可用集群(主备模式)[1]为例:

1 部署环境

1.1主机列表

主机名

Centos版本

IP

docker version

flannel version

Keepalived version

主机配置

备注

master01

7.6.1810

172.27.34.3

18.09.9

v0.11.0

v1.3.5

4C4G

control plane

master02

7.6.1810

172.27.34.4

18.09.9

v0.11.0

v1.3.5

4C4G

control plane

master03

7.6.1810

172.27.34.5

18.09.9

v0.11.0

v1.3.5

4C4G

control plane

work01

7.6.1810

172.27.34.93

18.09.9

/

/

4C4G

worker nodes

work02

7.6.1810

172.27.34.94

18.09.9

/

/

4C4G

worker nodes

work03

7.6.1810

172.27.34.95

18.09.9

/

/

4C4G

worker nodes

VIP

7.6.1810

172.27.34.130

18.09.9

v0.11.0

v1.3.5

4C4G

在control plane上浮动

client

7.6.1810

172.27.34.234

/

/

/

4C4G

client

本次K8S实验,因此仅使用标黄色的相关列,2台作为master,2台作为Node。我们以Azure云为例(别问,问就是恰饭)

1.2 创建虚拟机

Kubernetes(5)——如何从零开始自己搭建一套K8S集群

 

这里我们可以选择使用SSH公钥或者使用密码。为了显示菜白高超的技艺,我们使用难度系数更高的SSH公钥模式。

操作方法是,在Microsoft Store应用商店当中下载一个ubuntu操作系统。

打开安装好的Ubuntu操作系统,使用下面的命令创建一个创建 SSH **对。默认情况下,这些文件在 ~/.ssh 目录中创建。 可以指定不同的位置,并指定可选的密码(通行短语)用于访问私钥文件。 如果给定的位置存在同名的 SSH **对,则会覆盖这些文件。

ssh-****** -m PEM -t rsa -b 4096

这时候密码已经创建好了,使用下面的命令来显示创建好的公钥

cat ~/.ssh/id_rsa.pub

创建好的公钥显示值如下所示

ssh-rsa AAAAB3NzaC1yc2EAABADAQABAAACAQC1/KanayNr+Q7ogR5mKnGpKWRBQU7F3Jjhn7utdf7Z2iUFykaYx+MInSnT3XdnBRS8KhC0IP8ptbngIaNOWd6zM8hB6UrcRTlTpwk/SuGMw1Vb40xlEFphBkVEUgBolOoANIEXriAMvlDMZsgvnMFiQ12tD/u14cxy1WNEMAftey/vX3Fgp2vEq4zHXEliY/sFZLJUJzcRUI0MOfHXAuCjg/qyqqbIuTDFyfg8k0JTtyGFEMQhbXKcuP2yGx1uw0ice62LRzr8w0mszftXyMik1PnshRXbmE2xgINYg5xo/ra3mq2imwtOKJpfdtFoMiKhJmSNHBSkK7vFTeYgg0v2cQ2+vL38lcIFX4Oh+QCzvNF/AXoDVlQtVtSqfQxRVG79Zqio5p12gHFktlfV7reCBvVIhyxc2LlYUkrq4DHzkxNY5c9OGSHXSle9YsO3F1J5ip18f6gPq4xFmo6dVoJodZm9N0YMKCkZ4k1qJDESsJBk2ujDPmQQeMjJX3FnDXYYB182ZCGQzXfzlPDC29cWVgDZEXNHuYrOLmJTmYtLZ4WkdUhLLlt5XsdoKWqlWpbegyYtGZgeZNRtOOdN6ybOPJqmYFd2qRtb4sYPniGJDOGhx4VodXAjT09omhQJpE6wlZbRWDvKC55R2d/CSPHJscEiuudb+1SG2uA/oik/WQ== aaa@qq.com

接下来我们使用以下的命令尝试一下链接这台创建好的VM

ssh aaa@qq.com

这里需要将azureuser和myvm.westus.cloudapp.azure.com替换成替换为管理员用户名和完全限定的域名(或 IP 地址)。如果在创建**对时指定了通行短语,则在登录过程中看到提示时,请输入该通行短语。

Kubernetes(5)——如何从零开始自己搭建一套K8S集群

 

2. 高可用架构

Kubernetes(5)——如何从零开始自己搭建一套K8S集群

 

主备模式高可用架构说明:

核心组件

高可用模式

高可用实现方式

apiserver

主备

keepalived

controller-manager

主备

leader election

scheduler

主备

leader election

etcd

集群

kubeadm

  • apiserver 通过keepalived实现高可用,当某个节点故障时触发keepalived vip 转移;
  • controller-manager k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个controller-manager组件运行;
  • scheduler k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个scheduler组件运行;
  • etcd 通过运行kubeadm方式自动创建集群来实现高可用,部署的节点数为奇数,3节点方式最多容忍一台机器宕机。

3. 安装准备工作

主机名

kubelet version

kubeadm version

kubectl version

备注

master01

v1.16.4

v1.16.4

v1.16.4

kubectl选装

master02

v1.16.4

v1.16.4

v1.16.4

kubectl选装

master03

v1.16.4

v1.16.4

v1.16.4

kubectl选装

work01

v1.16.4

v1.16.4

v1.16.4

kubectl选装

work02

v1.16.4

v1.16.4

v1.16.4

kubectl选装

work03

v1.16.4

v1.16.4

v1.16.4

kubectl选装

client

/

/

v1.16.4

client

3.1 配置主机名

3.1.1 修改主机名

因为本菜白在创建的时候已经修改好了主机名,因此这一步可以省略,如果尚未修改,可以在这里修改。

[aaa@qq.com ~]# hostnamectl set-hostname master01
[aaa@qq.com ~]# more /etc/hostname            
master01

退出重新登陆即可显示新设置的主机名master01

3.1.2 修改host文件

 

hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联数据库。当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从hosts文件中寻找对应的 IP 地址,一旦找到,系统就会立即打开对应网页,如果没有找到,则系统会将网址提交 DNS 域名解析服务器进行 IP 地址的解析[2]这里需要注意,之前菜白输入的时候都是$符号,而这里教程显示是#,我们需要通过升级权限,否则的话就会像菜白一样被系统提示-bash: /etc/hosts: Permission denied

我们需要使用下面的命令提升我们的管理权限

[aaa@qq.com ~]$ sudo su

然后使用下面的命令我们修改我们的hosts。

[aaa@qq.com ~]# cat >> /etc/hosts << EOF
172.27.34.3    master01
172.27.34.4    master02
172.27.34.5    master03
172.27.34.93   work01
172.27.34.94   work02
172.27.34.95   work03
EOF

3.2 使用下面的命令验证mac地址uuid,

[aaa@qq.com ~]# cat /sys/class/net/eth0/address
[aaa@qq.com ~]# cat /sys/class/dmi/id/product_uuid

在这里原文和菜白的略有不同,原文查询mac地址的命令如下:

[aaa@qq.com ~]# cat /sys/class/net/ens160/address

但是使用这个命令会显示

cat: /sys/class/net/ens160/address: No such file or directory

这里面的主要区别在原文用的是ens160,而我使用的是eth0。在鸟哥linux私房菜:基础学习篇》第四版有描述这两者区别:新版的CentOS 7 开始对于网卡的编号有另外一套规则,网卡的代号与网卡的来源有关。

eno1:代表由主板bios内置的网卡

ens1:代表有主板bios内置的PCI-E网卡

enp2s0: PCI-E独立网卡

eth0:如果以上都不使用,则回到默认的网卡名[3]

3.3 禁用swap

Swap分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中[4]

kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换。 设计者不想交换,因为它会减慢速度。所以关闭swap主要是为了性能考虑[5]

3.3.1 临时禁用

 

使用下面的命令来临时禁用swap

[aaa@qq.com ~]# swapoff -a

3.3.2 永久禁用

 

毕竟不是有矿家庭,VM可能会需要经常重启,若需要重启后也生效,在禁用swap后还需修改配置文件/etc/fstab,注释swap

[aaa@qq.com ~]# sed -i.bak '/swap/s/^/#/' /etc/fstab

3.4 内核参数修改

本文的K8S网络使用flannel,该网络需要设置内核参数bridge-nf-call-iptables=1,修改这个参数需要系统有br_netfilter模块。

3.4.1 br_netfilter模块加载

 

查看br_netfilter模块:

[aaa@qq.com ~]# lsmod |grep br_netfilter

如果系统没有br_netfilter模块则执行下面的新增命令,如有则忽略。

临时新增br_netfilter模块:

[aaa@qq.com ~]# modprobe br_netfilter

该方式重启后会失效

永久新增br_netfilter模块:

[aaa@qq.com ~]# cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF
[aaa@qq.com ~]# cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF
[aaa@qq.com ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

Kubernetes(5)——如何从零开始自己搭建一套K8S集群

3.5 设置kubernetes

 

3.5.1 新增kubernetes

[aaa@qq.com ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • [] 中括号中的是repository id,唯一,用来标识不同仓库
  • name 仓库名称,自定义
  • baseurl 仓库地址
  • enable 是否启用该仓库,默认为1表示启用
  • gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
  • repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
  • gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了

3.5.2 更新缓存

[aaa@qq.com ~]# yum clean all
[aaa@qq.com ~]# yum -y makecache

3.6 免密登录

3.6.1 创建秘钥

[aaa@qq.com ~]# ssh-****** -t rsa

3.6.2 将秘钥同步至master02/master03

 

[aaa@qq.com ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub aaa@qq.com
[aaa@qq.com ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub aaa@qq.com

3.6.3 免密登陆测试

 

[aaa@qq.com ~]# ssh 172.27.34.4
[aaa@qq.com ~]# ssh master03

master01可以直接登录master02master03,不需要输入密码。但是这部分我自己在进行HOL的时候始终会出现报错。

[aaa@qq.com jalen]# ssh-copy-id  -i /root/.ssh/id_rsa aaa@qq.com
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

尝试了很多方法这个问题都没有解决,如果各位好的方法请不吝赐教。