kind(Kubernetes IN Docker)なら、オンプレミス(on-premiss)な環境で、multi-nodeなKubernetes(K8s)環境を構築できるらしい

f:id:ts0818:20191006172949j:plain

『PAN 〜ネバーランド、夢のはじまり〜(監督:ジョー・ライト)』

卑怯は海賊の特権だ

フック船長:ピーターパン

騙し打ちは、現実社会でも横行していますね、どうもボクです。

政治家もそういった意味では海賊と変わらんですな、政治家だけじゃないけど。

というわけで、今回は、マルチノードなKubernetesがオンプレミス環境でも実現できるという、kind(Kubernetes IN Docker)にレッツトライ~。

 

KubernetesK8s)とは?

そもそも、KubernetesK8s)って?

kubernetes.io

Kubernetesは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースプラットホームです。

Kubernetesとは何か? - Kubernetes

Googleは2014年にKubernetesプロジェクトをオープンソース化しました。KubernetesGoogleが大規模な本番ワークロードを動かしてきた10年半の経験と、コミュニティから得られた最善のアイデア、知見に基づいています。

Kubernetesとは何か? - Kubernetes

⇧  元々は、Googleが実際のプロジェクトで利用していたものを、オープンソース化してくれたものらしい。

現在は、「CNCF (Cloud Native Computing Foundation: クラウドネイティブなOSS技術の推進を行う団体)」が管理してるらしい。

www.cncf.io

団体の理念とかは、

github.com

GitHubに掲載されてます。

 

Kubernetesの仕組みは、英語版のWikipediaに載ってると。

f:id:ts0818:20191006222930p:plain

Kubernetes architecture diagram

Kubernetes - Wikipedia

⇧  Master Nodeが必ず1つ、普通のNodeが1つっていう構成がKubernetesの最小構成になるのかな。上図は、普通のNodeが複数あるので、マルチノード(multi-node)ってことになるかと。

で、仕組みはよく分からんのだけど、Pod っていうコンポーネントを作って、その中にコンテナ(Dockerとかで作成?)を作って、アプリケーションはその中に配置とかって流れらしい。

f:id:ts0818:20191006223307p:plain

Simplified view showing how Services interact with Pod networking in a Kubernetes cluster 

Kubernetes - Wikipedia

⇧  Pod にIPアドレスが割り当てられるので、コンテナはそのIPアドレスを経由して、サービスと接続できるってことらしい。

ここで言う、サービスって何よ?

An abstract way to expose an application running on a set of Pods as a network service.

With Kubernetes you don’t need to modify your application to use an unfamiliar service discovery mechanism. Kubernetes gives Pods their own IP addresses and a single DNS name for a set of Pods, and can load-balance across them.

Service - Kubernetes

「ポッドのセットで実行されているアプリケーションをネットワークサービスとして公開する抽象的な方法。」 だそうな...

で、そのサービスには何があるのかを知りたいんだけど...一覧とかないのかね?

kubernetes.io

クラスター内(DNSサーバーそれ自体も含む)で定義された全てのServiceはDNS名を割り当てられます。デフォルトでは、クライアントPodのDNSサーチリストはPod自身のネームスペースと、クラスターのデフォルトドメインを含みます。

ServiceとPodに対するDNS - Kubernetes

うん、分からん...

qiita.com

⇧  上記サイト様によりますと、Kube-ProxyとPodの間に自分で作成するものらしい、たぶん。なので、図で表すと、

f:id:ts0818:20191013150605j:plain

Pod と、Kube-Proxy みたいなDNSサービスとの間に「サービス」を作成する必要があるってことですかね?
いつも、思うんだけど、何で全体のアーキテクト図を載せてくれないのか...まずは、全体図を俯瞰してみれたほうが技術者にとってもありがたいと思うんですけど、オープンソースにそこまで求めてはいけないってことですかね。

 

kind(Kubernetes IN Docker)って?

そんじゃ、kind(Kubernetes IN Docker)って何ぞ?

kind or kubernetes in docker is a suite of tooling for local Kubernetes “clusters” where each “node” is a Docker container. kind is targeted at testing Kubernetes.

