m1使用VMware安装CentOS7并部署k8s高可用集群

m1 使用 VMware 安装 CentOS7 并部署 k8s 高可用集群

一 软硬件环境介绍

项目 版本
处理器 Apple M1 Max
操作系统 macOS Ventura 13.0
虚拟机应用 VMware Fusion 专业版 12.2.3
虚拟机操作系统 CentOS Linux 7 (AltArch)
容器运行时版本 docker 1.13.1
集群版本 Kubernetes 1.21.0

二 在 VMware 上安装 CentOS Linux 7

2.1 安装 VMware

安装包下载地址:VMware Fusion 专业版 12.2.3
应用许可证问题请自行解决

2.2 安装虚拟机

2.2.1 CentOS 镜像文件

下载地址:CentOS 7 m1

2.2.2 新建虚拟机

点击新建,选择从光盘或镜像中安装,找到下载的镜像文件,点击继续,操作系统选择Linux中的其他 Linux 5.x 内核 64 位 ARM,继续,点击自定设置,为新的虚拟机命名,如“basic”,点击存储,在弹出的 basic:设置窗口中自定义虚拟机设置,如处理器和内存,我选择 4 核 8192MB,要继续修改其他项,请点击上方的“显示全部”,我选择将硬盘调整为 100GB,点击应用并关闭设置窗口。(网络适配器默认“与我的 Mac 共享”不作改动)

2.2.3 配置虚拟机 IP 网段

如果希望自定义虚拟机 IP 地址段,请参考此步骤,否则请直接查看步骤 2.2.4。参考博文:修改 VMware Fusion 中的虚拟机网路 IP 地址段
宿主机中打开终端,依次执行以下命令:

#暂停虚拟机网络
sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --stop
#编辑虚拟机网络配置文件
sudo vi /Library/Preferences/VMware\ Fusion/networking

输入用户密码并回车
(不了解 vi 编辑模式的同学请自行上网学习,这里推荐安装 vim 并使用内置的学习文档,MacOS可以使用 Homebrew 安装 vim,命令为brew install vim,至于如何安装及使用 Homebrew,请参考:Homebrew
前面提到的 vim 的内置文档,在安装好之后请执行vim vimtutor.txt进行学习,Linux可以使用yum install -y vim安装)这里赘述一下具体修改操作,输入密码之后请按 i 进入编辑模式,(移动光标请使用方向键)将第 11 行中网络号进行修改,例如修改为:answer VNET_8_HOSTONLY_SUBNET 10.0.0.0(千万注意不要与宿主机所处局域网的网络号相同)
在不修改其他项的情况下,虚拟机 IP 地址为 10.0.0.*,修改完毕先按下 Esc 键退出编辑模式,然后输入:wq 并回车,以此保存并退出。

#配置虚拟机网络
sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --configure
#启用虚拟机网络
sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --start

2.2.4 安装虚拟机

点击虚拟机 basic 窗口最中间的图标启动,不要选择默认项,请使用方向键切换到第一项并回车,直接开始安装。
等待。。。
语言默认就好,点击 Continue
点击Time & Date,选咱们伟大的母亲,点左上方 Done
点击Root Password,为管理员用户 root 设置密码,自学图方便,设置为 root 即可,输入两遍,点击 Done,提示太简单了,不管,再次点击 Done
点击右上方的Installation Destination,可以不管,直接 Done
点击 Begin Installation
等待。。。
点击 Reboot System
(按照这个步骤安装的虚拟机是默认没有 GUI 的)

2.2.5 启动虚拟机

启动时的选项不用管,等待 5 秒或者回车进入系统。
此时来到熟悉的命令交互界面
m1使用VMware安装CentOS7并部署k8s高可用集群_第1张图片
输入用户名 root 并回车,然后输入密码 root 回车,成功登录。

2.2.6 配置虚拟机网络

虚拟机的网络我们选择的是与 Mac 共享,称为网络地址转换(Network Address Translation),就是我们所说的 NAT 模式,具体知识请自行查找相关资料。
此处我们选择为虚拟机配置固定 IP 地址:

#修改虚拟机网络配置文件(最后的160不是必然,请视自身情况而定,如果您不确定,可以在输入到ens处按下tab自动补全)
vi /etc/sysconfig/network-scripts/ifcfg-ens160

