尝试使用Minikube,感受一下进入Kubernetes的入门氛围

这篇文章是在富士通系统网络技术公司内部技术社区中,由“创新推进社区”,简称为“いのべこ”所策划的,いのべこ暑假冒险日历2020的第11天的文章。
本文的内容仅代表我个人的观点,不代表所属组织的立场。
到此为止的约定。

首先,

在这篇文章中,我曾经有过接触和使用Docker的经验。
对于Kubernetes(简称K8s。不知道该怎么发音呢。是kei ha chi esu吗?还是kei ei tsu?)我觉得很难。
然而,作为一个从未使用过Kubernetes的初学者,突然发现了一个叫做minikube的东西,这让我觉得可以轻松上手!

这篇文章是为了分享我在突然想起并尝试的时候的内容而写的。

我根据以下环境准备了这篇文章。

    • Windows10 2004 Update

 

    • WSL2(ubuntu 20.04)

 

    docker(Docker Engine CE 19.03.12)

Minikube 是什么

在公式存储库中,有以下描述:

minikube在macOS、Linux和Windows上实现了本地Kubernetes集群。minikube的主要目标是成为本地Kubernetes应用程序开发的最佳工具,并支持所有适用的Kubernetes功能。

在本地搭建K8s集群,以便更方便地在本地进行应用程序开发。

什么是K8s集群?

Kubernetesクラスターの図

据说这个图中的Kubernetes Nodes部分可以方便地在本地环境中准备好。

实际上,构建Kubernetes集群似乎有几种方法…

    • minikube

 

    • kubeadm

 

    • kops

 

    kubespray

似乎有诸如此类的事项。
在官方网页上,公开了使用kubeadm构建用于生产环境的K8s集群的步骤,但是这些步骤都非常复杂,准备用于本地环境的测试可能会非常麻烦。

在互联网上可能会有一些关于如何构建K8s集群的文章,但是构建主节点、非主节点的步骤非常复杂,让人望而却步。相比之下,像minikube这样的工具可以轻松构建单节点的集群。

安装方法

在Kubernetes的官方文档中详细介绍了如何使用导入方法。
Minikube的安装
由于我已经在我的环境中安装了WSL2和docker(使用CLI进行安装而不是通过docker desktop),
我将从这个状态做摘录进行传送。

# ローカル環境にkubectl/minikubeをインストールします
# kubectlを取得します
$ curl -Lo /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 41.9M  100 41.9M    0     0  32.2M      0  0:00:01  0:00:01 --:--:-- 32.2M
# kubectlに実行権限を付与します
$ chmod +x /usr/local/bin/kubectl

# minikubeのインストールを行います
$ curl -Lo /usr/local/bin/minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 55.7M  100 55.7M    0     0  29.6M      0  0:00:01  0:00:01 --:--:-- 29.5M
# 実行権限の付与
$ chmod +x /usr/local/bin/minikube

我们成功完成了安装。让我们来验证一下安装的工具是否能够正常运行。

$ docker version
Client: Docker Engine - Community
 Version:           19.03.12
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        48a66213fe
 Built:             Mon Jun 22 15:45:44 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:44:15 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
$ minikube version
minikube version: v1.12.1
commit: 5664228288552de9f3a446ea4f51c6f29bbdd0e0-dirty
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.6", GitCommit:"dff82dc0de47299ab66c83c626e08b245ab19037", GitTreeState:"clean", BuildDate:"2020-07-15T16:58:53Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

试一试公式样本

如果成功安装了Minikube/kubectl,让我们尝试一下官方示例。
在官方文档中,有示例命令供参考,
我想边确认边尝试执行这些命令。

使用minikube来构建本地集群。

# minikubeを使用して、ローカル環境にKubernetesクラスタを構築します。
$ minikube start 
image.png

如果按照上述的方式,启动成功!使用Windows 终端的话,有表情符号很有趣呢。
但如果是WSL的默认控制台的话,就变得很难辨认了,感觉一片混乱。

如果在minikube中使用默认选项启动集群,则–vm-driver标志将选择none,称为docker驱动程序(需要在本地安装Docker)。

另外,根据日志显示,–cpus参数被分配为2,–memory参数被分配为4g。

