首页 公告 项目 RSS

microk8s初体验

January 19, 2020 本文有 3131 个字 需要花费 7 分钟阅读

简介

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

➜  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

加入你的代理

[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

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

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有很多插件

root@k8s:/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之后会显示下面一句话

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

加入

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

root@k8s:/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

root@k8s:/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}')

root@k8s:/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

[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

显示

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

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

root@k8s:/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: ClusterIP type: NodePort

microk8s.kubectl get svc -A

查看端口访问就好了

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

microk8s.kubectl get pods -A -o wide

root@k8s:/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

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

Have Fun