1.本文介绍

  1. 因为公司的需要,我认为有必要学习下K8s。
  2. 本文主要从一名完全不懂Multipass,MicroK8s的新手角度出发,教你理解Multipass工具的作用,如何利用Multipass创建虚拟机。如何在虚拟机里面下载microk8s,并且利用MicroK8s添加一个节点以及其中遇到的各种问题解决方法。学完此篇,你将会得到:熟悉k8s相关的命令。不过有一点,学习此篇,你必须跟着代码操作,而且一定要看我的注释,一定要看我的注释,这样才能理解每一步的作用。

2. 环境准备

  1. 我用的环境是Mac OS,并且是M1芯片。
  2. 如下图:我的物理内存是有16GB的。并且磁盘是512GB的,这个在launch一个VM的时候,会有关系。

3. multipass

3.1 概念理解

  1. 虚拟机(virtual machine),以下都称为VM
  2. Multipass:Multipass 是在 Linux、Windows 或 macOS 上创建完整 Ubuntu 虚拟机的最快方法,也是使用 MicroK8s 的绝佳基础。一句话,Multipass是一个只需通过一条命令即可快速帮助你创建一台虚拟机的工具。
  3. MicroK8S :是 CNCF 认证的 Kubernetes 部署环境,可在工作站或边缘设备上运行。作为一个 snap 包,它可以原生的运行所有 Kubernetes 服务,如果需要还可以打包类库和二进制文件。它的安装仅受限于你的下载速度,而删除 MicroK8S 后不会留下任何痕迹。一句话:MicroK8s就是Kubernetes的缩小版
  4. K8s和MicroK8s都需要一个Linux内核来工作,因此2者都需要Ubuntu环境,所以要用Multipass来创建一个Ubuntu环境。
  5. 总结整个步骤如下
    第一步:现在Mac下载multipass,并且安装一个虚拟机。
    第二步:利用shell进入到虚拟机外壳,然后下载MicroK8s。
    第三步:利用Microk8s的命令添加节点创建多节点集群,说人话就是把多个电脑连接起来

3.2 Mac下载multipass

一定要明确,结果是把mutipass下载到了Mac系统上,我们可以看到软件的图标的。再不济,直接在Mac的Terminal上用命令:which multipass查看安装的路径,成功安装的软件肯定会有路径的。