kind is divided into go packages implementing most of the functionality, a command line for users, and a “node” base image. The intent is that the kind the suite of packages should eventually be importable and reusable by other tools (e.g. kubetest) while the CLI provides a quick way to use and debug these packages.

https://kind.sigs.k8s.io/docs/design/initial/#overview

⇧  Docker コンテナを作成して、その中に、Kubernetes環境を構築してくれるってことなんだけど、

⇩  アーキテクト図を見る限り、

⇧  初期状態は、Master Nodeのみってことなのかな?う~ん、分かりづらい...

Dockerコンテナは入れ子になる感じかな(KubernetesがDockerコンテナの中にあることになるので、Kubernetesの中のPodに作られるDockerコンテナは、Dockerコンテナの中にあるDockerコンテナっていう入れ子構造になるはず、ややこしいな)

 

kind(Kubernetes IN Docker)で注目されるのは、

Why kind?

 

https://kind.sigs.k8s.io/

⇧ マルチノードなKubernetes環境が実現できるってとこですかね。

Minikube は、シングルノードしか駄目だったし、kubeadm は、複雑だった気がするし、その点、kind(Kubernetes IN Docker)は後発だけあって、いろいろ改善されてるようです。

Cluster Creation

Each “node” runs as a docker container. Each container initially boots to a pseudo “paused” state, with the entrypoint waiting for SIGUSR1. This allows us to manipulate and inspect the container with docker exec ... and other tools prior to starting systemd and all of the components.

This setup includes fixing mounts and pre-loading saved docker images.

Once the nodes are sufficiently prepared, we signal the entrypoint to actually “boot” the node.

We then wait for the Docker service to be ready on the node before running kubeadm to initialize the node.

Once kubeadm has booted, we export the KUBECONFIG, then apply an overlay network.

At this point users can test Kubernetes by using the exported kubeconfig.

https://kind.sigs.k8s.io/docs/design/initial/#overview

⇧ 内部的には、kubeadm を使ってるみたいっすね。 

 

kind(Kubernetes IN Docker)を導入してみる

んでは、さっそく、kind(Kubernetes IN Docker)を導入してみます。Dockerをインストールしていない方は、インストールしておきましょう。

2019年10月12日(土)、Docker 1.12 RC までのドキュメントが存在するらしい。

docs.docker.jp

って方法があるらしい。WSL、WSL2 は、Windows 10 でないと使えない気がする、たぶん(古い、Windows 10だと、Windows Updateである一定以上のバージョンにしておかないと駄目な気がする)

自分は、Windows 10 Homeなので、Docker ToolBoxを使ってます。

 

forest.watch.impress.co.jp

 「Hyper-V」を有効にした環境では、一部のサードパーティ製仮想化ツールが機能しない。つまり、「WSL 2」とサードパーティーツールを共存させることはできないが、そのツールには残念ながら「VMWare」と「Virtual Box」が含まれる。

 同社はこの問題を解決する方法を調査中だが、目下有効なのが“Hypervisor Platform”と呼ばれるAPIだ。このAPIを利用すれば、サードパーティの仮想化プロバイダーが自社ソフトに「Hyper-V」との互換性を持たせることが可能。たとえば「Google Android Emulator」ではこの仕組みが用いられており、「Hyper-Vアーキテクチャーとの互換性がある。

「WSL 2」は「Windows 10 Home」でも利用可能 ~MicrosoftがFAQを掲載 - 窓の杜

⇧  仮想化も動きが激しいですね。

 

で、kind(Kubernetes IN Docker)なんですが、

github.com

You can install kind with GO111MODULE="on" go get sigs.k8s.io/kind@v0.5.1.

NOTE: please use the latest go to do this, ideally go 1.13 or greater.

This will put kind in $(go env GOPATH)/bin. If you encounter the error kind: command not found after installation then you may need to either add that directory to your $PATH as shown here or do a manual installation by cloning the repo and run make build from the repository.

Without installing go, kind can be built reproducibly with docker using make build.

GitHub - kubernetes-sigs/kind: Kubernetes IN Docker - local clusters for testing Kubernetes

⇧  ってな感じで、Go を使っても使わなくてもインストールはできるらしい。

せっかくなんで、Goを使う場合で試してみます。

んで、Windows以外の環境だと、goenv っていうgoのパッケージ管理ツールを利用できるらしいんだけど、毎度のこと、Windowsは除け者なので、Chocolateyでアップグレードしようとしたんですが...

