6

Microk8s 安装 与使用指南

 1 year ago
source link: https://www.cnblogs.com/shanyou/p/16212194.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Microk8s 安装 与使用指南

我们已经知道,Kubernetes 是基于容器的应用程序的首选编排平台,可以自动部署和扩展这些应用程序,并简化维护操作。但是,Kubernetes也有其自身的复杂性挑战。那么,企业如何利用容器化来解决物联网的复杂性,而不会最终导致Kubernetes更加复杂呢?

Canonical的MicroK8s是一个功能强大的,云原生计算基金会认证的Kubernetes发行版。以下是一些关键原因,我觉得,为什么它已经成为一个强大的企业边缘计算平台:

  • 以快照包的形式交付:这些是用于桌面、云和 IoT 的应用程序包,易于安装,并通过自动更新进行保护,并且可以安装在任何支持 snap 的 Linux 发行版上。这使得MicroK8非常适合在构成物联网的各种硬件上运行。
  • 严格的限制:这确保了与底层操作系统的完全隔离,以及一个严格安全的生产级 Kubernetes 环境,所有这些都在一个小的占用空间内,非常适合边缘网关。
  • 生产级附加组件IstioKnativeCoreDNSPrometheusJaegerLinkerdCiliumHelm可作为附加组件使用,这些附加组件易于设置,只需几行命令, 支持快速Enable/Disable。
  • Kubeflow 还可以作为 MicroK8s 的附加组件,用于改进人工智能 (AI) 和机器学习 (ML) 功能。

凭借其降低复杂性的能力,MicroK8s将加速物联网和边缘部署。将物联网设备视为分布式容器化应用程序,使开发人员能够专注于应用程序而不是基础架构,并使运营团队的生活更轻松。

MicroK8s 允许您将 Kubernetes 安装群集在一起,以便它们可以形成单个群集,并将工作负载放在一个或多个这些节点上。 简而言之,Kubernetes 是:

  • 便携式:公共云、私有云、混合云、多云
  • 可扩展:模块化、可插拔、可挂钩、可组合
  • 自我修复:自动放置、自动重启、自动复制、自动扩展

在本文中,我们将介绍可以在边缘,物联网和设备上运行的轻量级Kbernetes引擎MicroK8。microk8s是一个非常轻量级的k8s发行版,小巧轻量安装快速是他的特点,microk8s是使用snap包安装的,所以他在Ubuntu上的体验是最好的,毕竟microk8s是Canonical公司开发的产品。

以下内容来自:https://docs.microsoft.com/zh-cn/azure/architecture/operator-guides/aks/choose-bare-metal-kubernetes

MicroK8 作为单个快照包交付,可在支持 Snap 支持的 Linux 计算机上轻松安装。 备用安装适用于 Windows、macOS 和 raspberry PI/ARM。 安装后,microk8s 会创建一个单节点群集,该群集可以使用 MicroK8s 工具进行管理。 它使用自己的 kubectl 打包,并且某些加载项可以启用 (,例如 helm、dns、Ingress、metallb 块等) 。 还支持多节点、Windows节点和高可用性 (HA) 方案。

注意事项:
  • 有多种资源要求,具体取决于要运行 MicroK8s 的位置。 有关最低资源要求 ,请参阅产品文档 。 例如:

    • Ubuntu:4 GB RAM、20 GB 磁盘空间

    • Windows:4 GB RAM、40 GB 磁盘空间

  • Windows工作负荷仅支持使用 Calico CNI 的 MicroK8s 群集。

  • MicroK8s 多节点群集上的每个节点都需要其自己的环境才能运行,无论是单个计算机上的单独 VM 还是容器,还是同一网络上的其他计算机。

  • 在某些 ARM 硬件上运行 MicroK8s 时,可能会出现困难。 参考 文档 以获取潜在的补救措施。

