multipass + k8s for mac pro m1芯片快速搭建学习环境
背景:
使用mac m1芯片笔记本,为了快速搭建k8s学习环境,整理完善了一键安装形成脚本。
提前准备:
ubuntu@master01:/k8s$ ls soft/v1.23.14/
#docker安装包提前下载好,节约安装下载时间
docker-buildx-plugin_0.10.2-1~ubuntu.22.04~jammy_arm64.deb
docker-ce-cli_5%3a23.0.1-1~ubuntu.22.04~jammy_arm64.deb
docker-ce-rootless-extras_5%3a23.0.1-1~ubuntu.22.04~jammy_arm64.deb
docker-ce_5%3a23.0.1-1~ubuntu.22.04~jammy_arm64.deb
docker-compose-plugin_2.16.0-1~ubuntu.22.04~jammy_arm64.deb
#kubernetes离线镜像,节省下载时间
#slave离线镜像
k8s-slave.v3.21.6.tar
#master离线镜像
k8s-images.v1.23.14.tar
#kubernetes安装文件
cri-tools_1.26.0-00_arm64.deb
kubectl_1.23.14-00_arm64.deb
kubeadm_1.23.14-00_arm64.deb
kubelet_1.23.14-00_arm64.deb
kubernetes-cni_1.2.0-00_arm64.deb
#calico.yaml文件下载
calico.yaml
一 安装主脚本
一键安装,直接执行:main_install.sh
#!/bin/bash
#机器要开启ip转发,multipass里面ubuntu才能上网
sudo sysctl -w net.inet.ip.forwarding=1
#启动master 节点,根据初始化参数,初始化机器
multipass launch -n master01 -c4 -m 4G -d 40G --cloud-init cloud-init_sshd_runcmd.txt
#启动slave节点
multipass launch -n slave01 -c4 -m4G -d 40G --cloud-init cloud-init_sshd_runcmd.txt
multipass launch -n slave02 -c4 -m4G -d 40G --cloud-init cloud-init_sshd_runcmd.txt
#挂载目录,用于离线文件安装,这里会重试2次
if [ $(multipass list | grep master01 | grep Running |wc -l) -eq 1 ];then
multipass mount /Users/vbear/myapp/multipass/k8s master01:/k8s
else
echo "master01 服务器没有启动正常,等5秒后,继续启动挂载"
sleep 15
multipass mount /Users/vbear/myapp/multipass/k8s master01:/k8s
sleep 2
fi
if [ $(multipass list | grep master01 | grep Running |wc -l) -ne 1 ];then
echo "master01 服务器没有挂载成功,退出"
exit 10
fi
if [ $(multipass list | grep -E 'slave01|slave02' | grep Running |wc -l) -eq 2 ];then
echo "开始挂在slave目录"
#挂在子节点目录
multipass mount /Users/vbear/myapp/multipass/k8s slave01:/k8s
multipass mount /Users/vbear/myapp/multipass/k8s slave02:/k8s
else
sleep 15
echo "slave01/slave02 服务器没有启动正常,等5秒后,继续启动挂载"
multipass mount /Users/vbear/myapp/multipass/k8s slave01:/k8s
multipass mount /Users/vbear/myapp/multipass/k8s slave02:/k8s
if [ $(multipass list | grep -E 'slave01|slave02' | grep Running |wc -l) -ne 2 ];then
echo "slave01|slave02 服务器没有挂载成功,退出"
exit 20
fi
fi
#执行安装docker和导入脚本
multipass exec master01 sudo sh /k8s/install_docker.sh
multipass exec slave01 sudo sh /k8s/install_docker.sh
multipass exec slave02 sudo sh /k8s/install_docker.sh
sleep 2
#获取master01主机IP
master_ip=`multipass list | grep master01 |awk '{print $3}'`
sleep 2
#安装master和子节点
multipass exec master01 sudo sh /k8s/install_k8s_master.sh
multipass exec slave01 sudo sh /k8s/install_k8s_slave.sh "$master_ip"
multipass exec slave02 sudo sh /k8s/install_k8s_slave.sh "$master_ip"
#查看安装状态
multipass exec master01 kubectl get nodes
二 docker安装脚本
cat install_docker.sh
#!/bin/bash
#查询版本
#sudo apt-cache madison docker-ce | awk '{ print $3 }'
#
#curl -fsSL https://get.docker.com -o docker.sh
#export VERSION=5:19.03.15~3-0~ubuntu-jammy
#sudo sh docker.sh
sudo apt-get install
#避免交互式安装
sudo DEBIAN_FRONTEND=noninteractive apt-get install /k8s/soft/v1.23.14/containerd.io_1.6.18-1_arm64.deb -y
sudo DEBIAN_FRONTEND=noninteractive apt-get install /k8s/soft/v1.23.14/docker-*.deb -y
sudo sh -eux <<EOF
# Install newuidmap & newgidmap binaries
apt-get install -y uidmap
EOF
dockerd-rootless-setuptool.sh install
sudo systemctl start docker && sudo systemctl enable docker
sudo docker version
三 k8s 主脚本
#!/bin/bash
#安装离线k8s安装包,非交互式安装
sudo DEBIAN_FRONTEND=noninteractive apt-get install /k8s/soft/v1.23.14/cri-tools_1.26.0-00_arm64.deb -y
sudo DEBIAN_FRONTEND=noninteractive apt-get install /k8s/soft/v1.23.14/kubernetes-cni_1.2.0-00_arm64.deb -y
sudo DEBIAN_FRONTEND=noninteractive apt-get install /k8s/soft/v1.23.14/kube*.deb -y
#master01导入k8s离线镜像,节省时间
sudo docker load -i /k8s/soft/v1.23.14/k8s-images.v1.23.14.tar
#初始化系统需要的参数
sudo sysctl -w net.ipv4.conf.all.rp_filter=1
sudo DEBIAN_FRONTEND=noninteractive apt install net-tools -y
#master01,初始化k8s操作系统参数
sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --image-repository registry.aliyuncs.com/google_containers>/k8s/install.log
#设置k8s环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#设置网络模式为calico
kubectl apply -f /k8s/calico.yaml
sleep 2
#查看节点
kubectl get node
#获取kube需要的token,方便slave加入群集
k8s_token=`kubeadm token list |grep -v TOKEN |awk '{print $1}'`
k8s_ssl=`openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'`
echo "$k8s_token" > /k8s/k8s_token.conf
echo "$k8s_ssl" > /k8s/k8s_ssl.conf
kubectl get node
四 k8s slave脚本
#!/bin/bash
#安装kube安装包
sudo DEBIAN_FRONTEND=noninteractive apt-get install /k8s/soft/v1.23.14/cri-tools_1.26.0-00_arm64.deb -y
sudo DEBIAN_FRONTEND=noninteractive apt-get install /k8s/soft/v1.23.14/kubernetes-cni_1.2.0-00_arm64.deb -y
sudo DEBIAN_FRONTEND=noninteractive apt-get install /k8s/soft/v1.23.14/kube*.deb -y
#slave01/02导入离线镜像
sudo docker load -i /k8s/soft/v1.23.14/k8s-slave.v3.21.6.tar
#修改操作系统参数
sudo sysctl -w net.ipv4.conf.all.rp_filter=1
sudo DEBIAN_FRONTEND=noninteractive apt install net-tools -y
#得到k8s token,然后加入群集
k8s_token=`cat /k8s/k8s_token.conf`
k8s_ssl=`cat /k8s/k8s_ssl.conf`
master_ip=$1
sudo kubeadm join ${master_ip}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash sha256:${k8s_ssl}
echo "sudo kubeadm join ${master_ip}:6443 --token ${k8s_token} --discovery-token-ca-cert-hash sha256:${k8s_ssl}"
五 验证
5.1 查看状态
multipass exec master01 sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane,master 50m v1.23.14
slave01 Ready <none> 48m v1.23.14
slave02 Ready <none> 48m v1.23.14
5.2 查看网络状态
#建立3个busybox测试镜像
sudo kubectl run access --rm -ti --image busybox /bin/sh
sudo kubectl run access1 --rm -ti --image busybox /bin/sh
sudo kubectl run access2 --rm -ti --image busybox /bin/sh
#查看到了IP
ubuntu@master01:~$ sudo kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
access 1/1 Running 0 102s 172.18.57.194 slave02 <none> <none>
access1 1/1 Running 0 48m 172.18.34.65 slave01 <none> <none>
access2 1/1 Running 0 48m 172.18.34.66 slave01 <none> <none>
#查看是否能夸主机ping,发现是可以正常
/ # ifconfig eth0
eth0 Link encap:Ethernet HWaddr 3E:D9:08:1B:28:21
inet addr:172.18.57.194 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1480 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:0 (0.0 B)
/ # ping 172.18.34.66
PING 172.18.34.66 (172.18.34.66): 56 data bytes
64 bytes from 172.18.34.66: seq=0 ttl=62 time=1.483 ms
64 bytes from 172.18.34.66: seq=1 ttl=62 time=6.542 ms
64 bytes from 172.18.34.66: seq=2 ttl=62 time=0.589 ms