美文网首页
使用Microk8s快速部署kubernetes

使用Microk8s快速部署kubernetes

作者: 樽盖待揭 | 来源:发表于2020-12-31 23:02 被阅读0次

    原文链接

    简介

    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

    相关文章

      网友评论

          本文标题:使用Microk8s快速部署kubernetes

          本文链接:https://www.haomeiwen.com/subject/xukdoktx.html