在国内由于众所周知的原因,安装microk8s后会发现 gcr.io的docker image无法下载的问题.(详细安装步骤参见 https://microk8s.io/#quick-start),首先需要安装 pullk8s 工具,此工具可以通过 hub.docker.com 的 opsdockerimage 仓库下载k8s所需的 k8s.gcr.io 或 gcr.io 镜像,每天更新一次,包括所有image 的全平台的所有tags。

git clone https://github.com/OpsDocker/pullk8s.git

cd pullk8s

sudo cp pullk8s /usr/local/bin/pullk8s

sudo chmod +x /usr/local/bin/pullk8s

如果您需要修改 hostname,可执行如下指令:

修改 hostname

hostnamectl set-hostname your-new-host-name
查看修改结果
hostnamectl status

在下面的步骤中,我们将安装MicroK8s集群,它将安装一组有限的组件,如api-server,controller-manager,scheduler,kubelet,cni,kube-proxy。其他服务,如 kube-dns 和 dashboard 也可以使用 microk8s.enable 命令运行。

ubuntu@VM-0-8-ubuntu:~$ sudo snap install microk8s --classic --channel=1.21/stable
microk8s (1.21/stable) v1.21.11 from Canonical✓ installed

详细的权限设置可以 参看 microk8s 官网 https://microk8s.io/docs, 出于简化的目的,我们可以用 kubectl 替代 microk8s.kubectl

ubuntu@VM-0-8-ubuntu:~$ sudo snap alias microk8s.kubectl kubectl
Added:
   - microk8s.kubectl as kubectl

检查microk8s 是否安装成功:

ubuntu@VM-0-8-ubuntu:~$ sudo kubectl get nodes -w
NAME           STATUS     ROLES    AGE     VERSION
microk8snode   NotReady   <none>   2m19s   v1.21.11-3+2bdf0a81ac1652
^Cubuntu@VM-0-8-ubuntu:~sudo kubectl describe node microk8snode
Name:               microk8snode
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                     beta.kubernetes.io/os=linux
                     kubernetes.io/arch=amd64
                     kubernetes.io/hostname=microk8snode
                     kubernetes.io/os=linux
                     microk8s.io/cluster=true
Annotations:        node.alpha.kubernetes.io/ttl: 0
                     volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Sat, 30 Apr 2022 20:47:49 +0800
Taints:             node.kubernetes.io/not-ready:NoSchedule
Unschedulable:      false
Lease:
   HolderIdentity:  microk8snode
   AcquireTime:     <unset>
   RenewTime:       Sat, 30 Apr 2022 20:50:31 +0800
Conditions:
   Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
   ----             ------  -----------------                 ------------------                ------                       -------
   MemoryPressure   False   Sat, 30 Apr 2022 20:47:59 +0800   Sat, 30 Apr 2022 20:47:49 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
   DiskPressure     False   Sat, 30 Apr 2022 20:47:59 +0800   Sat, 30 Apr 2022 20:47:49 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
   PIDPressure      False   Sat, 30 Apr 2022 20:47:59 +0800   Sat, 30 Apr 2022 20:47:49 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
   Ready            False   Sat, 30 Apr 2022 20:47:59 +0800   Sat, 30 Apr 2022 20:47:49 +0800   KubeletNotReady              container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
Addresses:
   InternalIP:  10.0.0.8
   Hostname:    microk8snode

发现错误是 container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized:具体原因就是拉镜像拉不到,具体可以看https://github.com/canonical/microk8s/issues/2042
我们就需要使用pullk8s 工具来解决,这个工具依赖docker 来拉镜像,安装好docker,然后运行 pullk8s check --microk8s检查被屏蔽的 gcr.io 或 k8s.gcr.io 容器名称:

ubuntu@VM-0-8-ubuntu:~/pullk8s$ sudo snap install docker
docker 20.10.12 from Canonical✓ installed

ubuntu@VM-0-8-ubuntu:~/pullk8s$ sudo pullk8s check --microk8s
k8s.gcr.io/pause:3.1

使用 pullk8s 拉取失败的镜像,并导入到 pod 空间中

buntu@VM-0-8-ubuntu:~/pullk8s$ sudo pullk8s pull k8s.gcr.io/pause:3.1 --microk8s
Pull pause:3.1 ...
Pull pause:3.1 ...
3.1: Pulling from opsdockerimage/pause
67ddbfb20a22: Pull complete
Digest: sha256:f78411e19d84a252e53bff71a4407a5686c46983a2c2eeed83929b888179acea
Status: Downloaded newer image for opsdockerimage/pause:3.1
docker.io/opsdockerimage/pause:3.1
Untagged: opsdockerimage/pause:3.1

Untagged: opsdockerimage/pause@sha256:f78411e19d84a252e53bff71a4407a5686c46983a2c2eeed83929b888179acea
unpacking k8s.gcr.io/pause:3.1 (sha256:0968e31df05b727234888883ba43ccaa4ec75566113c75065af5a6124b62d93c)...done

查看Pod运行状态

ubuntu@VM-0-8-ubuntu:~/pullk8s$ sudo kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
microk8snode   Ready    <none>   84m   v1.21.11-3+2bdf0a81ac1652

根据自己的需要,安装仪表板、DNS、私有化Registry、流量及路由控制器等k8s组件

ubuntu@VM-0-8-ubuntu:~/pullk8s$ sudo microk8s enable dashboard dns registry
Enabling Kubernetes Dashboard
Enabling Metrics-Server
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
Warning: apiregistration.k8s.io/v1beta1 APIService is deprecated in v1.19+, unavailable in v1.22+; use apiregistration.k8s.io/v1 APIService
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created

检查组件的Pod是否安装成功,发现metrics-server 镜像拉不到

ubuntu@VM-0-8-ubuntu:~/pullk8s$ sudo kubectl get pods -n kube-system
NAME                                         READY   STATUS             RESTARTS   AGE
dashboard-metrics-scraper-78d7698477-64rpc   1/1     Running            1          14m
hostpath-provisioner-566686b959-m8fff        1/1     Running            1          14m
kubernetes-dashboard-85fd7f45cb-5c8x7        1/1     Running            1          14m
calico-kube-controllers-f7868dd95-nxfzn      1/1     Running            1          101m
calico-node-58n5l                            1/1     Running            1          101m
coredns-7f9c69c78c-9nt4g                     1/1     Running            1          14m
metrics-server-8bbfb4bdb-qj75c               0/1     ImagePullBackOff   0          16m

使用 pullk8s 拉取失败的镜像,并导入到 pod 空间中

ubuntu@VM-0-8-ubuntu:~/pullk8s$ sudo pullk8s check --microk8s
k8s.gcr.io/metrics-server-amd64:v0.3.6
ubuntu@VM-0-8-ubuntu:~/pullk8s$ sudo pullk8s pull k8s.gcr.io/metrics-server-amd64:v0.3.6  --microk8s
Pull metrics-server-amd64:v0.3.6 ...
Pull metrics-server-amd64:v0.3.6 ...
v0.3.6: Pulling from opsdockerimage/metrics-server-amd64
e8d8785a314f: Pull complete
b2f4b24bed0d: Pull complete
Digest: sha256:c9c4e95068b51d6b33a9dccc61875df07dc650abbf4ac1a19d58b4628f89288b
Status: Downloaded newer image for opsdockerimage/metrics-server-amd64:v0.3.6
docker.io/opsdockerimage/metrics-server-amd64:v0.3.6
Untagged: opsdockerimage/metrics-server-amd64:v0.3.6
Untagged: opsdockerimage/metrics-server-amd64@sha256:c9c4e95068b51d6b33a9dccc61875df07dc650abbf4ac1a19d58b4628f89288b
unpacking k8s.gcr.io/metrics-server-amd64:v0.3.6 (sha256:c9cdfb8ea4ace4b65a9a151086e2d3903b22c5c40b01e5b097db73bd3d90d19e)...done

查看Pod运行状态,全部正常:

ubuntu@VM-0-8-ubuntu:~/pullk8s$ sudo kubectl get pods -n kube-system
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-78d7698477-64rpc   1/1     Running   1          25m
hostpath-provisioner-566686b959-m8fff        1/1     Running   1          25m
kubernetes-dashboard-85fd7f45cb-5c8x7        1/1     Running   1          25m
calico-kube-controllers-f7868dd95-nxfzn      1/1     Running   1          111m
calico-node-58n5l                            1/1     Running   1          111m
coredns-7f9c69c78c-9nt4g                     1/1     Running   1          25m
metrics-server-8bbfb4bdb-qj75c               1/1     Running   0          26m

查看microk8s状态

microk8s status

image

访问仪表板

1. 获取 token 密钥

# token=$(microk8s kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
# microk8s kubectl -n kube-system describe secret $token
2. 映射端口到外部网卡

# microk8s kubectl port-forward -n kube-system --address=0.0.0.0 service/kubernetes-dashboard 10443:443
3. 浏览器访问

  https://127.0.0.1:10443

其他常用命令:

命令 说明
microk8s dashboard-proxy 配置仪表板访问代理
microk8s start 启动 microk8s
microk8s stop 停止 microk8s
snap alias microk8s.kubectl kubectl 设置别名
microk8s kubectl get all --all-namespace 查看所有命名空间所有pod及服务的状态
配置 microk8s 内置 docker 的 registry.mirrors

编辑 /var/snap/microk8s/current/args/containerd-template.toml 文件
在 endpoint 添加 新的 国内 registry.mirrors , 如 "https://docker.mirrors.ustc.edu.cn"

...
[plugins.cri.registry]
      [plugins.cri.registry.mirrors]
        [plugins.cri.registry.mirrors."docker.io"]
          endpoint = [
                "https://docker.mirrors.ustc.edu.cn",
                "https://hub-mirror.c.163.com",
                "https://mirror.ccs.tencentyun.com",
                "https://registry-1.docker.io"
          ]

部署示例应用程序

此时,您拥有一个功能齐全的 Kubernetes 集群。以下命令将部署nginx Web应用程序。

kubectl create deployment  nginx --image=nginx:alpine --replicas=1

部署 nginx 后,可以使用以下命令公开应用程序。

kubectl expose deployment nginx --port 80 –target-port 80 --type NodePort --selector=app=nginx --name nginx

我们可以启动lynx,一个基于终端的Web浏览器,使用以下命令访问Nginx应用程序。

image

MicroK8s 为您提供了故障排除工具,以检查出了什么问题。请务必查看常见问题部分,以获取有关解决常见问题的帮助。

通过下列命令来设置 kubeconfig 文件:

cd $HOME
mkdir .kube
cd .kube
microk8s config > config

修改Sandbox Image

默认的puase镜像是google提供的,国内一般拉不下来。现在用vim编辑/var/snap/microk8s/current/args/containerd-template.toml这个文件,把k8s.gcr.io/pause:3.1 替换为 registry.cn-shenzhen.aliyuncs.com/juxuny-google-containers/pause:3.1

修改microk8s 里面 DNS 服务

microk8s kubectl -n kube-system edit configmap/coredns

把8.8.8.8 和 8.8.4.4 改成自己想要的DNS Server就可以了.

相关文章:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK