在 mac 上搭建一个好用的 k8s 集群

平时开发都在 mac,需要一个可以随意折腾的本地的 k8s 环境,一开始用的是 minikube,但是这个东西在我的 mac 和公司的 mac 上表现不同,最后折腾了一遍还是虚拟机比较合适。

mac 上 virtualbox 已经非常好用了,而且免费,推荐使用. 装上 mac 之后,安装一个 ubuntu server 的镜像,系统配置要求最低 2GB,2CPU. 配置网卡 1 为桥接网卡为了和主机通信,网卡 2 为 网络地址转换为了和外网通信。

首先在虚拟机中安装好 docker,具体见 https://yeasy.gitbooks.io/docker_practice/install/ubuntu.html,注意安装时把 ubuntu 的源替换成国内的源 http://mirrors.aliyun.com/ubuntu。
docker 安装好之后配置成国内的 docker 源,sudo vi /etc/docker/daemon.json 输入以下内容:

1
2
3
4
5
6
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"
]
}

然后重启 docker:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

切换到 root 用户,禁止系统开启 swap:

1
vi /etc/fstab

注释掉 swap,手动关闭已经开启的 swap swapoff -a,执行以下命令安装好基础组件:

1
2
3
4
5
6
7
8
9
10
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

systemctl daemon-reload
systemctl restart kubelet

然后使用如下镜像安装 k8s:

1
kubeadm init --image-repository=gcr.azk8s.cn/google_containers

切换到普通用户,拷贝相应的证书让 k8s 可以让普通用户访问:

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

接着安装网络组件:

1
kubectl apply -f https://git.io/weave-kube-1.6

安装 dashboard 插件 https://github.com/kubernetes/dashboard:

1
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

注意:如果不成功,从仓库中下载 yaml 文件修改镜像的地址为 gcr.azk8s.cn/google_containers

安装存储插件 https://rook.io/docs/rook/v1.0/ceph-quickstart.html:

1
2
3
4
cd cluster/examples/kubernetes/ceph
kubectl create -f common.yaml
kubectl create -f operator.yaml
kubectl create -f cluster-test.yaml

注意:如果不成功,从仓库中下载 yaml 文件修改镜像的地址为 gcr.azk8s.cn/google_containers

安装完毕之后检查集群状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
zhyq@dev:~$ kubectl get pods -n kube-system 
NAME READY STATUS RESTARTS AGE
coredns-cf8fb6d7f-5m6pc 1/1 Running 2 7d19h
coredns-cf8fb6d7f-dgl7m 1/1 Running 2 7d19h
etcd-dev 1/1 Running 3 7d19h
kube-apiserver-dev 1/1 Running 3 7d19h
kube-controller-manager-dev 1/1 Running 3 7d19h
kube-proxy-kgjth 1/1 Running 3 7d19h
kube-scheduler-dev 1/1 Running 3 7d19h
kubernetes-dashboard-fcfb4cbc-9n59k 1/1 Running 0 9m18s
weave-net-d6pbh 2/2 Running 6 7d19h

zhyq@dev:~$ kubectl get pods -n rook-ceph
NAME READY STATUS RESTARTS AGE
rook-ceph-agent-82f9n 1/1 Running 0 10m
rook-ceph-detect-version-rpv99 0/1 Terminating 0 10s
rook-ceph-operator-56b7cdb77b-xs8zn 1/1 Running 0 2d22h
rook-discover-9vlj8 1/1 Running 0 10m

让主节点接受 Pod 调度:

1
kubectl taint nodes --all node-role.kubernetes.io/master-

在 mac 本机下载 kubectl 并且加入 bin 目录,通过 ssh 拷贝上面搭建好的 k8s 的 .kube/config 到 mac 的同目录下,配置 kubectl 命令自动补全,使用 zsh:

1
source <(kubectl completion zsh)

在 ubuntu 配置 kubectl 命令补全:

1
2
3
apt-get install bash-completion
echo 'source /usr/share/bash-completion/bash_completion' >> ~/.bashrc
echo 'source <(kubectl completion bash)' >>~/.bashrc

设置虚拟机中的 k8s 为开机启动:

1
sudo systemctl enable kubelet

三月沙 wechat
扫描关注 wecatch 的公众号