MiniShiftに関する疑問の整理、「 Dockerから入るKubernetes」執筆打明け話とか、OKDやCRCとの整理など

開発者に愛用されているVagrantとVirtualBoxの環境を作っている Mac や Windows10の環境で、MiniShiftを簡単に動かす方法について書きました。それから、「[15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで](https://www.amazon.co.jp/dp/4865941614?fbclid=IwAR3-D2BPS7wTJDlDlk_J7zKxJqyQ3wV-0vyfayCHhfP56x56wkKhkeMkuJE)」の執筆動機やMiniShiftを含めなかった諸事情について、内訳話を少々書きました。

注意：記事の内容は、個人の見解であって、所属する会社を代表するものではありません。[Red Hat CodeReady Containers (OpenShift4) のインストールのメモ](https://qiita.com/MahoTakara/items/83ea38e32987457ebbf4)も合わせて、参照頂ければと思います。

## MiniShiftについて

[OpenShift](https://www.openshift.com/)は、CNCFからソースコードが配布されるアップストリーム（源流）の[Kubernetes](https://kubernetes.io/)に、[Red Hat社](https://www.redhat.com/)独自の拡張を加え、さらに、Red Hatのソフトウェア保守とウェブや電話での問い合わせ対応サービスを提供する企業向けKubernetesのプラットフォームである。そのため、OpenShiftは、Red Hat社が提供する有償サービス(サブスクリプション )のもとで利用できるソフトウェアとなる。

つまり、OpenShiftの使用は有償のため「OpenShiftを勉強してスキルを身につけ、仕事の獲得を有利にしたい」と考えるエンジニアには障壁がある。 そして、OpenShiftの開発元であるRed Hatにとっても、OpenShiftのスキルを持ったエンジニアを増やすことが難しくなる。そこで、このジレンマを解決するために、OpenShiftの学習やローカルの開発環境用に無償で提供されるのが、[MiniShift](https://www.okd.io/minishift/)である。ただし、MiniShiftは、OpenShift バージョン3 のサポートまでとされ、バージョン4 以降は、[Red Hat CodeReady Containers](https://code-ready.github.io/crc/)(略称 CRC)に引き継がれることになっている。2019年10月 現在において、OpenShift 3.11 は、バージョン3系の最後のリリースとされ、延長サポートが終了する 2024年までの使用期限となる。

Red Hat OpenShift Container Platform Life Cycle Policy, https://access.redhat.com/support/policy/updates/openshift


## OKD,MiniShift,OpenShift Origin など混乱ごとの整理

OKD、OpenShift Origin, MiniShift, OpenShift, Kubernetes、CodeReady Containersの関係を明確に整理したものが無く、分かりずらい。というか、幾分、混乱を感じる。そこで、Red Hat のWebサイト と GitHub などから、整理を試みた。

**OKDとは**

英語特有の書き方かもしれないが、やたら営業的な修飾が長く、何を言いたいの解らない文が多いので、MiniShiftとOKDが混同されやすい。　MiniShift と OKD は別物である。

* OKDは、CICDとマルチテナントのデプロイが容易となるように拡張されたKubernetes
* OKDは、OpenShift Online　と OpenShift Container Platformのアップストリームコードベース

OKD自体は、オープンソースであり、マスターとワーカーノードから成るマルチノード環境に対応している。一方、MiniShiftは、その様な表記は見当たらないが、OKD を Minikube上で動作させたものと見なせる。

参考資料:
* https://www.okd.io/
* https://docs.okd.io/
* https://github.com/openshift/origin


**OpenSHift Originとは**

OKDの別名で、GitHubやドキュメントでは、Origin と表記されている。つまり、開発者チームは、Originとして進めていたが、マーケティング的な事情から、OKDに変更されたものと察することができる。

* OKDは、GitHubおよびドキュメントでは Originと表記される

参考資料: https://github.com/openshift/origin


**MiniShiftとは**

MihiShiftとは、OKDをローカル（パソコン）で動かすための、シングルノードのクラスタ環境であり、MiniKubeと同等と見なせる。

* Minishiftは、シングルノードのOKDクラスターをローカルで実行するのに役立つツール
* Minishiftは、ローカルマシンで日常的にOKDの試用と開発に利用できる

参考資料: https://www.okd.io/minishift/

**CodeReady Containersとは**

MiniShiftは、OpenShift バージョン3 のサポートまでとされ、バージョン4 以降は、[Red Hat CodeReady Containers](https://code-ready.github.io/crc/)に引き継がれることになっている。

* CodeReady Containersは、最小限の OpenShift 4.0以降のクラスタを実行できる
* マスターノードとワーカーノードの両方を単一ノードに収容する構成
* 技術的制約からCodeReady Containersは 一時的な使用しかできない
* CodeReady Containersから OpenShiftへのアップグレードパスは無い

CodeReady Containersの試用については、今後、別の記事で扱いたい。今回はMiniShiftについてフォーカスする。

参考資料: https://code-ready.github.io/crc/


## IBM の Kubernetes戦略 と Red Hat社の買収

筆者が所属するIBMという会社では、Kubernetesの利点や将来性に注目して、ソフトウェア製品、SIサービス、そして、クラウドサービスの全ておいて、Kubernetesを応用していく戦略で事業展開が進んでいる。この Kubernetes を中心とした事業展開を有利に推進するために、Kubernetesを開発する中心的な企業の一つである Red Hat社の買収を2019年7月に完了した。その様な背景から、IBMの社員全員は、Kubernetesが、どの様なものであるかを知っていることが必須知識とされ、そして、技術系職は、Kubernetesを使い熟せることが求められる様になった。

この様な潮流から、IBM社員はもとより、企業の情報システムのお客様、ビジネスパートナーとなっている会社の方々が、短い時間で効率良く、Kubernetesに関するスキルを身につけるための自習書が必要とされる状況が予想された。そのような動機から、[15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで](https://www.amazon.co.jp/dp/4865941614?fbclid=IwAR3-D2BPS7wTJDlDlk_J7zKxJqyQ3wV-0vyfayCHhfP56x56wkKhkeMkuJE)(以下 K8s自習書) を執筆した。


## K8s自習書とOpenShift(MiniShift & CRC)

IBM による Red Hatの買収活動は、2019年7月発表までのあいだ機密事項とされ、外部へ情報を提供（漏洩）を禁止されていた。これは第三者による妨害等を防止するための施策であり、社員が違反すると罰則が適用されるものであった。そのため、著書の[K8s自習書](https://www.amazon.co.jp/dp/4865941614?fbclid=IwAR3-D2BPS7wTJDlDlk_J7zKxJqyQ3wV-0vyfayCHhfP56x56wkKhkeMkuJE)は、内容のほとんどが、機密扱い期間中に執筆したもので、OpenShiftに関する内容を避けるように、執筆を進めることにした。そしてさらに、執筆後の近い将来において、IBMのクラウドサービスやソフトウェア製品は、Red Hat社買収による大きな影響が予測されたため、このK8s自習書は、IBMクラウドやIBMソフトウェア製品に、可能な限り依存しないように、コア技術となる、CNCFのアップストリーム Kubernetesを中心に記述することにした。

[K8s自習書](https://www.amazon.co.jp/dp/4865941614?fbclid=IwAR3-D2BPS7wTJDlDlk_J7zKxJqyQ3wV-0vyfayCHhfP56x56wkKhkeMkuJE)には、学習環境の一つとして、[Minikube](https://minikube.sigs.k8s.io/)を使用している。このソフトウェアは[MiniShift](https://www.okd.io/minishift/)のように、ローカル環境で動かすことができる自習用の環境である。

本記事は、[K8s自習書](https://www.amazon.co.jp/dp/4865941614?fbclid=IwAR3-D2BPS7wTJDlDlk_J7zKxJqyQ3wV-0vyfayCHhfP56x56wkKhkeMkuJE)の学習環境として、[MiniShift](https://www.okd.io/minishift/)を利用するためのセットアップ方法を記述したものである。 また、OpenShift 4に対応するCRCの使用法については、別の記事として後述したい。

## MiniShiftの仮想環境の準備

[K8s自習書](https://www.amazon.co.jp/dp/4865941614?fbclid=IwAR3-D2BPS7wTJDlDlk_J7zKxJqyQ3wV-0vyfayCHhfP56x56wkKhkeMkuJE)では、WindowsやmacOSで共通的に利用できるように、[Vagrant](https://www.vagrantup.com/)と[VirtualBox](https://www.virtualbox.org/)を利用して、[Minikube](https://minikube.sigs.k8s.io/)と、[Ansible](https://www.ansible.com/)で構築するワーカーノード x2 と マスターノードからなる [学習用Kubernetesクラスタ](https://github.com/takara9/vagrant-kubernetes)の構成がある。

[MiniShift](https://www.okd.io/minishift/)は、標準で、macOSではxhyve、LinuxではKVM、WindowsではHyper-Vを使用して、仮想サーバーのノード上で稼働する。しかし。それぞれ考慮点やインストール方法が異なるという欠点がある。一方、[VirtualBox](https://www.virtualbox.org/)を仮想環境として利用できることが解っているため、Windows と macOSで共通化できる。この利点を生かして本記事では、[VirtualBox](https://www.virtualbox.org/)を利用して、[MiniShift](https://www.okd.io/minishift/)を実行する。

インストール方法は、[K8s自習書](https://www.amazon.co.jp/dp/4865941614?fbclid=IwAR3-D2BPS7wTJDlDlk_J7zKxJqyQ3wV-0vyfayCHhfP56x56wkKhkeMkuJE)の付録にも記述しているが、本記事では、簡単に箇条書きにする。それぞれのOSについて、箇条書きの順番で、各URLのインストール方法に従って、インストールする。

#### macOSの場合

* [VirtualBox](https://www.virtualbox.org/) のインストール
* [Vagrant](https://www.vagrantup.com/) のイントール
* macOSのOSSパッケージマネージャー [Homebrew](https://brew.sh/)のインストール
  * gitコマンドのインストール `brew install git`
  * minishiftのインストール `brew cask install minishift`
  * kubectlのインストール `brew install kubectl`

#### Windows10の場合

* [VirtualBox](https://www.virtualbox.org/) のインストール
* [Vagrant](https://www.vagrantup.com/) のイントール
* WindowsのOSSパッケージマネージャー [Chocolatey](https://chocolatey.org/)のインストール
  * gitコマンドのインストール `choco install git`
  * minishiftのインストール `choco install minishift`
  * kubectlのインストール `choco install kubernetes-cli`

注意点としては、chocoを実行する場合は、管理者権限のコマンドプロンプトで実行する必要がある。

## minikubeのセットアップ

ここからは、WindowsとmacOSで共通の操作となる。 Windowsでbashを使うには、gitをインストールした時に一緒に、`Git Bash`がインストールされる。このソフトを使えば、ターミナルの中で bash を利用できる。一方、macOSのターミナルを起動すると、デフォルトでbashが利用できる。

macOSとWindows10で共通で、仮想マシンドライバーに、VirtualBoxを指定して、実行する。

~~~console:
$ minishift start --vm-driver virtualbox
~~~

macOSでは、minishiftの初回実行時に、コマンドがインターネットからダウンロードされた実行モジュールのためリスクがあるとして中止される。その場合はメニューの「システム環境設定」をクリックして、「セキュリティとプライバシー」を選択する。そして、「セキュリティとプライバシー」のタブ「一般」の「ダウンロードしたアプリケーションの実行許可」で「minishift」が表示されているはずなので、カギアイコンをクリックして、実行を許可したあと、再度、コマンドを実行してminishiftを起動する。

Windows10の場合は、パスワードの入力に応じて、実行を許可する。

minishiftが起動できたら、次の設定を実行して、デフォルトの仮想マシンドライバーをVirtualBoxに設定する。

~~~console:
$ minishift config set vm-driver virtualbox
~~~

## minishiftクライアントのセットアップ

パスと認証情報を設定して、minishiftクラスタを操作できるようにする。

~~~console:
$ minishift oc-env
export PATH="/Users/maho/.minishift/cache/oc/v3.11.0/darwin:$PATH"
# Run this command to configure your shell:
# eval $(minishift oc-env)

$ export PATH="/Users/maho/.minishift/cache/oc/v3.11.0/darwin:$PATH"
~~~

動作確認のために、バージョンを表示して確認する。

~~~console:
$ oc version
oc v3.11.0+0cbc58b
kubernetes v1.11.0+d4cacc0
features: Basic-Auth
Server https://192.168.99.100:8443
kubernetes v1.11.0+d4cacc0
~~~

kubectlコマンドがインストールされていれば、上記の操作で操作できるようになっている。

~~~console:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.6", GitCommit:"96fac5cd13a5dc064f7d9f4f23030a6aeface6cc", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:49Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"11+", GitVersion:"v1.11.0+d4cacc0", GitCommit:"d4cacc0", GitTreeState:"clean", BuildDate:"2019-10-17T19:23:55Z", GoVersion:"go1.10.8", Compiler:"gc", Platform:"linux/amd64"}
~~~


## minishiftへのログイン

Kubenetesはユーザー管理機能を外部システムへ委託しており、ユーザー管理機能を持たない。そのため、クラウドなどIAMなどの機能とサービスアカウントを対応づけるなどして、ユーザーのアクセスする権限を管理する。

このような背景を簡単に説明する。企業などのユーザー管理は、社員IDなどと連動して個人を特定できることが必要とされる。しかし、これは重大な問題を内包している。すなわち、社員のユーザー権限によってアプリケーションの実行権限が決まってしまう場合、組織変更や人事移動などによって、個人の責任範囲が変更されると、関連するアプリケーションの実行権限が失われ、システムが障害に陥るリスクがある。

このリスクを回避するために、Kubernetesでは、サービスアカウントという概念が導入されている。これはアプリケーションに与えられる実行権限であり、名前空間（ネームスペース）ごとに設定される。このサービスアカウントとユーザーと対応させることで、管理者が人事移動などで変わったとしても、アプリケーションの動作への影響を回避できる。

一方、OpenShiftは、ユーザー管理機能を内包したシステムであり、OCPクライアントのコマンドを操作する前に、ユーザー認証を必要とする。ログインしたユーザーに対応づけられたサービスアカウントの権限で、クラスタや名前空間を操作できる範囲が決まる。


管理者`system`、パスワード`admin`でログインすると、k8sクラスタのノードのリストを表示する権限などが与えられる。

~~~console:
$ oc login -u system:admin
Logged into "https://192.168.99.100:8443" as "system:admin" using existing credentials.

You have access to the following projects and can switch between them with 'oc project <projectname>':

  * default
    kube-dns
    kube-proxy
    kube-public
    kube-system
    myproject
    openshift
    openshift-apiserver
    openshift-controller-manager
    openshift-core-operators
    openshift-infra
    openshift-node
    openshift-service-cert-signer
    openshift-web-console

Using project "default".
~~~

システム管理者は、ノードのリストを表示することができ、`oc login`の結果は、kubectlにも反映される。

~~~console:
$ oc get node
NAME        STATUS    ROLES     AGE       VERSION
localhost   Ready     <none>    26m       v1.11.0+d4cacc0

$ kubectl get node
NAME        STATUS   ROLES    AGE   VERSION
localhost   Ready    <none>   26m   v1.11.0+d4cacc0
~~~

デベロッパーのユーザーIDでログインした場合は、パスワードがチェックしていないので、何か適当な文字列を入れると認証が通る。

~~~console:
$ oc login -u developer
Authentication required for https://192.168.99.100:8443 (openshift)
Username: developer
Password: any
Login successful.

You have one project on this server: "myproject"

Using project "myproject".
~~~

このユーザーIDでは、ノードのリソースにはアクセスが許可されていないことが、以下の結果から解る。

~~~console:
$ kubectl get node
Error from server (Forbidden): nodes is forbidden: User "developer" cannot list nodes at the cluster scope: no RBAC policy matched
~~~

## OpenShiftのKubernetesのバージョンの問題

MiniShiftの環境では、Kubernetesのバージョンが 1.11になっていて、古いのが気になった人もいると思う。しかし、これがOpenShiftの特徴とも言えるので、簡単に解説する。

CNCFのKubernetesプロジェクトは、3ヶ月ごとにリリースを実施して、過去２世代のマイナーバージョンをサポートすることになっている。そのため、新しいバージョンを採用した場合、9ヶ月のサポートがあることになる。このサポートとは、バグや脆弱性対応を指しており、期間がすぎると修正プログラムは提供されなくなり、その時点でのサポート対象のバージョンに対して、提供される。

一方、OpenShiftは、最新バージョンに追随することではなく、企業の情報システムに適用できるようにするため、長期間サポートされることを特徴としている。OpenShift 3.11 のベースになっているKubernetesのバージョンは、1.11であり、CNCFでは既にサポートが終了してるが、OpenShiftはベースのKubernetesを含めて、延長サポートを契約すれば2024年までサポートが受けられるとされている。

参考資料: Red Hat OpenShift Container Platform Life Cycle Policy, https://access.redhat.com/support/policy/updates/openshift


## まとめ

MiniShiftに関係する疑問を整理して、開発者に愛用される VagrantとVirtualBoxがセットアップされた環境で、簡単に起動する方法を整理した。まとめると以下の様になる。

* Minishiftは、MinikubeライクなツールでありOKDを、ローカル環境で実行するためのツール
* VirtualBoxを使って、Windows10とmacOSで共通的な方法で起動できる
* OKDはOpenShiftの上流となるオープンソースのプロジェクトで、Originとも呼ばれる。
* MiniShiftは、OpenShiftバージョン3相当までの対応となり、バージョン4以降はCodeReady Containersとなる
* 「[15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで](https://www.amazon.co.jp/dp/4865941614?fbclid=IwAR3-D2BPS7wTJDlDlk_J7zKxJqyQ3wV-0vyfayCHhfP56x56wkKhkeMkuJE)」に、MiniShiftを入れなかった理由は、執筆中はRedHat関連に触れることは機密事項であったこと、そして、Kubernetesベースのソフトウェア製品やクラウドサービスから距離を置き変化に強くすること。さらに学ぶのが難しいアップストリームのKubernetesについて効率よく学べるニーズが高かったことである。

なんだか、偉そうに書いてしまいましたが、MiniShiftをローカルで動かして、スキルアップに役立てて戴ければと思います。