mac系统搭建k8s集群

137 阅读7分钟

mac下k8s集群搭建

手上有一台mac电脑,想搭建一个k8s集群练练手,主要是光看k8s文档不练,没什么用,有几种方案可供选择。

  • 通过k3d一行命令就可以创建一个k3s集群,是一个轻量级的k8s集群,各种接口都有。
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
k3d cluster create learn-k8s
  • 安装docker desktop、rancher desktop 有可视化的客户端或者网页可供使用
  • 参考minikube官网两行命令就能成功安装。

以上的方式基本上都是单节点,或者集成式的,基本上一行命令就能搞定,不够真实,接下来安装一个三节点的k8s集群来进行练手,有钱的可以直接购买云主机,本文手把手教你通过virtualbox进行搭建,由于公司可以访问外网,少了很多麻烦事。

安装virtualbox

virtualbox官网选择适合自己的版本,我的是M1芯片,选择- macOS / Apple Silicon hosts就行了,安装到本地后自动就是中文了,很方便。

下载ubuntu镜像

因为是M1芯片,一定要下载arm版本的ubuntu镜像ubuntu-24.04.3-live-server-arm64.iso,这个地方是个坑,我直接选择了国内镜像,下载了amd的,导致通过virtualbox安装的时候,死活不能成功。

安装ubuntu虚拟机

安装也比较简单,主节点选择2核4G,稍后的worker节点选择2核2G,硬盘就默认选择25G。 image.png

image.png image.png

image.png 创建成功后,启动即可,会有一个终端,一路回车即可,没什么特别设置的。

image.png 接下来设置网卡和安装ssh,可以直接ssh到虚拟机内。设置两个网卡一个是NAT,一个是host-only。你只需要点击创建选择默认值即可,不需要任务特别的设置。其中NAT网络是为了让虚拟机访问外网,host-only让虚拟机和主机实现互连。

image.png

image.png 设置虚拟机的网卡,点击虚拟机的设置,然后在网络里面对网卡1选择NAT方式即可,网卡2选择host-only

image.png

image.png 唯一需要注意的是网卡1和网卡2的MAC地址,稍后可能会用到。设置网络适配器,重新启动服务器,进入到/etc/netplan,可以看到里面有个50-cloud-init.yaml文件内容如下,说明enp0s8网卡是NAT的

network:
  version: 2
  ethernets:
    enp0s8:
      dhcp4: true

我们把这个配置名称修改为bak,让其失效,mv 50-cloud-init.yaml 50-cloud-init.yaml.bak。新建文件00-installer-config.yaml,内容如下。其中enp0s9设置为静态IP,即网卡2host-only,我当时按照网上的教程,把enp0s8和enp0s9搞反了,结果就是不能访问外网,是个坑。

network:
  ethernets:
    enp0s8:
      dhcp4: true
    enp0s9:
      dhcp4: false
      addresses: [192.168.56.2/24]
  version: 2

还有一个坑就是可能你的网卡不叫enp0s8、enp0s9,那么照抄我的配置也是无效的,我当时按照网上的教程,别人的网卡名称是enp0s3,照抄无效咯。怎么确定呢?执行ip link,根据显示的Mac地址确定那个是NAT网卡,那个是host-only网卡。

image.png 完成设置后执行netplan apply,这个时候在虚拟机执行ping www.baidu.com 以及在主机执行ping 192.168.56.2,应该是都能ping通。

这个镜像好像是自带ssh,如果没有自行安装即可,修改ssh配置vim /etc/ssh/sshd_config,允许root用户链接。启动service ssh start image.png

宿主机终端执行ssh root@192.168.56.2,第一次通过密码登录,把本机的公钥拷贝到虚拟机/root/.ssh/authorized_keys即可。

创建worker节点

成功创建了master主机后,关机master虚拟机,选择复制生成worker节点,为了节省空间和时间选择“链接复制”、为所有网卡重置MAC地址。 image.png 设置worker1的网络适配器,静态ip设置为192.168.56.3,别忘了执行netplan apply

network:
  ethernets:
    enp0s8:
      dhcp4: true
    enp0s9:
      dhcp4: false
      addresses: [192.168.56.3/24]
  version: 2

