打算在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
Master192.168.56.130
Slave1192.168.56.131
Slave2192.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/

Logo

开源、云原生的融合云平台

更多推荐