f:id:ts0818:20191013193748p:plain

f:id:ts0818:20191013194132p:plain

更新されとらんやんけ~!

f:id:ts0818:20191013195344p:plain

まさかの、インストーラーを起動しろパターン?

f:id:ts0818:20191013202333p:plain

f:id:ts0818:20191013202429p:plain

f:id:ts0818:20191013202522p:plain

f:id:ts0818:20191013202548p:plain

f:id:ts0818:20191013202737p:plain

f:id:ts0818:20191013202845p:plain

変わらんし...何でや~!

答えがここに...

If you are upgrading from an older version of Go you must first remove the existing version.

Getting Started - The Go Programming Language

⇧  まさかの、旧いバージョンを削除しろと...

To remove an existing Go installation from your system delete the go directory. This is usually /usr/local/go under Linux, macOS, and FreeBSD or c:\Go under Windows.

You should also remove the Go bin directory from your PATH environment variable. Under Linux and FreeBSD you should edit /etc/profile or $HOME/.profile. If you installed Go with the macOS package then you should remove the /etc/paths.d/go file. Windows users should read the section about setting environment variables under Windows.

Getting Started - The Go Programming Language

⇧  「c:\Go」を削除しろってあるけど、「C:\Users\[ユーザ名]\go」のほうは削除せんで良いのかな?

とりあえず、「c:\Go」を削除で。

f:id:ts0818:20191013204659p:plain

消したけど...なんか、Chocolateyが、「golang v1.13.1 already installed.」って言ってくるんだが...

f:id:ts0818:20191013204944p:plain

「C:\Users\[ユーザ名]\go」も削除してみる。

f:id:ts0818:20191013205046p:plain

いや、「golang v1.13.1 already installed.」って意味が分からん...削除したし。

f:id:ts0818:20191013205243p:plain

インストーラーとかも削除したけど、変わらんし...

f:id:ts0818:20191013205410p:plain

f:id:ts0818:20191013220134p:plain

Chocolatey でアンインストールしないといけなかったらしい...何じゃそりゃ~!

っていうかChocolateyのアンインストールって不安定だった気がするんだけど...もう、よく分からん...go は普通にChocolateyでアンインストールできるらしい。

f:id:ts0818:20191013220620p:plain

2019-10-13 22:05:34,903 21944 [INFO ] - VERBOSE: Retrieving all uninstall registry keys
2019-10-13 22:05:35,337 21944 [DEBUG] - Registry uninstall keys on system: 589
2019-10-13 22:05:35,339 21944 [DEBUG] - Error handling check: 'Get-ItemProperty' fails if a registry key is encoded incorrectly.
2019-10-13 22:05:35,702 21944 [DEBUG] - Found 0 uninstall registry key(s) with SoftwareName:'golang*'
2019-10-13 22:05:35,711 21944 [WARN ] - WARNING: golang has already been uninstalled by other means.
2019-10-13 22:05:35,727 21944 [DEBUG] - Built-in PowerShell host called with ['[System.Threading.Thread]::CurrentThread.CurrentCulture = '';[System.Threading.Thread]::CurrentThread.CurrentUICulture = ''; & import-module -name 'C:\ProgramData\chocolatey\helpers\chocolateyInstaller.psm1'; & 'C:\ProgramData\chocolatey\helpers\chocolateyScriptRunner.ps1' -packageScript 'C:\ProgramData\chocolatey\lib\golang\tools\chocolateyuninstall.ps1' -installArguments '' -packageParameters '''] exited with '0'.
2019-10-13 22:05:35,731 21944 [INFO ] -  Skipping auto uninstaller - AutoUninstaller feature is not enabled.
2019-10-13 22:05:35,736 21944 [DEBUG] - Calling command ['"C:\WINDOWS\System32\shutdown.exe" /a']
2019-10-13 22:05:37,426 21944 [DEBUG] - Command ['"C:\WINDOWS\System32\shutdown.exe" /a'] exited with '1116'
2019-10-13 22:05:37,431 21944 [DEBUG] - Attempting to delete directory "C:\ProgramData\chocolatey\lib-bkp\golang".
2019-10-13 22:05:37,448 21944 [DEBUG] - [NuGet] Removed file 'chocolateyinstall.ps1' to folder 'C:\ProgramData\chocolatey\lib\golang\tools'.
2019-10-13 22:05:37,450 21944 [DEBUG] - [NuGet] Removed file 'chocolateyuninstall.ps1' to folder 'C:\ProgramData\chocolatey\lib\golang\tools'.
2019-10-13 22:05:37,452 21944 [DEBUG] - [NuGet] Removed folder 'C:\ProgramData\chocolatey\lib\golang\tools'.
2019-10-13 22:05:37,454 21944 [DEBUG] - [NuGet] Removed file 'golang.nuspec' to folder 'C:\ProgramData\chocolatey\lib\golang'.
2019-10-13 22:05:37,455 21944 [DEBUG] - [NuGet] Removed file 'golang.nupkg' to folder 'C:\ProgramData\chocolatey\lib\golang'.
2019-10-13 22:05:37,456 21944 [DEBUG] - [NuGet] Removed folder 'C:\ProgramData\chocolatey\lib\golang'.
2019-10-13 22:05:37,457 21944 [INFO ] - [NuGet] Successfully uninstalled 'golang 1.13.1'.
2019-10-13 22:05:37,473 21944 [INFO ] -  golang has been successfully uninstalled.

