Mac搭建本地k8s环境目前网上有N多的博客文章,无非就是minikube、docker-desktop、kubeadm去部署,对于我个人需求,由于后期需要对原生的 scheduler 进行自定义的扩展开发,我需要能够有机会改动静态POD的manifests文件进行改动与配置。

前期通过 minikube 及 docker-desktop 进行过本地k8s集群的部署,但是发现此种沙盒环境无法对静态POD进行配置改动,只能围着k8s做周边的应用测试,没法满足我的需求,最后决定通过kubeadm进行k8s本地环境部署。

所以最终选择: Virtualbox + Centos7 镜像进行单节点k8s部署【此环境只做组件部署及逻辑验证】

VirutalBox安装及Centos 虚拟机安装

具体的介绍就不多介绍了,我选用的为 6.1.4 没有选用最新的版本,主要是担心出了问题可能没有最新及时的资料可以参考。

如何创建虚机就不多介绍了,但是以下注意点需要注意:

  • 虚机CPU至少分配2核
  • 虚机网络连接选择为bridge,之前选择的Nat模式无法获取本地ip,虽然能通外网。 此现象比较诡异

Kubeadm 安装及K8s集群初始化

由于此次的工作只是作为本地开发测试环境,不作为生产环境的部署方案,所以在这里我只是通过yum 安装,不过对于无网的生产环境部署,实际上也可以通过制作本地yum源来部署,这里就不做扩展讨论了。

更新yum

yum upgrade -y

关闭防火墙

1
2
systemctl stop firewalld 
systemctl disable firewalld

更改Selinux配置

1
2
setenforce 0 //临时改动
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config //写入配置永久改动

关闭 swap

1
2
3
4
swapoff -a
sysctl -w vm.swappiness=0

// 到 /etc/fstab 中将 涉及到 swap 的配置进行注释

网桥参数配置

1
2
3
4
5
6
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

安装 socat

1
yum install socat -y

安装 docker 并启动 docker daemon 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl enable docker
systemctl restart docker

配置 kubernetes 的国内yum源

这里配置的是阿里 yum 源

1
2
3
4
5
6
7
8
9
vcat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装 kubelet、kubectl、kubeadm

由于后续工作是对k8s版本有指定要求的,所以在部署的时候我需要安装指定的k8s 版本组件,可以通过如下命令进行yum list 查看可安装版本
yum list kubelet kubeadm kubectl –showduplicates|sort -r
安装组件指定版本

1
2
3
4
5
yum install -y kubelet-1.19.8-0 kubeadm-1.19.8-0 kubectl-1.19.8-0
systemctl enable kubelet
systemctl daemon-reload
systemctl restart kubelet
systemctl status kubelet

这个时候我们查看 kubelet 的服务没有正常启动,这个是正常的,因为它会关联 kubeadm.conf 这个配置文件,此时我们还没有用kubeadm进行集群的初始化。所以这个反应是正常的。

通过kubeadm初始化k8s集群

1
kubeadm init --kubernetes-version=1.19.8 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16

根据OutPut生成对应的配置文件

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

安装网络插件

由于到了这边我们没有安装网络插件,此时集群的节点状态是NotReady,为了方便后续的维护,我是将 calico.yaml 下载下来放到指定目录方便后续维护的。

1
curl -sSLO https://ms-source.oss-cn-shanghai.aliyuncs.com/calico/yaml/calico-v3.17.0.yaml

部署Calico组件

kubectl create -f calico-v3.17.0.yaml
此步骤结束之后算是k8s集群部署工作算是完成了,但是由于我这边只是一个master节点,kubeadm默认是做了 Taint的污点策略,此时的节点是不可调度的,通过产看pod状态,会出现如下现象:
pod-pending状态

具体原因可以通过如下操作进行查明:
reason

解决使用的命令如下:
kubectl taint nodes --all node-role.kubernetes.io/master-
此时再继续查看pod的状态,可以发现是正常的了。
pods

Tips

  • 将在期望状态的虚机导一份镜像出来,方便后续使用
  • virtualbox 中的虚机个人喜欢无界面启动,此操作可以通过 控制台或者命令行形式进行操作。