k3sとかKubeEdgeとか、次から次へと...技術革新が早いんですけど~

f:id:ts0818:20191113232025j:plain

第5世代移動通信システム(だい5せだいいどうつうしんシステム)。英語5th Generation, 「5G(ごジー、ファイブジー)と略記される。1G2G3G4Gに続く無線通信システムである。

第5世代移動通信システム - Wikipedia

⇧ 5Gって、そういうことか~。

どうもボクです。 

biz-journal.jp

そもそも欧米諸国が5Gを警戒しているのは、なぜなのか。その理由を検証する必要があるだろう。

 答えは簡単で、5Gの基地局からスマホに送信される電磁波が人体に悪影響を与えることが各国の医療関係者の研究によって次々に明らかになってきたからだ。

5G、重大な健康被害示す研究相次ぐ…世界で導入禁止の動き、日本では議論すら封印

⇧  え!

5G 本当に進めて、 大丈夫なんですかね...

まぁ、そんなこんなで、今回は、Kubernetesまわりにまつわる技術の調査です。レッツトライ~。

 

on-premise環境でmutli-nodeなKubernetes環境を実現するには?

今のところ、オンプレミス環境でもマルチノードなKubernetes環境を実現できる選択肢としては、 

などがあるらしい。

ちなみに、公式だと、

kubernetes.io

⇧  on-premise環境でmulti-nodeなKubernetes環境は、Kubeadm-dind ってのを紹介してるんですが、非推奨になったんで、Kind(Kubernetes IN Docker)をオススメしますってな感じっぽいんですが、Docker ToolBoxだと外部からkubectlでアクセスできないっていうね...

あと、Apache Cloudstackについても、 

kubernetes.io

⇧ 触れられています。

 

k3sって?

k3sは、「5 less than k8s」 ってのが何を意味してるのかはちょっとよく分からんのだけど、K3sの公式の説明だと、

k3s.io

Both ARM64 and ARMv7 are supported with binaries and multiarch images available for both. k3s works great from something as small as a Raspberry Pi or as large as an AWS a1.4xlarge 32GiB server.

K3s: Lightweight Kubernetes

⇧  「ARM64」と「ARMv7」だったら、Raspberry Piみたいな小型のものから、AWSの32GiBみたいな大型のものまで、様々な環境で利用できるらしい。

しかも、驚きのマルチノードなKubernetesに対応してるらしいですよ、奥さん! 

公式サイトの感じだと、 

で使って欲し気な雰囲気?

容量制限とかがシビアな環境でもイケるよってことをアピールしてらっしゃるようですかね。

 

github.com

⇧ そして「Apache License 2.0」 らしい。ありがたや~。

reikawatanabe.com

 

仕組みとしては、

⇧  Kubernetesでは、「API Server」を起点に、「Scheduler」「Controller Manager」とか別々になってたプロセスを、k3sでは、1つにまとめてるようです。「API Server」を起点ってところは変わらないと思うけど。

 

KubeEdgeって?

KubeEdgeって何ぞや?

kubeedge.io

KubeEdge is an open source system for extending native containerized application orchestration capabilities to hosts at Edge.It is built upon kubernetes and provides fundamental infrastructure support for network, app. deployment and metadata synchronization between cloud and edge. Kubeedge is licensed under Apache 2.0. and free for personal or commercial use absolutely. We welcome contributors!

Our goal is to make an open platform to enable Edge computing, extending native containerized application orchestration capabilities to hosts at Edge, which built upon kubernetes and provides fundamental infrastructure support for network, app deployment and metadata synchronization between cloud and edge.

KubeEdge

⇧  ザックリ言うと、コンテナオーケストレーションでエッジコンピューティングを実現できるようにしていきましょうってことらしい。

ちなみに、

orenocloud.tokyo

ハイブリッドクラウドとは、オンプレミスの自社システムとプライベートクラウドならびに、パブリッククラウドを適宜うまく組み合わせて利用していこうとする方法です。

クラウド・オンプレミスだけの運用は危険!企業が取り入れ始めたハイブリッドクラウドとは | 俺のクラウド

⇧  「クラウド」+「オンプレミス」= 「ハイブリッドクラウド」と言うらしい。

で、「エッジコンピューティング」はと言うと、

www.stratus.com

では、エッジコンピューティングの「エッジ(端)」とは、正確にはどこを指すのでしょうか。
そもそもエッジコンピューティングは、情報分析とそのレスポンスの遅延をなくしリアルタイム性を上げることを目的としています。そのために、クラウド側ではなく「現場の最前線」で情報を処理するのがエッジコンピューティングです。

エッジコンピューティングがなぜ注目されるのか―クラウド・オンプレミスとの違いとは | Stratus

大量のデータを的確に処理しなければならないときや、よりリアルタイム性の求められる情報はエッジ側、つまりオンプレミスで行います。一方、大規模な連携や集約が必要な情報や、処理速度の影響が少ない情報はクラウドで行うことで、データの管理にメリットが生まれます。こういった「情報をどこで処理するかの役割分担を的確に行う」のが、エッジコンピューティングの本来の姿だといえます。

