在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)

ツールバージョンVirtualBox6.0.12 r133076 (Qt5.6.3)Kubernetesv1.16.0Docker18.09.9Minikubev1.4.0 on Darwin 10.15kubectl (Client)v1.10.3 → v1.16.0kubectl (Server)v1.16.0
名称未設定.png

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的虚拟机。

スクリーンショット 2019-10-11 22.53.15.png

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...

浏览器自动启动并显示了屏幕。但是我完全看不懂…

スクリーンショット 2019-10-11 23.08.56.png

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的创建。

スクリーンショット 2019-10-16 23.50.50.png

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...
スクリーンショット 2019-10-17 0.03.01.png

浏览器自动启动并显示“Hello World!”。
URL 192.168.99.101:30341 是“VM地址:节点端口”。

只需一个选项,中国代词如下:
作为参考,我将尝试在Minikube的虚拟机中使用ClusterIP进行访问。
通过使用minikube ssh,您可以连接到节点进行ssh连接。这很方便。

$ minikube ssh
                         _             _            
            _         _ ( )           ( )           
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __  
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ curl 10.110.214.34:8080
Hello World!

哇哦!你成功地访问到了啊。

我将这个已经建立起来的环境整理成了图表。就是这个样子吧。

qiita投稿用 (1).png

清理

刪除最後創建的服務和部署。

$ 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
bannerAds