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。
创建成功后,启动即可,会有一个终端,一路回车即可,没什么特别设置的。
接下来设置网卡和安装ssh,可以直接ssh到虚拟机内。设置两个网卡一个是NAT,一个是host-only。你只需要点击创建选择默认值即可,不需要任务特别的设置。其中NAT网络是为了让虚拟机访问外网,host-only让虚拟机和主机实现互连。
设置虚拟机的网卡,点击虚拟机的设置,然后在网络里面对网卡1选择NAT方式即可,网卡2选择host-only
唯一需要注意的是网卡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网卡。
完成设置后执行
netplan apply,这个时候在虚拟机执行ping www.baidu.com 以及在主机执行ping 192.168.56.2,应该是都能ping通。
这个镜像好像是自带ssh,如果没有自行安装即可,修改ssh配置vim /etc/ssh/sshd_config,允许root用户链接。启动service ssh start
宿主机终端执行ssh root@192.168.56.2,第一次通过密码登录,把本机的公钥拷贝到虚拟机/root/.ssh/authorized_keys即可。
创建worker节点
成功创建了master主机后,关机master虚拟机,选择复制生成worker节点,为了节省空间和时间选择“链接复制”、为所有网卡重置MAC地址。
设置worker1的网络适配器,静态ip设置为192.168.56.3,别忘了执行
netplan apply
network:
ethernets:
enp0s8:
dhcp4: true
enp0s9:
dhcp4: false
addresses: [192.168.56.3/24]
version: 2
worker2设置为,别忘了执行
netplan apply
network:
ethernets:
enp0s8:
dhcp4: true
enp0s9:
dhcp4: false
addresses: [192.168.56.4/24]
version: 2
安装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
在所有节点完成上面的工作后,重启一下虚拟机
安装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,因为下载镜像需要一点时间。
不过现在有一个坑,worker1和worker2中的pod不能互相访问。后续搭建部署一个WordPress就能发现这个坑了,现在修复一下。在master节点执行
kubectl -n kube-flannel edit daemonset.apps/kube-flannel-ds,增加--iface=enp0s9 指定host-only 网卡
具体的原因chatgpt解释的很详细。Flannel VXLAN 默认使用默认路由的第一个接口发送包。如果该接口是 NAT,节点间可能无法直接互通,导致 overlay 网络无法搭建。