在 vi 编辑模式下,修改该配置文件,例如:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#注意修改
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
#UUID请不要拷贝,原有的即可,不用修改,若没有,可以通过命令`uuidgen`生成并自行写入
UUID=ab4efd3a-41ca-4765-b4ff-a4a855c35d47
#以下两项也请参照自己的配置文件名
NAME=ens160
DEVICE=ens160
ONBOOT=yes
PREFIX=24
#根据您的网络号进行配置,例如网络号是10.0.0.0,则该版本VMware的网关是10.0.0.2,有的版本是10.0.0.1(前三个数和网络号前三个数相同)
GATEWAY=10.0.0.2
#该DNS地址仅作为参考
DNS1=119.29.29.29
#配置您想分配给该虚拟机的IP地址,最后一位称之为主机位,范围是[3,254],0不分配给主机,用来标识网络号,1和2为宿主机和网关之一,具体与VMware版本相关
IPADDR=10.0.0.21

Esc,然后输入:wq 保存并退出

#重启虚拟机网络
systemctl restart network

此时虚拟机就可以上网啦~
下面开始安装 k8s 集群,后面的教程主要参考马士兵教育的相关课程,如果有想要报名学习的学生,或者想要转行的朋友,可以私信我,说不定可以争取点优惠哦~

三 集群环境配置

3.1 虚拟机准备

此处部署 3 台主节点,2 台工作节点,在前述安装的虚拟机基础上,需要完整克隆出 5 台虚拟机,分别命名为 master-1,master-2,master-3,worker-1,worker-2
且 master-1 和 master-2 需要配置 keepalived,当这两台主机均宕机时,集群不可用。
有一些操作是每一台虚拟机中都要做的,此处先克隆出一台虚拟机,命名为 master-1,先做一些通用的操作。(此处我直接将 basic 改名为 master-1 进行操作,虚拟机有别的用途的同学可以留着 basic,以后用的时候克隆出来用就好啦)
我选择在宿主机中使用 iTerm,ssh 远程登录到虚拟机中进行下述操作,您也可以使用终端进行 ssh 登录,或者直接在虚拟机窗口操作(首次登录到一台虚拟机,需要二次确认是否要进行连接,输入 yes 回车,再输入密码即可):

m1使用VMware安装CentOS7并部署k8s高可用集群_第2张图片

3.1.1 编辑 hosts 文件

#编辑hosts文件,填入主机名和IP地址对应关系
vi /etc/hosts

在该文件中追加下述行:

10.0.0.21 master-1
10.0.0.22 master-2
10.0.0.23 master-3
10.0.0.24 worker-1
10.0.0.25 worker-2

3.1.2 关闭并禁用防火墙

systemctl stop firewalld && systemctl disable firewalld

3.1.3 关闭 SELINUX

由于是适用于 m1 的非官方镜像,有着其特殊性,不能使用常规的关闭 SELINUX 的方法,下面跟着我来操作吧。参考博文:M1 安装 CentOS 7

vi /etc/grub2-efi.cfg

下面完全跟着我的操作来:
进入 vi 编辑器先不要进入编辑模式,
输入 99
shift+g 来到第 99 行
shift+4 来到行尾
单击键 a 进入追加模式
输入一个空格,然后输入 selinux=0
Esc
:wq
然后输入命令

#重启虚拟机
init 6

此时通过 ssh 登录虚拟机的同学,等待虚拟机启动后再次登录即可

getenforce

如果能看到输出 disabled,则说明 SELINUX 已经成功关闭

3.1.4 同步虚拟机时间

crontab -e

此时会以 vi 模式打开一个文件,输入以下内容

0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com

保存并退出

3.1.5 配置内核转发及网桥过滤

3.1.5.1 添加相关配置文件
vi /etc/sysctl.d/k8s.conf

写入以下内容并保存退出:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
3.1.5.2 加载相关模块
modprobe br_netfilter
3.1.5.3 验证一下
lsmod | grep br_netfilter

查看是否有类似的输出:
图片

3.1.5.4 加载前面添加的配置文件
sysctl -p /etc/sysctl.d/k8s.conf

3.1.6 安装 ipset 和 ipvsadm

主要用于实现 k8s 中 service 的转发,通过 yum 安装即可

yum -y install ipset ipvsadm

配置 ipvsadm 模块加载

vi /etc/sysconfig/modules/ipvs.modules

填写以下内容:

#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

