Kubernetes(5)——如何从零开始自己搭建一套K8S集群
创建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 创建虚拟机
这里我们可以选择使用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 地址)。如果在创建**对时指定了通行短语,则在登录过程中看到提示时,请输入该通行短语。
2. 高可用架构
主备模式高可用架构说明:
核心组件 |
高可用模式 |
高可用实现方式 |
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
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可以直接登录master02和master03,不需要输入密码。但是这部分我自己在进行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).
尝试了很多方法这个问题都没有解决,如果各位好的方法请不吝赐教。
[2] 浅析hosts 文件的作用及修改 hosts 文件的方法https://www.jb51.net/article/133910.htm
[5] kubelet为什么关闭swap https://blog.csdn.net/liuliuzi_hz/article/details/79076553