执行Kubernetes部署。

$ kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
deployment.apps/hello-minikube created
$ kubectl expose deployment hello-minikube --type=NodePort --port=8080
service/hello-minikube exposed

您可以使用以下命令来确认pod是否已启动。

$ kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube-64b64df8c9-662hl   1/1     Running   0          90s

确认部署的容器是否正常运行。

在公式页面上,使用curl $(minikube service hello-minikube –url)可以访问正在运行的容器,但在WSL2环境下,无法执行如下所示的操作。

$ minikube service hello-minikube --url
?  Starting tunnel for service hello-minikube.
|-----------|----------------|-------------|------------------------|
| NAMESPACE |      NAME      | TARGET PORT |          URL           |
|-----------|----------------|-------------|------------------------|
| default   | hello-minikube |             | http://127.0.0.1:41527 |
|-----------|----------------|-------------|------------------------|
http://127.0.0.1:41527
❗  Because you are using a Docker driver on linux, the terminal needs to be open to run it.

只需访问上述出现的URL http://127.0.0.1:41527,您就可以确认功能是否正常,尝试使用curl等工具查看。

$ curl curl http://172.17.0.3:30971


Hostname: hello-minikube-64b64df8c9-662hl

Pod Information:
        -no pod information available-

Server values:
        server_version=nginx: 1.13.3 - lua: 10008

Request Information:
        client_address=172.19.0.1
        method=GET
        real path=/
        query=
        request_version=1.1
        request_scheme=http
        request_uri=http://172.17.0.3:8080/