保存并退出

#给上述文件添加可执行权限并执行
chmod +x /etc/sysconfig/modules/ipvs.modules
#执行该文件
/etc/sysconfig/modules/ipvs.modules
#检查一下
lsmod | grep -e ip_vs -e nf_conntrack

看到类似下面的输出:
m1使用VMware安装CentOS7并部署k8s高可用集群_第3张图片

3.1.7 关闭 SWAP 分区

vi /etc/fstab

在最后一行前面加个#把它注释掉,保存退出,然后重启:

init 6

3.2 安装容器运行时

此处我们安装 Docker,值得注意的是,Kubernetes 1.24 版本开始便不再支持 Docker,个中缘由有兴趣的同学可以自行搜索相关资料,废话不多说,我们开整。

3.2.1 安装 wget 命令

yum install -y wget

3.2.2 配置 yum 源使用阿里镜像站

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

3.2.3 安装 Docker

#安装
yum install -y docker
#设置Docker开机自启动
systemctl enable docker

关机

init 0

3.3 克隆虚拟机并继续完善环境配置

后续操作有的并不是每一台虚拟机都需要做的,一定要看仔细了!!!

3.3.1 克隆!

m1使用VMware安装CentOS7并部署k8s高可用集群_第4张图片

3.3.2 配置 IP

将克隆出的 4 台虚拟机分别登录,将 IP 地址依次修改为 10.0.0.22、23、24、25

vi /etc/sysconfig/network-scripts/ifcfg-ens160

别忘了重启网络服务

systemctl restart network

然后就又可以快乐的用我的 iTerm 来远程登录了!

开黑了哈哈!

3.3.3 主机名配置

将 5 台机器分别配置其主机名

hostnamectl set-hostname master-1

剩下 4 台就不写了,自己设置一下~

3.3.4 设置虚拟机之间信任的证书

在 master-1 上执行下述操作:

ssh-keygen

然后 3 次提示均直接回车即可,然后执行下述命令:

#拷贝证书文件并重命名
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
#将该文件分别传给其余4台主机
for i in 2 3 4 5;do scp -r ~/.ssh 10.0.0.2$i:~/;done

依次输入 yes,再输入密码,成功传输文件

四 HAProxy 及 Keepalived 部署

master-1 和 master-2 执行此配置!!!

4.1 安装

[root@master-1 ~]# yum install -y haproxy keepalived
[root@master-2 ~]# yum install -y haproxy keepalived

4.2 HAProxy 配置及启动

4.2.1 HAProxy 配置文件处理

HAProxy 的配置文件请点击此处下载haproxy.cfg,将里边底部的 IP 地址改成自己的,然后覆盖原配置文件就可以了。
在宿主机中下载,通过 scp 传给 master-1 和 master-2(记得宿主机中先切换到下载的文件所在目录,或者带上绝对或相对路径):

scp ~/Downloads/haproxy.cfg [email protected]:/etc/haproxy/haproxy.cfg
scp ~/Downloads/haproxy.cfg [email protected]:/etc/haproxy/haproxy.cfg

请分别对两个 haproxy.cfg 文件进行修改!!!

4.2.2 启动 HAProxy 并设置开机自启动

[root@master-1 ~]# systemctl start haproxy && systemctl enable haproxy
[root@master-2 ~]# systemctl start haproxy && systemctl enable haproxy

4.3 Keepalived 配置及启动

4.3.1 Keepalived 配置文件处理

该配置文件也提供了下载keepalived.conf,需要注意修改的地方已经在其中注释说明.
上传:

scp ~/Downloads/keepalived.conf [email protected]:/etc/keepalived/keepalived.conf
scp ~/Downloads/keepalived.conf [email protected]:/etc/keepalived/keepalived.conf

请分别对两个 keepalived.conf 文件进行修改!!!

4.3.2 上传 Keepalived 需要执行的脚本文件

脚本文件请点击此处下载check_apiserver.sh
上传:

scp ~/Downloads/check_apiserver.sh [email protected]:/etc/keepalived/check_apiserver.sh
scp ~/Downloads/check_apiserver.sh [email protected]:/etc/keepalived/check_apiserver.sh

赋予执行权限:

[root@master-1 ~]# chmod +x /etc/keepalived/check_apiserver.sh
[root@master-2 ~]# chmod +x /etc/keepalived/check_apiserver.sh

