尝试使用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 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

如果按照上述的方式,启动成功!使用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集群状态的仪表盘。

如果原生的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集群并投入到开发中吧(?)