0%

microk8s初体验

简介

microk8s是一个非常轻量级的k8s发行版,小巧轻量安装快速是他的特点,所以我认为microk8s是十分适合开发人员使用的,比如当你遇到在一台全新的电脑上,突然需要一个k8s集群做开发测试的时候,microk8s会很好的解决你的问题,microk8s支持在windows,mac,linux上部署,当然如果你是在windows和mac上使用的话你需要用到multipass或者virtualbox等其他虚拟机软件创建一个独立的Ubuntu虚拟机才可以使用,microk8s是使用snap包安装的,所以他在Ubuntu上的体验是最好的,毕竟microk8s是Canonical公司开发的产品,今天我们就在mac电脑上体验一下这个轻量级的k8s发型版本

虚拟机准备

因为是在mac下所以你要用到multipass或者其他虚拟化软件创建一个Ubuntu虚拟机,windows上也一样,如果你是linux,但不是Ubuntu,那么你得确定你的发型版本支不支持安装snap包,关于multipass的使用我在下面这篇文章已经说得很详细了,想要了解的同学可以看下面这篇文章

使用Multipass在你的windows或者mac电脑上快速创建一个Ubuntu虚拟机

那么首先我们使用multipass创建一台Ubuntu虚拟机

multipass launch --name k8s -c 4 --mem 4G --disk 40G

注意我这里启动的虚拟机是4核心cpu的,如果你是使用microk8s官网上的命令创建的单核心cpu虚拟机在之后我们安装prometheus监控的时候会有问题

创建完成之后,查看我们创建的虚拟机

multipass list

1
2
3
4
5
6
7
➜  k8s multipass list
Name State IPv4 Image
helm Stopped -- Ubuntu 18.04 LTS
k8s Running 192.168.64.9 Ubuntu 18.04 LTS
k8s-master Stopped -- Ubuntu 18.04 LTS
microk8s-vm Deleted -- Not Available
ubuntu Stopped -- Ubuntu 18.04 LTS

可以看到我们创建的名为k8s的虚拟机已经启动了,并且获得了一个192.168.64.9的ip

之后我们进入到虚拟机之中

multipass shell k8s

默认我们是以一个普通用户登录的,为了避免之后一些不必要的麻烦,我们直接切换到root

先给root用户一个密码

sudo passwd root

之后切换到root

su root

安装microk8s

切换到root之后我们安装microk8s,但是在安装之前我们要注意一件事,因为是在国内,所以下载snap包的速度是很慢的,我们要给snapd设置一个代理,来加快snap包的下载速度,当然如果你不懂代理相关的知识,那么只能等待了,而且之后我们安装dashboard和prometheus的时候因为网络的问题,会使你的安装体验十分不好,所以最好你可以开一个代理

怎么给snapd设置代理,你可以看我下面这篇文章

解决Ubuntu snap包下载慢的问题

当然在这里我会走一遍流程

编辑snapd的systemed文件

sudo systemctl edit snapd

加入你的代理

1
2
3
[Service]
Environment="http_proxy=http://192.168.3.14:1087"
Environment="https_proxy=http://192.168.3.14:1087"

之后重启snapd服务

sudo systemctl daemon-reload

sudo systemctl restart snapd

接着我们安装microk8s

snap install microk8s --classic

安装完成之后会弹出下面几行提示

1
2
3
Warning: /snap/bin was not found in your $PATH. If you've not restarted your session since you
installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469 for more
details.

所以我们需要把/snap/bin加入到我们环境变量之中

vim ~/.bashrc

在文件末尾加入

export PATH=$PATH:/snap/bin/

使环境变量生效

source ~/.bashrc

之后我们查看microk8s的状态

microk8s.status

这个时候我们可以看到microk8s有很多插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[email protected]:/home/ubuntu# microk8s.status
microk8s is running
addons:
cilium: disabled
dashboard: disabled
dns: disabled
fluentd: disabled
gpu: disabled
helm: disabled
ingress: disabled
istio: disabled
jaeger: disabled
juju: disabled
knative: disabled
kubeflow: disabled
linkerd: disabled
metallb: disabled
metrics-server: disabled
prometheus: disabled
rbac: disabled
registry: disabled
storage: disabled

默认microk8使用的是containerd而不是docker,因为国内的网络问题,所以我们需要修改containerd的配置文件实现代理下载镜像

编辑下面这个文件

vim /var/snap/microk8s/current/args/containerd-env

在文件最后加入自己的代理

HTTPS_PROXY=http://192.168.3.14:1087

之后我们重启containerd服务

systemctl restart snap.microk8s.daemon-containerd

安装k8s dashboard

