使用Microk8s快速部署kubernetes

原文链接

简介

​ Microk8s 是本地部署 Kubernetes 集群的 click-and-run 方案,最初由 Ubuntu 的发布者 Canonical 开发。不同于Minikube的是,它使用 snap 包进行部署,而不是在本地启动虚拟机来进行部署。从跨平台的角度来考虑,Minikube确实可以支持更多的平台,而Microk8s只支持少数几个特定平台。但是从资源占用的角度来考虑,由于不需要使用虚拟机,Microk8s使得你可以留更多的物力资源供你的应用使用。同时,令人惊喜的是,Microk8s目前已经支持用多个机器来构建多节点的k8s集群了。

​ 总的来说,MicroK8s 提供了一种快速简易的方法,使得少量的计算机和虚拟机变成一个多节点的 Kubernetes集群。

​ 本文的后面部分,我们将完成下面的事项:

  • 使用Microk8s在本地启动一个单节点k8s集群
  • 启动microk8s自带的几个插件,包括DNS和Dashboard
  • 运行一个nginx应用查看效果

要求

  1. 一台安装了支持snaps的Linux发行版的实验机
  2. 机器上已经预先安装好了Docker
  3. 简单了解过kubernetes,会简单使用几个kubectl命令
  4. 了解镜像、容器等概念

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      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           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

你可能感兴趣的:(使用Microk8s快速部署kubernetes)