image.png worker2设置为,别忘了执行netplan apply

network:
  ethernets:
    enp0s8:
      dhcp4: true
    enp0s9:
      dhcp4: false
      addresses: [192.168.56.4/24]
  version: 2

image.png

安装k8s,搭建集群

准备工作

在3台虚拟机安装docker,按照docker官网来即可,一般我们都是root账户登录的虚拟机,所以命令前面的sudo可以去掉。

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

修改虚拟机名称

sudo hostnamectl set-hostname master
sudo hostnamectl set-hostname worker1
sudo hostnamectl set-hostname worker2

安装完成后需要你再对Docker的配置做一点修改,在“/etc/docker/daemon.json”里把cgroup的驱动程序改成 systemd ,然后重启Docker的守护进程。

cat <<EOF | sudo tee /etc/docker/daemon.json 
{
    "exec-opts": [
        "native.cgroupdriver=systemd"
    ],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m"
    },
    "storage-driver": "overlay2"
} 
EOF 

sudo systemctl enable docker 
sudo systemctl daemon-reload 
sudo systemctl restart docker

为了让Kubernetes能够检查、转发网络流量,你需要修改iptables的配置,启用“br_netfilter”模块

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf 
br_netfilter 
EOF 

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf 
EOF 

sudo sysctl --system

需要修改“ /etc/fstab”,关闭Linux的swap分区,提升Kubernetes的性能:

sudo swapoff -a 
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

修改每台主机的/etc/hosts,添加

192.168.56.2 master
192.168.56.3 worker1
192.168.56.4 worker2

image.png 在所有节点完成上面的工作后,重启一下虚拟机

安装kubeadm

sudo apt install -y apt-transport-https ca-certificates curl

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt update

sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

验证是否安装成功

kubeadm version kubectl version --client

另外按照Kubernetes官网的要求,我们最好再使用命令 apt-mark hold ,锁定这三个软件的版本,避免意外升级导致版本错误

sudo apt-mark hold kubeadm kubelet kubectl

安装master节点,公司可以访问Google,所以这一步少了很多麻烦,如果是国内的网络,需要搜一下解决办法,一般是下载国内的镜像,docker tag改名。

sudo kubeadm init \ 
   --apiserver-advertise-address=192.168.56.2 \
   --pod-network-cidr=10.244.0.0/16 \ 
   --kubernetes-version=v1.23.3

成功安装后,拷贝kubectl配置文件

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

另外还有一个很重要的“kubeadm join”提示,其他节点要加入集群必须要用指令里的token和ca证书,所以这条命令务必拷贝后保存好:

kubeadm join 192.168.10.210:6443 --token tv9mkx.tw7it9vphe158e74 \
	--discovery-token-ca-cert-hash sha256:e8721b8630d5b562e23c010c70559a6d3084f629abad6a2920e87855f8fb96f3

为了让worker1、worker2节点加入到k8s集群,还需要安装flannel网络插件,在整个集群中创建一个虚拟网络,让不同节点上的 Pod 能像在同一局域网一样互相访问。在master节点执行

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

安装worker节点

在worker节点之前拷贝的kubeadm join即可

kubeadm join 192.168.10.210:6443 --token tv9mkx.tw7it9vphe158e74 \
	--discovery-token-ca-cert-hash sha256:e8721b8630d5b562e23c010c70559a6d3084f629abad6a2920e87855f8fb96f3

验证

在master节点执行kubectl get nodes -o wide,可以看到节点都reday了。worker节点执行kubeadm join后,需要等一会才能看到reday,因为下载镜像需要一点时间。 image.png 不过现在有一个坑,worker1和worker2中的pod不能互相访问。后续搭建部署一个WordPress就能发现这个坑了,现在修复一下。在master节点执行kubectl -n kube-flannel edit daemonset.apps/kube-flannel-ds,增加--iface=enp0s9 指定host-only 网卡

image.png 具体的原因chatgpt解释的很详细。Flannel VXLAN 默认使用默认路由的第一个接口发送包。如果该接口是 NAT,节点间可能无法直接互通,导致 overlay 网络无法搭建。

image.png