#第一步:在Mac打开终端terminal
[➜  ~ sudo snap install multipass
#安装完成multipass之后,可以使用multipass version或者muiltipass list命令查看
[➜  ~ multipass version
multipass   1.11.1+mac
multipassd  1.11.1+mac

#第二步:创建一个vm(虚拟机),也就是一个kubernetes的一个Node,-n就是你要起的名字,可以任意起名,我这里命名为microk8s-vm
# ~ multipass launch -n xx节点名字 -c cpu个数 -m 内存xxGB -d 磁盘xxGB,下面的是MicroK8s官方推荐的虚拟机配置,文章开始我说了我电脑的配置,这个时候就用上了,如果电脑配置不够是不行的。
[➜  ~ multipass launch -n microk8s-vm -c 2 -m 4GB -d 40GB
#成功会显示
Launched:xx名字
#查看成功与否,命令multipass list/ls,看状态是否是Running。不是的话,说明VM没有启动
#这里我解析下这个IPv4。上面那个192开头的是内网地址(INTERNAL-IP),后面解决一些错误的时候会用到
[➜  ~ multipass ls
Name                    State             IPv4             Image
microk8s-vm             Running           192.168.64.4     Ubuntu 22.04 LTS
                                          10.1.254.64

#停止一个VM实例
#肃清是指:Purge all deleted instances permanently, including all their data.
[➜  ~ multipass stop microk8s-vm
#删除/肃清一个VM实例,删除实例会遗留一些数据,所以要purge肃清,也就是删除得干净些,两条命令一起使用
[➜  ~ multipass delete microk8s
[➜  ~ multipass purge 

#我安装的软件在哪里
[➜  ~ which multipass
/usr/local/bin/multipass

4.MicroK8s

4.1 在虚拟机中载和卸载MicroK8s步骤

明确:本教程MicroK8s安装在了虚拟机中,在exit退出了VM shell之后,用命令which microk8s是查不到的,除非你是用我总结与参考里的那种更快的方法下载MicroK8s。

#在虚拟机开发,安装东西,需要进入VM Shell里面
# 例如:安装microk8s,我公司使用的是1.24版本,2022年12月已经MicroK8s已经1.26版本了
#如何看最新的版本可以到MicroK8s的官网地址看release,地址我贴在这里了:https://microk8s.io/docs/release-notes
#第一步:进入VM Shell,命令:multipass shell xx你上面写的名字。进入shell就是相当于你已经去到虚拟机的世界了,不是原来的Mac世界了

➜  ~ multipass shell microk8s-vm
#结果:文件位置会出现[ubuntu@xx你launch的名字:~$ 的标志,这个也算是Linux系统的标志了,哈哈
#退出虚拟机外壳
[ubuntu@microk8s-vm:~$ exit

#第二步:利用snap命令安装 microk8s
[ubuntu@microk8s-vm:~$ snap install microk8s --classic --channel=latest/stable
# 安装microk8s指定版本
[ubuntu@microk8s-vm:~$ snap install microk8s --classic --channel=1.11/stable
#如果没有权限,则加sudo试试
[ubuntu@microk8s-vm:~$ sudo snap install microk8s --classic --channel=1.24/stable
#返回结果
microk8s (1.24/stable) v1.24.10 from Canonical✓ installed
#安装microk8s之后,使用命令microk8s kubectl get nodes看看micro-vm的状态是否正常:
[ubuntu@microk8s-vm:~$ microk8s kubectl get nodes

#Microk8s安装在了哪里,在shell里面执行
[ubuntu@microk8s-vm:~$ which microk8s
#返回结果,这里我是在虚拟机上运行的命令
snap/bin/microk8s
#退出虚拟机外壳回到Mac世界
[ubuntu@microk8s-vm:~$ exit
#再次执行which microk8s,结果会找不到。
➜  ~ which microk8s             
microk8s not found


# 卸载microk8s
[ubuntu@microk8s-vm:~$ snap remove microk8s


#设置别名,如果不行就加sudo。这个意思是把 microk8s.kubectl换成kubectl,命令microk8s.kubectl跟分开写的microk8s kubectl是一样的
#作用:原本你要输入的命令有两个单词,现在可以变为一个单词,也可以不设置。
[ubuntu@microk8s-vm:~$ snap alias microk8s.kubectl kubectl

4.2 下载MicroK8s可能遇到的问题

#安装microk8s之后,使用命令:microk8s kubectl get nodes
#或者是查看microk8s的状态命令:microk8s status --wait-ready都会出现权限问题。问题呈现如下:
ubuntu@microk8s-vm:~$ microk8s kubectl get nodes
[ubuntu@microk8s-vm:~$ microk8s status --wait-ready
Insufficient permissions to access MicroK8s.
You can either try again with sudo or add the user ubuntu to the 'microk8s' group:
    sudo usermod -a -G microk8s ubuntu
    sudo chown -f -R ubuntu ~/.kube
After this, reload the user groups either via a reboot or by running 'newgrp microk8s'.
##解决:就是三条语句,复制上面的,然后还要newgrp microk8s
[ubuntu@microk8s-vm:~$ sudo usermod -a -G microk8s ubuntu
[ubuntu@microk8s-vm:~$ sudo chown -f -R ubuntu ~/.kube
[ubuntu@microk8s-vm:~$ newgrp microk8s

#再次执行microk8s.kubectl get nodes,Status已经是Ready就说明启动了。后面的VERSION也可以看安装的microk8s是什么版本
#或者microk8s status --wait-ready都没没问题
[ubuntu@microk8s-vm:~$ microk8s.kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
microk8s-vm   Ready    <none>   16m   v1.24.10-2+123bfdfc196019

5. 利用MicroK8s搭建一个多节点(muti-node)的集群步骤

5.1概念理解

虽然此教程是新手搭建集群,但我认为你必须了解k8s的架构,节点等等概念。我把k8s官网中文教程的k8s架构图和节点的定义都截图了,如下两张图:

我们添加的节点正是虚拟机。不了解k8s架构的可以去k8s的官网看,地址我贴在这里了:k8s官网英文版对应中文翻译版
节点的

5.2 添加一个节点整体步骤

  1. 第一步:利用Multipass创建一个新实例node-1
  2. 第二步:选择Master节点,由Master托管控制面(control plane)
  3. 第三步:到worker节点下,执行microk8s join命令即可添加一个节点
  4. 重复此步骤添加节点,就是一个集群了
5.2.1新开一个VM实例
#重复上面创建VM实例的步骤
[➜  ~ multipass launch -n node-1 -c 2 -m 4GB -d 40GB
#列出当前利用multipass创建的VM实例有多少个,都是Running才能进行下一步
[➜  ~ multipass ls
Name                    State             IPv4             Image
microk8s-vm             Running           192.168.64.4     Ubuntu 22.04 LTS
                                          10.1.254.64
node-1                  Running           192.168.64.5     Ubuntu 22.04 LTS
                                          10.1.84.128
5.2.2 选择Master节点并把worker节点添加到Master管理的集群上面

#进入microk8s-vm的shell
[➜  ~ multipass shell microk8s-vm

#执行microk8s add-node,利运行此命令的 MicroK8s 实例将是集群的主节点,并将托管 Kubernetes的控制平面(control plane)
[ubuntu@microk8s-vm:~$ microk8s add-node
#结果返回如下:
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146

Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146 --worker

If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146
microk8s join fd97:f360:a83f:8a94:5054:ff:fe16:dd06:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146

#在Mac Terminal新建窗口B,直接进入到node-1的shell,现在我们有两个窗口了,上面那个暂且称作A。不开也行,就要来回切换而已。
[➜  ~ multipass shell node-1
#结果:出现Linux系统标志:~$

#在shell里执行microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146 --worker
[ubuntu@node-1:~$ microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146 --worker
#如果成功了,就会出现以下的返回结果:
Contacting cluster at 192.168.64.4

The node has joined the cluster and will appear in the nodes list in a few seconds.

Currently this worker node is configured with the following kubernetes API server endpoints:
    - 192.168.64.4 and port 16443, this is the cluster node contacted during the join operation.

If the above endpoints are incorrect, incomplete or if the API servers are behind a loadbalancer please update
/var/snap/microk8s/current/args/traefik/provider.yaml

#最后再回到Master节点的shell,利用命令:microk8s kubectl get nodes -o wide查看节点是否已经添加成功
#如下所示,有2个节点,并且SRATUS都是Ready,说明成功了
ubuntu@microk8s-vm:~$ kubectl get nodes -o wide
NAME          STATUS   ROLES    AGE     VERSION                     INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
microk8s-vm   Ready    <none>   24h     v1.24.10-2+123bfdfc196019   192.168.64.4   <none>        Ubuntu 22.04.1 LTS   5.15.0-60-generic   containerd://1.5.13
node-1        Ready    <none>   3h53m   v1.24.10-2+123bfdfc196019   192.168.64.5   <none>        Ubuntu 22.04.1 LTS   5.15.0-60-generic   containerd://1.5.13


5.3 microk8s join命令的问题

5.3.1问题呈现

#问题1:
[ubuntu@node-1:~$ microk8s join 192.168.64.4:25000/e13b0cbfc2af260dff05d79ca0502291/ff09c81e4146 --worker
Contacting cluster at 192.168.64.4
Connection failed. The hostname (node-1) of the joining node does not resolve to the IP "192.168.64.5". Refusing join (400).

#问题2:这里需要理解token是什么,其实就是上面add-node命令返回的结果的中间那一串32位数字字母,即下面的:26d2a8e77966e01f35c94f8195df97fb
#每次执行microk8s add-node都会生成一个新的token
microk8s join 192.168.64.4:25000/26d2a8e77966e01f35c94f8195df97fb/ff09c81e4146 --worker
Contacting cluster at 192.168.64.4
Connection failed. Invalid token (500).

5.2.1解决方法

第一步:在worker节点编辑/etc/hosts文件

进入node-1的shell里面编辑/etc/hosts文件,添加一句:192.168.64.5 xx你的VM名。不要写错名字了。如下:
作用:确认你的master节点可以解析worker节点的IP地址
#第一步:vim进入文件,这里要用sudo,不然没有编辑权限。
#第二步:按字母i,进入Insert模式,写好之后,按esc键退出Insert模式,然后输入::wq!退出vim
[ubuntu@node-1:~$ sudo vim /etc/hosts
# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
#     /etc/cloud/cloud.cfg or cloud-config from user-data
#
127.0.0.1 node-1 node-1
127.0.0.1 localhost
192.168.64.5 node-1
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

~                                                                                                                                 
~                                                                                                                                 
~                                                                                                                                 
~                                                                                                                                 
~                                                                                                                                 
~                                                                                                                                 
~                                                                                                                                 
~                                                                                                                                 
"/etc/hosts" 15L, 559B 

第二步:在Master节点编辑/etc/hosts文件,
192.168.64.5 node-1,这个IP其实就是前面说到的INTERNAL-IP,如果不知道,也可在shell中利用microk8s kubectl get nodes -o wide命令获取。

#获取INTERNAL-IP
[ubuntu@node-1:~$ microk8s kubectl get no -o wide
NAME     STATUS   ROLES    AGE     VERSION                     INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
node-1   Ready    <none>   4h28m   v1.24.10-2+123bfdfc196019   192.168.64.5   <none>        Ubuntu 22.04.1 LTS   5.15.0-60-generic   containerd://1.5.13

进入microk8s-vm的shell里面编辑/etc/hosts文件。添加两条:192.168.64.4 microk8s-vm
192.168.64.5 node-1,保存退出vim.
作用:确认你的master节点可以解析worker节点的IP地址添加两条:192.168.64.4 microk8s-vm
[ubuntu@microk8s-vm:~$ sudo vim /etc/hosts
# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
#     /etc/cloud/cloud.cfg or cloud-config from user-data
#
127.0.1.1 microk8s-vm microk8s-vm
127.0.0.1 localhost
192.168.64.4 microk8s-vm
192.168.64.5 node-1
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

~                                                                                                                                                                                                                     
~                                                                                                                                                                                                                     
~                                                                                                                                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                     
~                                                                                                                                                                                                                     
~                                                                                                                                                                                                                     
"/etc/hosts" 16L, 593B                                                                                                                                                                              11,19         All

第三步:前两步做完之后,要回到Master节点再执行microk8s add-node命令,生成新的token,然后再到node-1的shell,执行microk8s join,因为可能你的上一次生成的token就是没带上这个hosts信息导致Invalid问题的。这回就会出现上面成功的返回结果了。

#回到Master节点microk8s-vm的shell执行microk8s add-node
[ubuntu@microk8s-vm:~$ microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146

Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146 --worker

If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146
microk8s join fd97:f360:a83f:8a94:5054:ff:fe16:dd06:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146

#到node-1节点的shell执行microk8s join命令
[ubuntu@node-1:~$ microk8s join 192.168.64.4:25000/f5e16681775499b4f21a974a9a753ccb/ff09c81e4146 --worker
成功返回
Contacting cluster at 192.168.64.4

The node has joined the cluster and will appear in the nodes list in a few seconds.

Currently this worker node is configured with the following kubernetes API server endpoints:
    - 192.168.64.4 and port 16443, this is the cluster node contacted during the join operation.

If the above endpoints are incorrect, incomplete or if the API servers are behind a loadbalancer please update
/var/snap/microk8s/current/args/traefik/provider.yaml

6. 总结与参考

  1. 本文主要讲解了一些K8s的相关的概念,再Mac OS上如何从零开始利用Multipass创建虚拟环境,在虚拟环境下安装MicroK8s,如何利用MicroK8s添加节点。在Mac OS上面还有更快的下载MicroK8s的方式,详细参考官方的教程–>Installing MicroK8s on macOS
  2. 参考: MicroK8s的官网如何创建一个集群–>Create a MicroK8s cluster
  3. 有疑惑的欢迎提问,我看到的基本会解答。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