開発者に愛用されているVagrantとVirtualBoxの環境を作っている Mac や Windows10の環境で、MiniShiftを簡単に動かす方法について書きました。それから、「15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで」の執筆動機やMiniShiftを含めなかった諸事情について、内訳話を少々書きました。
注意:記事の内容は、個人の見解であって、所属する会社を代表するものではありません。Red Hat CodeReady Containers (OpenShift4) のインストールのメモも合わせて、参照頂ければと思います。
MiniShiftについて
OpenShiftは、CNCFからソースコードが配布されるアップストリーム(源流)のKubernetesに、Red Hat社独自の拡張を加え、さらに、Red Hatのソフトウェア保守とウェブや電話での問い合わせ対応サービスを提供する企業向けKubernetesのプラットフォームである。そのため、OpenShiftは、Red Hat社が提供する有償サービス(サブスクリプション )のもとで利用できるソフトウェアとなる。
つまり、OpenShiftの使用は有償のため「OpenShiftを勉強してスキルを身につけ、仕事の獲得を有利にしたい」と考えるエンジニアには障壁がある。 そして、OpenShiftの開発元であるRed Hatにとっても、OpenShiftのスキルを持ったエンジニアを増やすことが難しくなる。そこで、このジレンマを解決するために、OpenShiftの学習やローカルの開発環境用に無償で提供されるのが、MiniShiftである。ただし、MiniShiftは、OpenShift バージョン3 のサポートまでとされ、バージョン4 以降は、Red Hat CodeReady Containers(略称 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上で動作させたものと見なせる。
参考資料:
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に引き継がれることになっている。
- 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本番運用まで(以下 K8s自習書) を執筆した。
K8s自習書とOpenShift(MiniShift & CRC)
IBM による Red Hatの買収活動は、2019年7月発表までのあいだ機密事項とされ、外部へ情報を提供(漏洩)を禁止されていた。これは第三者による妨害等を防止するための施策であり、社員が違反すると罰則が適用されるものであった。そのため、著書のK8s自習書は、内容のほとんどが、機密扱い期間中に執筆したもので、OpenShiftに関する内容を避けるように、執筆を進めることにした。そしてさらに、執筆後の近い将来において、IBMのクラウドサービスやソフトウェア製品は、Red Hat社買収による大きな影響が予測されたため、このK8s自習書は、IBMクラウドやIBMソフトウェア製品に、可能な限り依存しないように、コア技術となる、CNCFのアップストリーム Kubernetesを中心に記述することにした。
K8s自習書には、学習環境の一つとして、Minikubeを使用している。このソフトウェアはMiniShiftのように、ローカル環境で動かすことができる自習用の環境である。
本記事は、K8s自習書の学習環境として、MiniShiftを利用するためのセットアップ方法を記述したものである。 また、OpenShift 4に対応するCRCの使用法については、別の記事として後述したい。
MiniShiftの仮想環境の準備
K8s自習書では、WindowsやmacOSで共通的に利用できるように、VagrantとVirtualBoxを利用して、Minikubeと、Ansibleで構築するワーカーノード x2 と マスターノードからなる 学習用Kubernetesクラスタの構成がある。
MiniShiftは、標準で、macOSではxhyve、LinuxではKVM、WindowsではHyper-Vを使用して、仮想サーバーのノード上で稼働する。しかし。それぞれ考慮点やインストール方法が異なるという欠点がある。一方、VirtualBoxを仮想環境として利用できることが解っているため、Windows と macOSで共通化できる。この利点を生かして本記事では、VirtualBoxを利用して、MiniShiftを実行する。
インストール方法は、K8s自習書の付録にも記述しているが、本記事では、簡単に箇条書きにする。それぞれのOSについて、箇条書きの順番で、各URLのインストール方法に従って、インストールする。
macOSの場合
- VirtualBox のインストール
- Vagrant のイントール
- macOSのOSSパッケージマネージャー Homebrewのインストール
- gitコマンドのインストール
brew install git
- minishiftのインストール
brew cask install minishift
- kubectlのインストール
brew install kubectl
- gitコマンドのインストール
Windows10の場合
- VirtualBox のインストール
- Vagrant のイントール
- WindowsのOSSパッケージマネージャー Chocolateyのインストール
- gitコマンドのインストール
choco install git
- minishiftのインストール
choco install minishift
- kubectlのインストール
choco install kubernetes-cli
- gitコマンドのインストール
注意点としては、chocoを実行する場合は、管理者権限のコマンドプロンプトで実行する必要がある。
minikubeのセットアップ
ここからは、WindowsとmacOSで共通の操作となる。 Windowsでbashを使うには、gitをインストールした時に一緒に、Git Bash
がインストールされる。このソフトを使えば、ターミナルの中で bash を利用できる。一方、macOSのターミナルを起動すると、デフォルトでbashが利用できる。
macOSとWindows10で共通で、仮想マシンドライバーに、VirtualBoxを指定して、実行する。
$ minishift start --vm-driver virtualbox
macOSでは、minishiftの初回実行時に、コマンドがインターネットからダウンロードされた実行モジュールのためリスクがあるとして中止される。その場合はメニューの「システム環境設定」をクリックして、「セキュリティとプライバシー」を選択する。そして、「セキュリティとプライバシー」のタブ「一般」の「ダウンロードしたアプリケーションの実行許可」で「minishift」が表示されているはずなので、カギアイコンをクリックして、実行を許可したあと、再度、コマンドを実行してminishiftを起動する。
Windows10の場合は、パスワードの入力に応じて、実行を許可する。
minishiftが起動できたら、次の設定を実行して、デフォルトの仮想マシンドライバーをVirtualBoxに設定する。
$ minishift config set vm-driver virtualbox
minishiftクライアントのセットアップ
パスと認証情報を設定して、minishiftクラスタを操作できるようにする。
$ 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"
動作確認のために、バージョンを表示して確認する。
$ 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コマンドがインストールされていれば、上記の操作で操作できるようになっている。
$ 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クラスタのノードのリストを表示する権限などが与えられる。
$ 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にも反映される。
$ 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でログインした場合は、パスワードがチェックしていないので、何か適当な文字列を入れると認証が通る。
$ 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では、ノードのリソースにはアクセスが許可されていないことが、以下の結果から解る。
$ 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ヶ月ごとにリリースを実施して、過去2世代のマイナーバージョンをサポートすることになっている。そのため、新しいバージョンを採用した場合、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本番運用まで」に、MiniShiftを入れなかった理由は、執筆中はRedHat関連に触れることは機密事項であったこと、そして、Kubernetesベースのソフトウェア製品やクラウドサービスから距離を置き変化に強くすること。さらに学ぶのが難しいアップストリームのKubernetesについて効率よく学べるニーズが高かったことである。
なんだか、偉そうに書いてしまいましたが、MiniShiftをローカルで動かして、スキルアップに役立てて戴ければと思います。