っていうか、「VERBOSE: Retrieving all uninstall registry keys」って...レジストリキーにも影響あるんか~い!

f:id:ts0818:20191013221658p:plain

⇧  こいつらにも手が入ってるってことかね...

まぁ、何はともあれ、これでインストールし直せるってことっすかね。っていうか、「choco upgrade golang」って使えないんじゃない?これ。

そんじゃ、インストールで。

f:id:ts0818:20191013221958p:plain

f:id:ts0818:20191013222137p:plain

できました~!

というか、go に関しては、アップグレードっていう概念は無いってことで、再インストールってことをしないといけないということですかね。

f:id:ts0818:20191013222218p:plain

で、「kind(Kubernetes IN Docker)」を導入しようとしたら、

f:id:ts0818:20191013222605p:plain

エラー。

f:id:ts0818:20191013223457p:plain

gitBash で試してみたら、コマンドは実行されたっぽいけど、

f:id:ts0818:20191013223405p:plain

f:id:ts0818:20191013223909p:plain

⇧  エラー。

If you have go (1.11+) and docker installed GO111MODULE="on" go get sigs.k8s.io/kind@v0.5.1 && kind create cluster is all you need!

GitHub - kubernetes-sigs/kind: Kubernetes IN Docker - local clusters for testing Kubernetes

⇧  っていうか、誇大広告と同じ手口とか止めて~、情報を端折るの良くない。絶対、仮想マシンの起動しとかないと駄目な奴じゃない?これ。

どこを見ても事前に仮想マシンを起動状態にしておくとは書いてないけど、動かしといてみる。

f:id:ts0818:20191013224421p:plain

そんで、もう一回試してみる。

f:id:ts0818:20191013224834p:plain

ファイヤーウォール出たら「アクセスを許可する(A)」で。

f:id:ts0818:20191013224751p:plain

f:id:ts0818:20191013224937p:plain

コンテナが作成されて、Kubernetes環境が起動しました~!

f:id:ts0818:20191013225550p:plain

時間の都合上、一旦、仮想マシンを停止して翌日に持ち越しで。

 

翌日。

仮想マシンを起動。

kind(Kubernetes IN Docker)で作成したコンテナが止まってるので、起動。

っていうか、公式のリファレンス腹立たしいわ~。

docker container start [OPTIONS] CONTAINER [CONTAINER...]

⇧ 「CONTAINER」って具体的に何を指してるか説明しろっての!

とりあえず、「CONTAINER ID」はイケるらしいけど...

docker container start [CONTAINER ID]

f:id:ts0818:20191014102505p:plain

まぁ、コンテナ再起動で、kind(Kubernetes IN Docker)な環境も再開されるってことで。

 

kind(Kubernetes IN Docker)の使い方については、

blog.cybozu.io

techblog.gmo-ap.jp

blog.1q77.com

⇧  上記サイト様が、いろいろ情報を上げてくれているようです。