エッジコンピューティングがなぜ注目されるのか―クラウド・オンプレミスとの違いとは | Stratus

⇧ ってあるように、「クラウド側」で処理するか「オンプレミス側」で処理するかのコントロールを行うってことですかね。

冷静と情熱のあいだ』ならぬ、『「クラウド」と「オンプレ」の狭間』みたいな...

 

Apache License 2.0 です!

エッジコンピューティングについては、

www.sbbit.jp

 クラウドコンピューティングが、サーバを集約して集中して処理する集中処理型に対して、エッジコンピューティングは、ネットワークにおける端末機器において情報を処理したり、ネットワークにサーバを分散配置して処理を行ったりする分散処理型となる。

エッジコンピューティングとは何か? IoTの関連事例や課題、市場動向まとめ |ビジネス+IT

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

で、そんな「KubeEdge」のアーキテクチャがこちら。

KubeEdge is composed of these components:

  • Edged: an agent that runs on edge nodes and manages containerized applications.
  • EdgeHub: a web socket client responsible for interacting with Cloud Service for edge computing (like Edge Controller as in the KubeEdge Architecture). This includes syncing cloud-side resource updates to the edge and reporting edge-side host and device status changes to the cloud.
  • CloudHub: A web socket server responsible for watching changes at the cloud side, caching and sending messages to EdgeHub.
  • EdgeController: an extended kubernetes controller which manages edge nodes and pods metadata so that the data can be targeted to a specific edge node.
  • EventBus: an MQTT client to interact with MQTT servers (mosquitto), offering publish and subscribe capabilities to other components.
  • DeviceTwin: responsible for storing device status and syncing device status to the cloud. It also provides query interfaces for applications.
  • MetaManager: the message processor between edged and edgehub. It is also responsible for storing/retrieving metadata to/from a lightweight database (SQLite).

What is KubeEdge — KubeEdge Documentation 0.1 documentation

⇧ 要は、「CloudHub」がクラウド側の監視を行っていて、クラウド側で何かしらの変更があった場合、ソケット通信で「EdgeHub」に知らされ、エッジ側に変更を反映してエッジ側のホストとデバイスの状態を、クラウド側に伝えるってことかと。

 

Kubernetesアーキテクチャと見比べてみる。

⇧  相変わらず、「Kube-apiserver」と言ったり「API Server」と言ったり、同じものを別の呼び名で言うとか、止めて欲しいですね...

言いたいことは、「Kubernetes」「KubeEdge」のどちらも、「Kube-apiserver」が起点になってるってことでしょうか。

コンテナオーケストレーションでエッジコンピューティングってことで、「k3s」とかでも使えるんですかね?

そして、「5G」において「エッジコンピューティング」は重要になってくるらしい。

www.fujitsu.com

businessnetwork.jp

 

というか、「エッジコンピューティング」が機能してくるとすると、クラウドの存在意義が薄くなってきてるようなって思ったら、 

data.wingarc.com

⇧  同じようなことを思ってる人がおったと。


 

k3sを試してみたけど...

これは試してみるしかないでしょう、ということで、k3s を試してみたいと思います。KubeEdge は、クラウドが絡んでくるということで、またの機会で。

で、k3s ですが、

www.mazn.net

⇧  上記サイト様によりますと、 Dockerコンテナ内で、k3sを構築してくれるツールがあるそうです。

その名も、「k3d(k3s in docker)」

github.com

⇧  別の人が上げてくれてるGitHubリポジトリを元にしてるらしい。

 

そんじゃ、私は、Windows 10 Home を使っているので、Docker ToolBoxで仮想マシンを作成して、DockerHubからCentOS7のコンテナ作成用のdocker imageを取得するということで。

まずは、仮想マシンを作成。(本当は、Vagrantとか使った方が良いのかも知らんが) 

f:id:ts0818:20191114194252p:plain

指示された通りのコマンドを実行で。

f:id:ts0818:20191114194533p:plain

そしたらば、DockerHubのDockerイメージを利用して、CentOS7のコンテナを作成で。(DockerHubのアカウント登録が済んでない場合は、登録しちゃいましょう。)
Dockerfileを適当なディレクトリに作って、

f:id:ts0818:20191114205738p:plain

ファイルの内容は以下で。CentOS7系にTomcat 9系と、Javaをインストールする感じです。気を付けたいのは、WARのJavaのバージョンと同じ、Javaをインストールするってことですかね、まぁ、k3s を使う上では必要ないんだけど...。

Dockerfileの設定は、公式のドキュメントを参考で。

docs.docker.jp 

FROM centos:centos7