Request Headers:
        accept=*/*
        host=172.17.0.3:30971
        user-agent=curl/7.68.0

Request Body:
        -no body in request-

请确认一切顺利,动作已经验证成功了吗?
最后,删除已创建的服务和通过minikube创建的集群,确认动作已经结束。

$ kubectl delete services hello-minikube
service "hello-minikube" deleted
$ kubectl delete deployment hello-minikube
deployment.apps "hello-minikube" deleted
$ minikube service list # "hello-minikube"のサービスがなくなっています。
|----------------------|---------------------------|--------------|-----| 
|      NAMESPACE       |           NAME            | TARGET PORT  | URL |
|----------------------|---------------------------|--------------|-----|
| default              | kubernetes                | No node port |
| kube-system          | kube-dns                  | No node port |
| kubernetes-dashboard | dashboard-metrics-scraper | No node port |
| kubernetes-dashboard | kubernetes-dashboard      | No node port |
|----------------------|---------------------------|--------------|-----|
$ minikube stop # ローカルクラスタの停止
✋  Stopping "minikube" in docker ...
?  Powering off "minikube" via SSH ...
?  Node "minikube" stopped.
$ minikube delete # ローカルクラスタの削除
?  Deleting "minikube" in docker ...
?  Deleting container "minikube" ...
?  Removing /home/bash/.minikube/machines/minikube ...
?  Removed all traces of the "minikube" cluster.

使用minikube的功能可以有哪些?

让我们来查看一下minikube命令行提供了哪些功能,可用于使用kubernetes。

minikube --help
minikube provisions and manages local Kubernetes clusters optimized for development workflows.

Basic Commands:
  start          Starts a local Kubernetes cluster
  status         Gets the status of a local Kubernetes cluster
  stop           Stops a running local Kubernetes cluster
  delete         Deletes a local Kubernetes cluster
  dashboard      Access the Kubernetes dashboard running within the minikube cluster
  pause          pause Kubernetes
  unpause        unpause Kubernetes

Images Commands:
  docker-env     Configure environment to use minikube's Docker daemon
  podman-env     Configure environment to use minikube's Podman service
  cache          Add, delete, or push a local image into minikube

Configuration and Management Commands:
  addons         Enable or disable a minikube addon
  config         Modify persistent configuration values
  profile        Get or list the the current profiles (clusters)
  update-context Update kubeconfig in case of an IP or port change

Networking and Connectivity Commands:
  service        Returns a URL to connect to a service
  tunnel         Connect to LoadBalancer services

Advanced Commands:
  mount          Mounts the specified directory into minikube
  ssh            Log into the minikube environment (for debugging)
  kubectl        Run a kubectl binary matching the cluster version
  node           Add, remove, or list additional nodes

Troubleshooting Commands:
  ssh-key        Retrieve the ssh identity key path of the specified cluster
  ip             Retrieves the IP address of the running cluster
  logs           Returns logs to debug a local Kubernetes cluster
  update-check   Print current and latest version number
  version        Print the version of minikube

Other Commands:
  completion     Generate command completion for a shell

Use "minikube <command> --help" for more information about a given command.

下面我将介绍一些我觉得很方便的命令。

仪表盘

在本地运行minikube dashboard。
一旦启动,控制台将显示类似以下内容:
? 在你的默认浏览器中打开 http://127.0.0.1:42011/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/…
请尝试使用浏览器等访问该网址。
这样,您就可以访问一个用于检查kubernetes集群状态的仪表盘。

image.png

如果原生的K8s中没有部署Dashboard,可以通过使用kubectl命令来部署并执行代理命令,从而访问Dashboard。这样做只需一个命令,而且没有复杂的选项,觉得挺方便的。

WebUI(仪表板)

服务

显示正在运行的服务列表。

$ minikube service list
|----------------------|---------------------------|--------------|-------------------------|
|      NAMESPACE       |           NAME            | TARGET PORT  |           URL           |
|----------------------|---------------------------|--------------|-------------------------|
| default              | hello-minikube            |         8080 | http://172.17.0.3:30971 |
| default              | kubernetes                | No node port |
| kube-system          | kube-dns                  | No node port |
| kubernetes-dashboard | dashboard-metrics-scraper | No node port |
| kubernetes-dashboard | kubernetes-dashboard      | No node port |
|----------------------|---------------------------|--------------|-------------------------|

烦恼

当我执行 minikube start 然后执行 stop>delete 后,再次执行 minikube start 以构建本地集群时会发生错误。

minikube start
?  minikube v1.12.1 on Ubuntu 20.04
✨  Automatically selected the docker driver

❗  'docker' driver reported a issue that could affect the performance.
?  Suggestion: enable overlayfs kernel module on your Linux

?  Starting control plane node minikube in cluster minikube
?  Creating docker container (CPUs=2, Memory=2200MB) ...
?  StartHost failed, but will try again: creating host: create: creating: create kic node: create container: docker run -d -t --privileged --security-opt seccomp=unconfined --tmpfs /tmp --tmpfs /run -v /lib/modules:/lib/modules:ro --hostname minikube --name minikube --label created_by.minikube.sigs.k8s.io=true --label name.minikube.sigs.k8s.io=minikube --label role.minikube.sigs.k8s.io= --label mode.minikube.sigs.k8s.io=minikube --volume minikube:/var --security-opt apparmor=unconfined --cpus=2 --memory=2200mb -e container=docker --expose 8443 --publish=127.0.0.1::8443 --publish=127.0.0.1::22 --publish=127.0.0.1::2376 --publish=127.0.0.1::5000 gcr.io/k8s-minikube/kicbase:v0.0.10@sha256:f58e0c4662bac8a9b5dda7984b185bad8502ade5d9fa364bf2755d636ab51438: exit status 125
stdout:
8df93322265580c4510cb0a0e9d59bd4cc3f306aaadf73a1681e6d4c605a7dd5

stderr:
docker: Error response from daemon: cgroups: cannot find cgroup mount destination: unknown.

^@?  docker "minikube" container is missing, will recreate.

我不知道该怎么办。

由于相同的原因,Docker运行也无法完成。
Docker:守护程序发生错误响应:cgroups:无法找到cgroup挂载目标:未知。

大概来说,通过WSL2的重启(从关闭到重新启动WSL)可以解决这个问题。

此外,你也可以通过以下指令解决问题。(这只是临时措施)

sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

参考的问题

我不会深入追究原因,如果了解了我会在这里留下来。

个人见解

我只是按照公式教程做了一遍,但是我成功地在minikube上搭建了本地集群。
学习Kubernetes并在本地机器上建立和测试环境似乎非常方便。
以此为契机,让我们每个人都拥有一个Kubernetes集群并投入到开发中吧(?)

广告
将在 10 秒后关闭
bannerAds