项目 | 版本 |
---|---|
处理器 | 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 Fusion 专业版 12.2.3
应用许可证问题请自行解决
下载地址:CentOS 7 m1
点击新建,选择从光盘或镜像中安装,找到下载的镜像文件,点击继续,操作系统选择Linux中的其他 Linux 5.x 内核 64 位 ARM,继续,点击自定设置,为新的虚拟机命名,如“basic”,点击存储,在弹出的 basic:设置窗口中自定义虚拟机设置,如处理器和内存,我选择 4 核 8192MB,要继续修改其他项,请点击上方的“显示全部”,我选择将硬盘调整为 100GB,点击应用并关闭设置窗口。(网络适配器默认“与我的 Mac 共享”不作改动)
如果希望自定义虚拟机 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
点击虚拟机 basic 窗口最中间的图标启动,不要选择默认项,请使用方向键切换到第一项并回车,直接开始安装。
等待。。。
语言默认就好,点击 Continue
点击Time & Date,选咱们伟大的母亲,点左上方 Done
点击Root Password,为管理员用户 root 设置密码,自学图方便,设置为 root 即可,输入两遍,点击 Done,提示太简单了,不管,再次点击 Done
点击右上方的Installation Destination,可以不管,直接 Done
点击 Begin Installation
等待。。。
点击 Reboot System
(按照这个步骤安装的虚拟机是默认没有 GUI 的)
启动时的选项不用管,等待 5 秒或者回车进入系统。
此时来到熟悉的命令交互界面
输入用户名 root 并回车,然后输入密码 root 回车,成功登录。
虚拟机的网络我们选择的是与 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 台主节点,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 回车,再输入密码即可):
#编辑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
systemctl stop firewalld && systemctl disable firewalld
由于是适用于 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 已经成功关闭
crontab -e
此时会以 vi 模式打开一个文件,输入以下内容
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
保存并退出
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
modprobe br_netfilter
lsmod | grep br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
主要用于实现 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
vi /etc/fstab
在最后一行前面加个#把它注释掉,保存退出,然后重启:
init 6
此处我们安装 Docker,值得注意的是,Kubernetes 1.24 版本开始便不再支持 Docker,个中缘由有兴趣的同学可以自行搜索相关资料,废话不多说,我们开整。
yum install -y wget
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#安装
yum install -y docker
#设置Docker开机自启动
systemctl enable docker
关机
init 0
后续操作有的并不是每一台虚拟机都需要做的,一定要看仔细了!!!
将克隆出的 4 台虚拟机分别登录,将 IP 地址依次修改为 10.0.0.22、23、24、25
vi /etc/sysconfig/network-scripts/ifcfg-ens160
别忘了重启网络服务
systemctl restart network
然后就又可以快乐的用我的 iTerm 来远程登录了!
开黑了哈哈!
将 5 台机器分别配置其主机名
hostnamectl set-hostname master-1
剩下 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,再输入密码,成功传输文件
master-1 和 master-2 执行此配置!!!
[root@master-1 ~]# yum install -y haproxy keepalived
[root@master-2 ~]# yum install -y haproxy keepalived
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 文件进行修改!!!
[root@master-1 ~]# systemctl start haproxy && systemctl enable haproxy
[root@master-2 ~]# systemctl start haproxy && systemctl enable haproxy
该配置文件也提供了下载keepalived.conf,需要注意修改的地方已经在其中注释说明.
上传:
scp ~/Downloads/keepalived.conf [email protected]:/etc/keepalived/keepalived.conf
scp ~/Downloads/keepalived.conf [email protected]:/etc/keepalived/keepalived.conf
请分别对两个 keepalived.conf 文件进行修改!!!
脚本文件请点击此处下载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
[root@master-1 ~]# systemctl start keepalived && systemctl enable keepalived
[root@master-2 ~]# systemctl start keepalived && systemctl enable keepalived
[root@master-1 ~]# ip a s ens160
[root@master-1 ~]# ss -anput | grep ":16443"
[root@master-2 ~]# ss -anput | grep ":16443"
以下操作所有主机都要进行!!!
点击此处下载 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 台均要执行):
yum install -y --setopt=obsoletes=0 kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes
[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 台虚拟机均需操作:
systemctl enable kubelet
集群所需的一些 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
此部分在 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
此部分在 master-1 中操作即可
现在安装 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
下载可执行文件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
通过~/.kube/config 连接 kubernetes 集群,查看已运行节点
[root@master-1 ~]# DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes
在 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
那么恭喜你,该节点成功加入了集群,并且根据提示也需要执行这 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 后所跟的口令即可
与 master 节点加入集群类似,worker 节点执行的是框 4 中的命令
[root@worker-1 ~]# kubeadm join 10.0.0.100:16443 --token 7t2weq.bjbawausm0jaxury \
> --discovery-token-ca-cert-hash sha256:42f206b47124b60871d2b3f8d87be3a61f8c0f40a4f630b832935ac1e919cbdc
查看集群中所有节点:
[root@master-1 ~]# kubectl get nodes
[root@master-1 ~]# kubectl get pods -n kube-system
[root@master-1 ~]# kubectl get pods -n calico-system
[root@master-1 ~]# DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes
尝试部署第一个应用:
下载这个 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
将 master-1 和 worker-2 启动,再次执行上述命令
[root@master-2 ~]# kubectl get nodes
[root@master-1 ~]# kubectl delete deployment mysql
本文至此告一段落,如果有读者朋友发现纰漏,欢迎在评论区指出。
另外需要指出的是,本文软硬件环境限制较大,若有不同环境配置的,请注意本文仅作参考。
如果有兴趣来到马士兵教育学习的,记得私信我哈。
最后祝愿我们所有人工作顺利,身体健康,拜拜!