在HelloMinikube上学习k8s
我开始使用Kubernetes。
尽管这个话题在世界范围内已经很久有所讨论,但我现在由于工作的原因,将要接触一些Kubernetes,所以我现在正在拼命学习。虽然我也想在家里学习Kubernetes,但是我的MacBookAir实在太低配了。所以我听说了一个方便的解决方案叫做Minikube,我决定尝试一下。
在准备努力学习时,我几天前购买了下面的书,并轻松地读完了最后一章。Kubernetes真是涉及范围广且非常深奥呢…
“Minikube是什么?”
Minikube是一款工具,可以在Windows或Mac等操作系统上快速构建和运行本地Kubernetes。它的便捷之处在于,但也受到了一些功能上的限制,无法使用Kubernetes的部分功能。Minikube会在虚拟机上创建Master和Node,因此需要使用VirtualBox或Hyper-V等虚拟化软件。
我的环境
-
- MacBook Air (13-inch, Mid 2012)
OS : macOS Catalina(10.15)
プロセッサ : 1.8 GHz デュアルコアIntel Core i5
メモリ : 4 GB 1600 MHz DDR3
ディスク : 128GB (外部ストレージ : 1TB)

Kubernetes是一种容器化平台,它通过在节点上运行容器(Pod)以及管理Kubernetes的主控节点来实现容器的调度。而Minikube则在一个虚拟机内同时运行这两个组件。
每个节点由多个组件组成,并且在虚拟机中作为Docker容器运行。有关组件的详细信息,请参考官方文档等。
你好,我试过了Minikube。
你好,我基于Minikube尝试了一下Minikube。
0. 预先准备
- Homebrewをアップデート
$ brew update
- VirtualBoxをインストール
$ brew cask install virtualbox
1. 安装 Minikube
$ brew cask install minikube
2. 启动Minikube
$ minikube start --vm-driver=virtualbox
? minikube v1.4.0 on Darwin 10.15
? Tip: Use 'minikube start -p <name>' to create a new cluster, or 'minikube delete' to delete this one.
? Starting existing virtualbox VM for "minikube" ...
⌛ Waiting for the host to be provisioned ...
? Preparing Kubernetes v1.16.0 on Docker 18.09.9 ...
? Downloading kubelet v1.16.0
? Downloading kubeadm v1.16.0
? Relaunching Kubernetes using kubeadm ...
⌛ Waiting for: apiserver proxy etcd scheduler controller dns
? Done! kubectl is now configured to use "minikube"
在VirtualBox中创建了一台名为minikube的虚拟机。

Minikube也拥有与Kubernetes相同的界面,即所谓的“dashboard”。
$ minikube dashboard
? Verifying dashboard health ...
? Launching proxy ...
? Verifying proxy health ...
? Opening http://127.0.0.1:50668/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
浏览器自动启动并显示了屏幕。但是我完全看不懂…

3. 创造发展
首先,启动容器(开发)。
$ kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
error: no matches for kind "Deployment" in version "extensions/v1beta1"
嗯…!?出错了。
它说在extensio ns/v1beta1版本中没有部署!?
我查了很多但完全没有找到相关信息…
试着检查一下kubectl的版本。
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
由于客户端的kubectl版本似乎很旧,所以尝试升级版本。
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
由于客户端和服务器都升级到了相同的v1.16.0版本,因此我打算重新执行命令。
$ kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
deployment.apps/hello-node created
哇!看起来这次完成了!(要花了相当长的时间才达到这一步……)
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 27m
当查看仪表板时,存在Deployment、Pod和ReplicaSet的创建。

Pod是容器的实体,ReplicaSet负责监视Pod并根据指定的副本数进行调整。此外,Deployment管理ReplicaSet,可以实现滚动更新和回滚。
稍微有些复杂,但是Deployment 管理 ReplicaSet,而 ReplicaSet 管理 Pod,形成了一个三层的父子关系。
4. 创建服务
为了能够访问创建的容器,我们要创建一个网络(服务)。
$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
service/hello-node exposed
我会确认一下已经推出的服务。
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node LoadBalancer 10.110.214.34 <pending> 8080:30341/TCP 99s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d
我们所创建的负载均衡器服务将分配给Kubernetes集群外部,具有外部连通性的虚拟IP地址,但是部署此服务的基础设施必须支持这个机制。
在使用GCP或AWS等云服务的情况下,几乎都支持使用Kubernetes。但是,在本地启动的情况下,很遗憾通常不支持,因此不会分配虚拟IP。EXTERNAL-IP将一直保持为状态。
当创建LoadBalancer服务时,ClusterIP和NodePort也会同时创建。
ClusterIP是用于容器内部通信的IP地址,只能从集群内部进行连接。本次分配的IP地址是”10.110.214.34″。
NodePort是为接收外部访问而分配的端口号,本次为”30341″。若LoadBalancer服务正常运行,则在图像中可想象为从集群外的LoadBalancer向NodePort进行负载均衡。
显示图像
使用Minikube服务启动服务。
$ minikube service hello-node
|-----------|------------|-------------|-----------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------|-------------|-----------------------------|
| default | hello-node | | http://192.168.99.101:30341 |
|-----------|------------|-------------|-----------------------------|
? Opening kubernetes service default/hello-node in default browser...

浏览器自动启动并显示“Hello World!”。
URL 192.168.99.101:30341 是“VM地址:节点端口”。
只需一个选项,中国代词如下:
作为参考,我将尝试在Minikube的虚拟机中使用ClusterIP进行访问。
通过使用minikube ssh,您可以连接到节点进行ssh连接。这很方便。
$ minikube ssh
_ _
_ _ ( ) ( )
___ ___ (_) ___ (_)| |/') _ _ | |_ __
/' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )( ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)
$ curl 10.110.214.34:8080
Hello World!
哇哦!你成功地访问到了啊。
我将这个已经建立起来的环境整理成了图表。就是这个样子吧。

清理
刪除最後創建的服務和部署。
$ kubectl delete service hello-node
service "hello-node" deleted
$ kubectl delete deployment hello-node
deployment.apps "hello-node" deleted
结束了。
最后
由于在自己的环境中运行Kubernetes相当困难,所以可以通过使用Minikube来轻松地试用。虽然Hello Minikube被称为示例,但要理解每个组件的具体功能以及它们搭建的结构,确实很困难。Kubernetes几乎已经成为在使用Docker时的标准,因此我希望能够继续学习并尝试各种命令。
赠品.
在Hello Minikube的网站上,提供了一个名为Katacoda的服务,即使不安装上述内容,也可以在Web上尝试Minikube。这样更加方便,我也推荐使用这个服务。与几年前相比,只要有动力,任何人都可以在轻松的环境中学习。
请参考以下链接。
-
- Qiita : minikubeをMacにインストールする
-
- kubernetesチュートリアル : Hello Minikube
-
- minkube Documentation
- Installing Kubernetes with Minikube