4.3.3 启动 Keepalived 并设置开机自启动

[root@master-1 ~]# systemctl start keepalived && systemctl enable keepalived
[root@master-2 ~]# systemctl start keepalived && systemctl enable keepalived

4.4 验证一下

[root@master-1 ~]# ip a s ens160

m1使用VMware安装CentOS7并部署k8s高可用集群_第5张图片

[root@master-1 ~]# ss -anput | grep ":16443"

图片

[root@master-2 ~]# ss -anput | grep ":16443"

图片

五 Kubernetes 1.21.0 集群部署

以下操作所有主机都要进行!!!

5.1 Kubernetes YUM 源准备

点击此处下载 k8s 源配置文件kubernetes.repo
在宿主机上将该配置文件分别传给 5 个虚拟机(注意按照自己的文件路径和虚拟机 ip 地址修改):

for i in 1 2 3 4 5;do scp ~/Downloads/kubernetes.repo [email protected]$i:/etc/yum.repos.d/;done

5.2 集群软件安装

安装制定版本的集群软件(5 台均要执行):

yum install -y --setopt=obsoletes=0 kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes

5.3 配置 kubelet

[root@master-1 yum.repos.d]# vi /etc/sysconfig/kubelet

改成这样:

KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

在 master-1 中修改,并传给其余 4 台虚拟机即可:

[root@master-1 yum.repos.d]# for i in 2 3 4 5;do scp /etc/sysconfig/kubelet [email protected]$i:/etc/sysconfig/kubelet;done

5.4 设置 kubelet 开机自启动

5 台虚拟机均需操作:

systemctl enable kubelet

5.5 集群镜像准备

集群所需的一些 Docker 镜像文件已经准备好了,点击此处下载K8s-1-21-0.tar
老规矩,下载到宿主机并分别上传到虚拟机中(注意路径):

for i in 1 2 3 4 5;do scp ~/Downloads/k8s-1-21-0.tar [email protected]$i:~/;done

然后分别到虚拟机中加载它(一样,注意路径,我传到了 root 用户的根目录下,也没有改变过当前路径,所以就没带路径了):

docker load --input k8s-1-21-0.tar

5.6 集群初始化

此部分在 master-1 中操作即可
下载配置文件Kubeadm-config.yaml
上传到 master-1,老规矩,注意路径

scp ~/Downloads/kubeadm-config.yaml [email protected]:~/

根据自身情况修改 kubeadm-config.yaml 文件!!!
修改好之后执行命令初始化集群(一样,注意配置文件的位置):

kubeadm init --config ~/kubeadm-config.yaml --upload-certs

等待。。。
初始化完成后,会输出一段信息,请务必拿小本本记下来!!!

接下来,执行框 1 和框 2 中的命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

5.7 集群网络准备

此部分在 master-1 中操作即可

5.7.1 安装 calico

现在安装 calico 用于管理集群网络
创建 operator

kubectl create -f https://docs.projectcalico.org/archive/v3.21/manifests/tigera-operator.yaml

下载资源配置文件

wget https://docs.projectcalico.org/archive/v3.21/manifests/custom-resources.yaml --no-check-certificate

将第 13 行的网段改成 kubeadm-config.yaml 中你设置的 pod 的网段,如果与我的一致,则改成 cidr: 10.244.0.0/16 即可
修改后应用(一样注意文件是否要带上路径):

kubectl apply -f custom-resources.yaml

检查一下:

kubectl get pods -n calico-system

图片
删除 master-1 的 taint,使 pod 可以负载到该节点上

kubectl taint nodes --all node-role.kubernetes.io/master-

检查一下联网情况:

kubectl get pods -n kube-system

m1使用VMware安装CentOS7并部署k8s高可用集群_第6张图片

5.7.2 安装 calicoctl

下载可执行文件calicoctl
上传到 master-1

scp ~/Downloads/calicoctl [email protected]:/usr/bin/

添加可执行权限

[root@master-1 ~]# chmod +x /usr/bin/calicoctl

执行并查看版本信息

[root@master-1 ~]# /usr/bin/calicoctl version

m1使用VMware安装CentOS7并部署k8s高可用集群_第7张图片
通过~/.kube/config 连接 kubernetes 集群,查看已运行节点

[root@master-1 ~]# DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes

图片

5.8 集群其它 master 节点加入集群