之后我们来安装dashboard

安装dashboard十分简单一条命令搞定

microk8s.enable rbac dashboard

为什么在安装dashboard的时候我们还要安装rbac呢,因为默认microk8s是不带rbac的,所以当你单独安装完成dashboard之后会显示下面一句话

1
2
3
4
If RBAC is not enabled access the dashboard using the default token retrieved with:

token=$(microk8s.kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s.kubectl -n kube-system describe secret $token

所以是不能使用cluster-admin权限去登陆dashboard的,我们为了可以使用cluster-admin的权限去登陆dashboard,我们就要安装rbac,接着我们创建登陆用户,新建下面这个yaml文件

vim dashboard-rabc.yaml

加入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system

之后apply这个文件

在apply之前我们要看下dashboard是不是已经创建完成了

microk8s.kubectl get pods -A

1
2
3
4
5
6
[email protected]:/home/ubuntu# microk8s.kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system dashboard-metrics-scraper-687667bb6c-5n7sq 1/1 Running 0 84s
kube-system heapster-v1.5.2-5c58f64f8b-5khsw 4/4 Running 0 84s
kube-system kubernetes-dashboard-5c848cc544-gbfg2 1/1 Running 0 84s
kube-system monitoring-influxdb-grafana-v4-6d599df6bf-b6qrt 2/2 Running 0 84s

当都处于running状态之后我们应用上面这个yaml文件

microk8s.kubectl apply -f dashboard-rabc.yaml

接着查看创建的service,默认dashboard的service是ClusterIP模式的所以为了可以使用浏览器登陆dashboard我们要把dashboard的service类型改为NodePort

microk8s.kubectl edit svc kubernetes-dashboard -n kube-system

type: ClusterIP改为type: NodePort

保存退出之后查看下NodePort的端口

microk8s.kubectl get svc -A

1
2
3
4
5
6
7
8
[email protected]:/home/ubuntu# microk8s.kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 3h36m
kube-system dashboard-metrics-scraper ClusterIP 10.152.183.109 <none> 8000/TCP 5m18s
kube-system heapster ClusterIP 10.152.183.231 <none> 80/TCP 5m17s
kube-system kubernetes-dashboard NodePort 10.152.183.108 <none> 443:30781/TCP 5m18s
kube-system monitoring-grafana ClusterIP 10.152.183.35 <none> 80/TCP 5m18s
kube-system monitoring-influxdb ClusterIP 10.152.183.204 <none> 8083/TCP,8086/TCP 5m17s

可以看到端口是30781,之后我们获取刚才创建的admin-user用户的token

microk8s.kubectl -n kube-system describe secret $(microk8s.kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[email protected]:/home/ubuntu# microk8s.kubectl -n kube-system describe secret $(microk8s.kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name: admin-user-token-tjv7r
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 56e47aa7-0ba8-4668-8c5a-a397eb633247

Type: kubernetes.io/service-account-token

Data
====
ca.crt: 1103 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ik96UFduZE5LbGRIbzZDRi05aElla3U1Ynl6NC1WeWVvaG4zQU5CbDRSQkkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRqdjdyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI1NmU0N2FhNy0wYmE4LTQ2NjgtOGM1YS1hMzk3ZWI2MzMyNDciLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.Tt5lrawuHqaJkhlaOOyx6Q4J3LyZKvVzP5QwA0EOC-Z20Zd1vVmUY0FAjfGNc2VEPGQ0QMPaKjJLbfLZrjC9hGRrprXmcbLZYP3BQdEK-MailJ0fs-J3_aHh4JdbX0aV3iFWChRBqAKVbXCkTABvvyt6k1748cs7ltSFzGwLfUjmfobBGy8cS9pHun9zfHs8PoWg0166E8qXvuOZb4XgDnh-eiXlEqt2IvFSemUw6PR2JqsJCLl-IiE7mO7RVpho3MXEOWJUSYvYAsgV2e_N8s_s2BbyUNHg3b5eNIIZGV2aCiMs-vv8qIrWNv3Mi71hIMjjxryihJ7KLmxZARwNKQ

获取到token我们就可以使用ip加端口访问dashboard然后使用token登陆了

使用本地的kubectl来管理虚拟机中的microk8s

从安装dashboard的时候我们就可以发现,每次我们要使用kubectl的时候就要输入microk8s.kubectl,很麻烦,而且我们大部分管理k8s的,本地其实都已经安装过kubectl的,所以,如果你要使用本地kubectl去管理虚拟机中的microk8s你就要找到kubectl的配置文件,microk8s kubectl的配置文件在下面

vim /var/snap/microk8s/current/credentials/client.config

把这个文件的内容拷贝到你本地的~/.kube/config

接着把文件中服务器地址改下

server: https://127.0.0.1:16443

就好了

创建microk8s的集群

目前为止我们都是单节点操作,创建一个microk8s的集群也是很简单的,我们再去创建一个虚拟机

multipass launch --name k8s-slave -c 4 --mem 4G --disk 40G

创建完成之后进入虚拟机

multipass shell k8s-slave

同样这个节点我们也使用root用户登录

sudo passwd root

设置代理

sudo systemctl edit snapd

1
2
3
[Service]
Environment="http_proxy=http://192.168.3.14:1087"
Environment="https_proxy=http://192.168.3.14:1087"

重启snapd服务

sudo systemctl restart snapd

安装microk8s

snap install microk8s --classic

设置环境变量

vim ~/.bashrc

加入

export PATH=$PATH:/snap/bin

source ~/.bashrc

设置containerd代理

vim /var/snap/microk8s/current/args/containerd-env

加入

HTTPS_PROXY=http://192.168.3.14:1087

重启containerd服务

systemctl restart snap.microk8s.daemon-containerd

上面slave节点全部初始化完成之后我们在master主节点执行

microk8s.add-node

显示

1
2
3
4
5
Join node with: microk8s.join 192.168.64.9:25000/qJXRfBROhbiLbGBOaXcWqLYfodEywlCF

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.9:25000/qJXRfBROhbiLbGBOaXcWqLYfodEywlCF
microk8s.join 10.1.65.0:25000/qJXRfBROhbiLbGBOaXcWqLYfodEywlCF

接着slave节点加入master,在slave节点执行

microk8s.join 192.168.64.9:25000/qJXRfBROhbiLbGBOaXcWqLYfodEywlCF

之后再主节点查看集群中的节点状态

microk8s.kubectl get nodes

加入完成应该是下面这个样子的

1
2
3
4
[email protected]:/home/ubuntu# microk8s.kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.64.10 Ready <none> 48s v1.17.0
k8s Ready <none> 4h1m v1.17.0

安装prometheus监控

安装这个很简单,我只是为了查看两个节点的状态而已

microk8s.enable prometheus

把grafana的service类型改为NodePort

microk8s.kubectl get svc -A

microk8s.kubectl edit svc grafana -n monitoring

编辑type: ClusterIPtype: NodePort

microk8s.kubectl get svc -A

查看端口访问就好了

之后我们查看pods在各个节点的调度情况

microk8s.kubectl get pods -A -o wide

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[email protected]:/home/ubuntu# microk8s.kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system dashboard-metrics-scraper-687667bb6c-5n7sq 1/1 Running 0 35m 10.1.65.13 k8s <none> <none>
kube-system heapster-v1.5.2-5c58f64f8b-5khsw 4/4 Running 0 35m 10.1.65.11 k8s <none> <none>
kube-system kubernetes-dashboard-5c848cc544-gbfg2 1/1 Running 0 35m 10.1.65.12 k8s <none> <none>
kube-system monitoring-influxdb-grafana-v4-6d599df6bf-b6qrt 2/2 Running 0 35m 10.1.65.10 k8s <none> <none>
monitoring alertmanager-main-0 2/2 Running 0 3m6s 10.1.41.6 192.168.64.10 <none> <none>
monitoring grafana-58dc7468d7-vxgth 1/1 Running 0 3m42s 10.1.41.4 192.168.64.10 <none> <none>
monitoring kube-state-metrics-78b46c84d8-22k8g 3/3 Running 0 3m42s 10.1.41.3 192.168.64.10 <none> <none>
monitoring node-exporter-dgsr4 2/2 Running 0 3m40s 192.168.64.10 192.168.64.10 <none> <none>
monitoring node-exporter-sq7v6 2/2 Running 0 3m40s 192.168.64.9 k8s <none> <none>
monitoring prometheus-adapter-5cd5798d96-jxdhr 1/1 Running 0 3m37s 10.1.41.5 192.168.64.10 <none> <none>
monitoring prometheus-k8s-0 3/3 Running 1 2m53s 10.1.41.7 192.168.64.10 <none> <none>
monitoring prometheus-operator-99dccdc56-kzjg7 1/1 Running 0 3m50s 10.1.41.2 192.168.64.10 <none> <none>

各个节点都有pod说明集群很ok

一些其他操作

查看运行的容器

microk8s.ctr containers list

查看镜像

microk8s.ctr images list

停止集群

microk8s.stop

启动集群

microk8s.start

重置集群

microk8s.reset

欢迎关注Bboysoul的博客www.bboy.app

Have Fun