打算在mac上安装一个kubernetes集群,捣鼓了半天minikube和docker for mac,由于众所周知的原因,都以失败告终,后来终于用VirtualBox虚拟机安装成功了。这里是自己的操作记录。
一、准备工作
下载安装包
Ubuntu系统ISO,这里我们使用上海交大的源,安装18.04.3版本:
http://ftp.sjtu.edu.cn/ubuntu-cd/18.04.3/ubuntu-18.04.3-live-server-amd64.iso
网络规划
主机 | IP |
---|---|
Master | 192.168.56.130 |
Slave1 | 192.168.56.131 |
Slave2 | 192.168.56.132 |
二、安装虚拟机
mac上可以通过brew直接安装:
brew cask install virtualbox
也可以下载dmg文件后安装:
https://www.virtualbox.org/wiki/Downloads
配置虚拟机网络
VirtualBox - 偏好设置 - 网络 - 新增
工具 - 网络 这里应该已经默认新建了一个网络,vboxnet0,192.168.56.1/24
三、创建镜像
我们打算搭建一主两从的集群,因此需要三台虚拟机。三台虚拟机的设置很多是一样的,因此可以先把master镜像创建出来,复制两份后再分别设置,这样会快一些。
创建master镜像
安装操作系统
直接“新建”即可。在这里,我们给master取名kubernetes-master,CPU至少2核,内存分配2G,其他默认安装即可。在安装过程中,我们需要创建一个用户,我取名tp,大家随意。
配置虚拟机网络
虚拟机创建成功后,默认只有一个NAT模式的网卡,我们新增一个网卡,用于虚拟网络通信。
右键 - 设置 - 网络
其中网卡1为NAT模式,我们启用网卡2,连接方式为Host-Only,界面名称为上面提到的虚拟网络vboxnet0,然后我们将其启用并设置为固定IP。可以通过ip a
查看系统网络情况,可以发现名为enp0s8
的网络未启动,其mac地址与VirtualBox虚拟机网络设置中的mac地址一致。
修改/etc/netplan/
目录下的yaml文件如下:
network:
ethernets:
enp0s3:
dhcp4: true
enp0s8:
dhcp4: false
addresses: [192.168.56.130/24]
nameservers:
addresses: [114.114.114.114]
version: 2
在实践的过程中,这里遇到一个坑:两个网卡配置好以后,虚拟机-宿主机之间可以相互ping通,但虚拟机ping百度不通。能够解析域名为IP地址,但收不到百度服务器的响应。
原因:我在上述配置中给enp0s8添加了网关,因此访问网络时就会走enp0s8,但该网卡无法上网,因此虚拟机也无法上网了。
解决方案:删除enp0s8的gateway配置
原理:enp0s8有网关后,出口流量就会走这个网关,因此失败了。删掉这个网关后,就会走enp0s3自动分配的网关,因此成功。具体原因大家可以网上搜索一下VirtualBox的四种网络方式和原理。
其中enp0s8
的部分就是我们新增的,addresses
部分即为固定IP。(注意slave节点依照前面的网络规划进行配置)。修改完成后,执行如下命令使配置生效:
sudo netplan apply
可以检查生效情况:
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:20:70:f8 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 86250sec preferred_lft 86250sec
inet6 fe80::a00:27ff:fe20:70f8/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:38:4c:ea brd ff:ff:ff:ff:ff:ff
inet 192.168.56.130/24 brd 192.168.56.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe38:4cea/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:1c:c5:1c:a3 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
配置ssh连接虚拟机
VirtualBox默认的界面看着很不方便,我们采用ssh链接虚拟机。当然如果你也可以跳过这个步骤。Ubuntu镜像里没有安装sshd,因此需要手动安装:
sudo apt-get install openssh-server
启动ssh服务:
sudo /etc/init.d/ssh start
VirtualBox虚拟机默认网络是NAT模式,跟我们系统不处于同一个局域网,但可以通过端口转发后连接虚拟机。具体位置为:设置-网络-高级-端口转发。ssh端口为22,因此我们将子系统端口设置为22;主机端口可以随意设置,只要跟你电脑上的端口不冲突就行,这里我们设置为60022(后面slave机器我们分包设置为61022、62022)。本地测试一下(注意替换自己的用户名):
ssh -p 60022 tp@127.0.0.1
修改时区
我们需要东八区时间
sudo tzselect
根据提示选择中国-北京后,date -R
可以确认当前时间已经正常,然后拷贝到etc目录下
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
安装Docker
https://www.funtl.com/zh/service-mesh-kubernetes/
创建slave镜像
Master镜像创建完成后,可以通过复制,直接生成slave镜像。
步骤:右键-复制
选中镜像,点击"复制",名称分别命名为kubernetes-slave1、kubernetes-slave2,MAC地址设定选择“为所有网卡重新生成MAC地址”
修改主机名
查看当前主机名
hostnamectl
使用 hostnamectl 命令修改,其中 kubernetes-master 为新的主机名,slave节点配置为kubernetes-slave1, kubernetes-slave2
hostnamectl set-hostname kubernetes-master
修改/etc/cloud/cloud.cfg
(如果没有该文件,则可跳过)
该配置默认为 false,修改为 true 即可
preserve_hostname: true
安装Kubernetes
创建集群
sudo kubeadm init --config=kubeadm.yml --upload-certs
集群创建成功后,可以看到如下输出:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.56.130:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:049526494d57eabbef8084a564c9d373b3d3599f449d3fc5701c1a6093a28e53
把上面的join命令记下来,其他节点要加入集群的时候会用到
安装calico
kubectl apply -f https://docs.projectcalico.org/archive/v3.14/manifests/calico.yaml
查看pod状态:
watch kubectl get pods --all-namespaces
等一会,直到所有pod都起来了:
Every 2.0s: kubectl get pods --all-namespaces -o wide kubernetes-master: Tue Nov 3 10:19:52 2020
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system calico-kube-controllers-6b94766748-rg4mp 1/1 Running 0 22m 192.168.237.3 kubernetes-master <none> <none>
kube-system calico-node-rpczf 1/1 Running 0 22m 10.0.2.15 kubernetes-master <none> <none>
kube-system coredns-58cc8c89f4-2wvcx 1/1 Running 0 31m 192.168.237.1 kubernetes-master <none> <none>
kube-system coredns-58cc8c89f4-8bwwd 1/1 Running 0 31m 192.168.237.2 kubernetes-master <none> <none>
kube-system etcd-kubernetes-master 1/1 Running 0 30m 10.0.2.15 kubernetes-master <none> <none>
kube-system kube-apiserver-kubernetes-master 1/1 Running 0 30m 10.0.2.15 kubernetes-master <none> <none>
kube-system kube-controller-manager-kubernetes-master 1/1 Running 0 30m 10.0.2.15 kubernetes-master <none> <none>
kube-system kube-proxy-z2t6q 1/1 Running 0 31m 10.0.2.15 kubernetes-master <none> <none>
kube-system kube-scheduler-kubernetes-master 1/1 Running 0 30m 10.0.2.15 kubernetes-master <none> <none>
slave节点加入集群:
kubeadm join 192.168.56.130:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:049526494d57eabbef8084a564c9d373b3d3599f449d3fc5701c1a6093a28e53
- 如果calico一直起不来,可以考虑将节点删掉再加入
- 如果master节点的calico起不来,可以考虑先把master节点的calico起起来以后再加入slave节点
参考
https://www.funtl.com/zh/service-mesh-kubernetes/