在 master-2 和 master-3 中,执行集群初始化时打印信息的框 3 中的命令

[root@master-2 ~]# kubeadm join 10.0.0.100:16443 --token 7t2weq.bjbawausm0jaxury \
> --discovery-token-ca-cert-hash sha256:42f206b47124b60871d2b3f8d87be3a61f8c0f40a4f630b832935ac1e919cbdc \
> --control-plane --certificate-key 1343b243f89b4ffc84788e085886a374d2f313cc8d1115a3cad160a49918c1bf

等待一会儿,如果出现下述提示:
m1使用VMware安装CentOS7并部署k8s高可用集群_第8张图片

那么恭喜你,该节点成功加入了集群,并且根据提示也需要执行这 3 条命令:

[root@master-2 ~]# mkdir -p $HOME/.kube
[root@master-2 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master-2 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

master-3 中请执行同样的操作

如果不幸显示加入失败,请查看错误提示信息,如果您在 master-1 初始化后较长时间才执行此操作,注意可能是口令过期,根据提示在主节点重新生成口令

kubeadm init phase upload-certs --upload-certs

并用新生成的口令替换 join 命令中的–certificate-key 后所跟的口令即可

5.9 集群工作节点加入集群

与 master 节点加入集群类似,worker 节点执行的是框 4 中的命令

[root@worker-1 ~]# kubeadm join 10.0.0.100:16443 --token 7t2weq.bjbawausm0jaxury \
> --discovery-token-ca-cert-hash sha256:42f206b47124b60871d2b3f8d87be3a61f8c0f40a4f630b832935ac1e919cbdc

m1使用VMware安装CentOS7并部署k8s高可用集群_第9张图片
成功加入集群
worker-2 执行同样的操作即可

5.10 验证集群可用性

查看集群中所有节点:

[root@master-1 ~]# kubectl get nodes

m1使用VMware安装CentOS7并部署k8s高可用集群_第10张图片
查看集群 pod:

[root@master-1 ~]# kubectl get pods -n kube-system

m1使用VMware安装CentOS7并部署k8s高可用集群_第11张图片
查看 calico 的 pod:

[root@master-1 ~]# kubectl get pods -n calico-system

m1使用VMware安装CentOS7并部署k8s高可用集群_第12张图片
查看网络节点是否全部添加:

[root@master-1 ~]# DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes

m1使用VMware安装CentOS7并部署k8s高可用集群_第13张图片
尝试部署第一个应用:
下载这个 mysql 的 Deployment 资源定义文件mysql-deploy.yaml
上传~

scp ~/Downloads/mysql-deploy.yaml [email protected]:~/

在 master-1 节点上应用它:

[root@master-1 ~]# kubectl apply -f mysql-deploy.yaml

查看状态:

[root@master-1 ~]# kubectl get pods -o wide

图片
可以看到它被负载到了 worker-2 节点中,可以在 worker-2 节点中查看容器实例状态:

[root@worker-2 ~]# docker ps

图片
此时我们关闭 worker-2 节点(根据您的负载情况选择关闭哪一个节点)

[root@worker-2 ~]# init 0

再次查看 pods 状态

[root@master-1 ~]# kubectl get pods -o wide

等了好久,以为翻车了……终于等来了这个状态:
图片
可以看到 pod 被重新负载到了 worker-1 上
此时我们关闭 master-1:

[root@master-1 ~]# init 0

然后在 master-2 中执行命令:

[root@master-2 ~]# kubectl get pods -o wide

图片
查看节点情况:

[root@master-2 ~]# kubectl get nodes

m1使用VMware安装CentOS7并部署k8s高可用集群_第14张图片
将 master-1 和 worker-2 启动,再次执行上述命令

[root@master-2 ~]# kubectl get nodes

m1使用VMware安装CentOS7并部署k8s高可用集群_第15张图片
删掉测试的 Deployment:

[root@master-1 ~]# kubectl delete deployment mysql

六 结束语

本文至此告一段落,如果有读者朋友发现纰漏,欢迎在评论区指出。
另外需要指出的是,本文软硬件环境限制较大,若有不同环境配置的,请注意本文仅作参考。
如果有兴趣来到马士兵教育学习的,记得私信我哈。
最后祝愿我们所有人工作顺利,身体健康,拜拜!

你可能感兴趣的:(kubernetes,容器,云原生,macos,centos)