ENV APP_PATH /opt/tomcat
WORKDIR $APP_PATH
RUN curl -O https://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz
RUN tar xvfz apache*.tar.gz
RUN mv apache-tomcat-9.0.27/* $APP_PATH/.
RUN yum -y install java-11-openjdk java-11-openjdk-devel
RUN java -version

WORKDIR $APP_PATH/webapps
ADD https://github.com/ts0818/TestSpringBoot/blob/master/HelloSpring-0.0.1-SNAPSHOT.war?raw=true HelloSpring-0.0.1-SNAPSHOT.war

EXPOSE 8080

CMD ["/opt/tomcat/bin/catalina.sh", "run"]

んで、Dockerfileのあるディレクトリまで移動して、Dockerイメージを作成。

docker build -t [Dokcerイメージ名] .

f:id:ts0818:20191114211217p:plain

f:id:ts0818:20191114211250p:plain

そしたらば、コンテナ起動で。

docker container run -it -d --name [コンテナ名] -p [ホスト側のポート]:[ゲスト側のポート] [REPOSITORY]:[TAG]

f:id:ts0818:20191114211946p:plain

んで、ブラウザから、「http://仮想マシンのIP:[ホストのポート]」でアクセス。

f:id:ts0818:20191114212404p:plain

f:id:ts0818:20191115230835p:plain

はい、CentOS7のコンテナは準備OK。

ちなみに、Docker ToolBoxで作成された仮想マシンのOSと、コンテナのOSは別物ですから~。

f:id:ts0818:20191115232741p:plain

f:id:ts0818:20191115233713p:plain

 

で、k3d は、クライアントツールらしく、Windowsを使ってる場合は、Windows側でインストールするって?って思ったら、対応してなかった...少なくともMsys2だとNG。

f:id:ts0818:20191117114308p:plain

⇧  k3d のビルドに必要なライブラリとかも分からんし...

Git for Windowsのgit bashで試すも、

f:id:ts0818:20191117122316p:plain

⇧  そもそも、「sudo: command not found」ってなってる時点で、Windowsでもインストールできるってのは怪しい気がする...

 

以下のサイトの記事だと、k3dがwindows の記載もあるんだけど...

medium.com

Installation

First the installation (of course you need to have docker installed and the kubectl cli).
Launch the following install script that will detect your processor architecture (386, amd64) and your OS (linux, darwin, windows) and then install the cli tool :

wget -q -O - https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash 

k3d + k3s = k8s perfect match for dev and testing - Yann Albou - Medium

⇧  何をもって、Windowsでもいけるって言ってんのか謎過ぎる...。

 

なんで、おそらく、仮想マシンのOSに、kubectlとk3dをインストールすることになるかと。でも、それだと、Windows(ホストOS側)からアクセスできないっていうね...

まぁ、これが、Docker ToolBoxの限界なんですかね...

なんで、NG集にまとめたんですけど、 Windows(ホストOS側)からのkubectlでのアクセスができないけど、k3sでのKubernetes環境は確かに構築できると...外部からkubectlでアクセスできないから意味ないけど...。

なんか、kind(Kubernetes IN Docker)と同じような状態になるってことですかね...

ネットワーク系が詳しければやりようがあるのかもしれんですが、あたくしはネットワーク系の知識が欠しく、対応できませんでした(涙)。

誰か、詳しい人が情報公開してくれるのを期待しますか~。

 

今回はこのへんで。

 

NG集

はい、ちゅうわけで、k3sをインストールするために、作成したDokcerコンテナにログイン。

k3dをインストール。

wget -q -O - https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash    

wgetコマンドが無いとか言うんですよ~、な~に~!?やっちまったな!

CentOS8系からは、パッケージ管理ツールが変わるらしいけど、CentOS7はyumなんで、yum install でwgetをインストール。

f:id:ts0818:20191115234332p:plain

改めまして、

f:id:ts0818:20191115234636p:plain

which も無いやんけ~!いざ!

f:id:ts0818:20191115235125p:plain

既に、k3d インストール済...大丈夫かいな...

f:id:ts0818:20191115235243p:plain

で、コンテナ内で、k3s作ろうとしたら、エラー。

f:id:ts0818:20191115235432p:plain

もしかして、コンテナ内でk3d使うんでは無い?
コンテナ外へ、のち、仮想マシン内へ。パスワードは、デフォルトのままなら、「tcuser」でOK。

f:id:ts0818:20191115235924p:plain

からの、

f:id:ts0818:20191116000144p:plain

まさかの、コンテナのOSほうにインストールしちゃったから、仮想マシンのほうのOSにもインストールっすか...

っていうか、

f:id:ts0818:20191116000347p:plain

そして、罠がもう1つ。なんと、k3dのバージョンと、k3sのバージョンは噛み合ってないという...

hub.docker.com

⇧  でバージョンを選びました。

f:id:ts0818:20191116001344p:plain

どうやら、コンテナ内、Dockerホストで、k3d をインストールするんではなくて、ホストOS側にインストールするらしかった...知らんがな。(Windowsだと、ホストOS側でのインストールに対応してないっぽい...)

というわけで、docker ps で動いてるコンテナ一覧を表示して、docker container stop [CONTAINER ID] でコンテナ停止して、docker rm -f [CONTAINER ID] でコンテナ削除で~。

f:id:ts0818:20191116095819p:plain

仮想マシン内のOSにダウンロードしてた、k3d は、仮想マシン起動したら、Dockerもデーモンも停止するから、 /home/docker にあるものは根こそぎ消えてますから大丈夫そうですかね。

f:id:ts0818:20191116100824p:plain