使用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的安装命令非常简洁,只需要运行如下命令:

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容