简介
Microk8s 是本地部署 Kubernetes 集群的 click-and-run 方案,最初由 Ubuntu 的发布者 Canonical 开发。不同于Minikube的是,它使用 snap 包进行部署,而不是在本地启动虚拟机来进行部署。从跨平台的角度来考虑,Minikube确实可以支持更多的平台,而Microk8s只支持少数几个特定平台。但是从资源占用的角度来考虑,由于不需要使用虚拟机,Microk8s使得你可以留更多的物力资源供你的应用使用。同时,令人惊喜的是,Microk8s目前已经支持用多个机器来构建多节点的k8s集群了。
总的来说,MicroK8s 提供了一种快速简易的方法,使得少量的计算机和虚拟机变成一个多节点的 Kubernetes集群。
本文的后面部分,我们将完成下面的事项:
- 使用Microk8s在本地启动一个单节点k8s集群
- 启动microk8s自带的几个插件,包括DNS和Dashboard
- 运行一个nginx应用查看效果
要求
- 一台安装了支持
snaps
的Linux发行版的实验机 - 机器上已经预先安装好了Docker
- 简单了解过kubernetes,会简单使用几个kubectl命令
- 了解镜像、容器等概念
reference
- 使用 Microk8s 在 Linux 上本地运行 Kubernetes
- Microk8s Get Started
- Microk8s Tutorial - install a local kubernetes with microk8s
正文
安装
Microk8s的安装命令非常简洁,只需要运行如下命令:
sudo snap install microk8s --classic
该命令会自动安装当前的稳定版本,我安装的时候稳定版本是1.20,在安装的时候可以看到这样的输出:
$ sudo snap install microk8s --classic
Download snap "microk8s" (1864) from channel "1.20/stable" 25% 218kB/s 12.5m
当看到类似这样的输出的时候,就说明安装完成了。
microk8s (1.20/stable) v1.20.0 from Canonical✓ installed
接着让我们使用kubectl
命令来检查我们安装的集群状态:
sudo microk8s.kubectl get nodes
正常情况下应该看到的是这样的输出,显示我们的集群中有一个k8s工作节点,他的当前状态为Ready
。
NAME STATUS ROLES AGE VERSION
irving-workstation Ready <none> 3m27s v1.20.0-37+7ab055a22f5440
但是如果你使用的机器不能够科学上网的话,可能节点的状态会为NotReady
。接下来我会先介绍如何简化kubectl命令使用,接着介绍节点NotReady
情况下要怎么修复。
简化kubectl命令
我们首先解决必须要sudo
才能执行microk8s命令的问题。
运行下面的命令,将你当前的用户加到 'microk8s' 用户组内:
sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube
su $USER
然后解决每次kubectl
命令前面都必须要加上microk8s的问题,我们给microk8s.kubectl
取别名为mkubectl
:
sudo snap alias microk8s.kubectl mkubectl
现在你可以简单用下面的命令再次查看集群中节点的状态了
mkubectl get nodes
解决科学上网问题
该问题的原因是由于谷歌服务器被墙,导致有一些镜像拉不到。我们通过下面的几条命令就可以看到为什么集群的状态不健康了:
$ mkubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-847c8c99d-8shsv 0/1 Pending 0 20m
calico-node-fmmrr 0/1 Init:0/3 0 20m
$ mkubectl describe pod calico-node-fmmrr -n kube-system
......
......
......
......
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 20m default-scheduler Successfully assigned kube-system/calico-node-fmmrr to irving-workstation
Warning FailedCreatePodSandBox 10m (x15 over 20m) kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox image "k8s.gcr.io/pause:3.1": failed to pull image "k8s.gcr.io/pause:3.1": failed to pull and unpack image "k8s.gcr.io/pause:3.1": failed to resolve reference "k8s.gcr.io/pause:3.1": failed to do request: Head "https://k8s.gcr.io/v2/pause/manifests/3.1": dial tcp 108.177.125.82:443: i/o timeout
Warning FailedCreatePodSandBox 66s (x13 over 9m38s) kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox image "k8s.gcr.io/pause:3.1": failed to pull image "k8s.gcr.io/pause:3.1": failed to pull and unpack image "k8s.gcr.io/pause:3.1": failed to resolve reference "k8s.gcr.io/pause:3.1": failed to do request: Head "https://k8s.gcr.io/v2/pause/manifests/3.1": dial tcp 108.177.97.82:443: i/o timeout
我们只需要从别的地方下载到所需要的镜像(这里是k8s.gcr.io/pause:3.1
),保证运行在我们机器上的Pod可以正常获取镜像就可以了。具体怎么解决可以参考其他文章,我个人使用的是阿里云镜像加速器。
当你本地Docker镜像仓库中有了k8s.gcr.io/pause:3.1
这个镜像之后,Pod却仍然无法获取镜像,这是怎么回事?
原来Microk8s使用的CRE是containerd,我们需要再将Docker镜像仓库里的镜像放到Microk8s使用的镜像仓库里去:
docker save k8s.gcr.io/pause:3.1 > pause.tar
microk8s ctr image import pause.tar
这下再看pod状态已经都正常了:
NAME READY STATUS RESTARTS AGE
calico-node-fmmrr 1/1 Running 1 60m
calico-kube-controllers-847c8c99d-8shsv 1/1 Running 0 60m
后面的使用过程中,我们仍然会多次遇到镜像拉取不到的问题,都需要用这种方法解决。
启用插件
使用 MicroK8s 其中最大的好处之一事实上是也支持各种各样的插件和扩展。更重要的是它们是开箱即用的,用户仅仅需要启动它们。通过运行 microk8s.status
命令检查出扩展的完整列表。
$ microk8s status
microk8s is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
addons:
enabled:
ha-cluster # Configure high availability on the current node
disabled:
ambassador # Ambassador API Gateway and Ingress
cilium # SDN, fast with full network policy
dashboard # The Kubernetes dashboard
dns # CoreDNS
fluentd # Elasticsearch-Fluentd-Kibana logging and monitoring
gpu # Automatic enablement of Nvidia CUDA
helm # Helm 2 - the package manager for Kubernetes
helm3 # Helm 3 - Kubernetes package manager
host-access # Allow Pods connecting to Host services smoothly
ingress # Ingress controller for external access
istio # Core Istio service mesh services
jaeger # Kubernetes Jaeger operator with its simple config
keda # Kubernetes-based Event Driven Autoscaling
knative # The Knative framework on Kubernetes.
kubeflow # Kubeflow for easy ML deployments
linkerd # Linkerd is a service mesh for Kubernetes and other frameworks
metallb # Loadbalancer for your Kubernetes cluster
metrics-server # K8s Metrics Server for API access to service metrics
multus # Multus CNI enables attaching multiple network interfaces to pods
portainer # Portainer UI for your Kubernetes cluster
prometheus # Prometheus operator for monitoring and logging
rbac # Role-Based Access Control for authorisation
registry # Private image registry exposed on localhost:32000
storage # Storage class; allocates storage from host directory
traefik # traefik Ingress controller for external access
开启DNS
microk8s enable dns
开启过后kube-system名字空间下面会多一个coredns的Pod。
开启Dashboard
microk8s enable dashboard
获取Token:
token=$(microk8s kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s kubectl -n kube-system describe secret $token
获取dashboard的ClusterIP
$ microk8s kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard ClusterIP 10.152.183.103 <none> 443/TCP 17m
访问页面 https://{ClusterIP}:443,使用刚刚获取到的Token登录,就可以看到如下画面了。
dashboard.png运行应用
我们来简单运行一个Nginx作为示例应用
kubectl create deployment nginx --image=nginx
来查看下效果
kubectl get deployments
kubectl get pods -o wide
#这里可以看到Pod IP,可以用于后面访问
用浏览器访问http://{Pod IP}:80就可以看到nginx的默认界面了。
nginx.png
网友评论