というわけで、kind(Kubernetes IN Docker)を導入すれば、Kubernetes環境の学習が捗るのではと期待して。

今回もモヤモヤ感が半端ないですが、今回はこのへんで。 

 

NG集

やっぱりというか、Windowsには対応してないっていう...おかげで1日を無駄にしてしまったではないか...

ここから先は、goenv がWindowsでもインストールできると信じて裏切られた軌跡になります。っていうか、いい加減、Windowsだけ除け者にするの止めてくれんかね?

Go をインストールしていくわけですが、Goのバージョン管理ツールが存在するらしい。

github.com

Check out goenv where you want it installed. A good place to choose is $HOME/.goenv (but you can install it somewhere else).

goenv/INSTALL.md at master · syndbg/goenv · GitHub

⇧ インストール場所は、Windowsの場合は、「C:\Users\[ユーザー名]」とかで良いってことかな?

goenvのインストールには、git が必要なので、インストールしてない方は、インストールしちゃいましょう。⇒ Git - Gitのインストール

ちなみに、Windows は、Unix系との相性が最悪なので、

などなど、インストールすることで、疑似的なUnix環境を構築するっていう涙ぐましい努力を重ねてきてるらしいと。じゃないと、git とかも使えない(涙)。

最近は、WSL2 とかも出たそうな。

なので、「.bash_profile」ってファイル自体も無いらしい。

www.softantenna.com

⇧  上記サイト様が詳しいです。

 

んじゃあ、goenv インストールで。

git clone https://github.com/syndbg/goenv.git .goenv    

f:id:ts0818:20191009080713p:plain

f:id:ts0818:20191009075520p:plain

f:id:ts0818:20191009080835p:plain

とりあえず、「c:\Users\[ユーザー名]\.bash_profile」を作成しときますか。 

ちなみに、Git をインストールした場所に「.bash_profile.sh」ってファイルがあるんで、「.bash_profile」とか自動で読み込んでくれるんすかね?

f:id:ts0818:20191013154511p:plain

「c:\Users\[ユーザー名]\.bash_profile」を作成。

f:id:ts0818:20191013155831p:plain

f:id:ts0818:20191013155057p:plain

そしたらば、「c:\Users\[ユーザー名]\.bash_profile」を編集。

f:id:ts0818:20191013155941p:plain

んで、git bash を起動するとエラー。

f:id:ts0818:20191013175039p:plain

なんか、「eval "$(goenv init -)"」ってやつが、上手く機能してないらしい。

コメントアウトしてみたけど、

f:id:ts0818:20191013175324p:plain

どっちにしろ、パスの問題?が解決できない...もう、本当、WindowsUnix環境との互換性の無さに辟易しますわ...

f:id:ts0818:20191014113342p:plain

「C:\Users\[ユーザ名]\.goenv\bin」まで移動すれば、動くらしいけど。

f:id:ts0818:20191014113516p:plain

 

同じような現象に苦しんでる方が...

qiita.com

⇧  上記サイト様によりますと、シンボリックリンクが影響してるらしいと。

理由は分からないんですが、Windows環境で、goenvに設定されてるらしきシンボリックリンクが効かなくなってしまっているってことなんですかね、理由が分からんけれども...

確かに、「~/.goenv/bin/goenv」にシンボリックリンクが貼られてない...

f:id:ts0818:20191014114452p:plain

シンボリックリンクを貼ってみる。

f:id:ts0818:20191014115218p:plain

貼れたのかな?

f:id:ts0818:20191014115454p:plain

はい、駄目でした。

f:id:ts0818:20191014120952p:plain

Git for WindowsとMsys2だと、Unix環境がまた変わってくるんですかね?

qiita.com

opcdiary.net

簡単にまとめると以下の理由からデフォルトではシンボリックリンクは不使用に設定されています。

簡単に言うとあきらめようなのですが、以上、特にPOSIXとの違いを正しく理解した上で使用するのであれば問題は少ないと思います。

Git for Windowsでのシンボリックリンク | OPCDiary

⇧  まさかの、Git for Windows のデフォルトだと、シンボリックリンクが使えない問題!

github.com

 

時間ある時に、Git for Windowsでのシンボリックリンク設定やっていきたいと思います。

*env 系は、Windowsとは特に相性悪そう...