简介
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设置代理,你可以看我下面这篇文章
当然在这里我会走一遍流程
编辑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