2019年5月27日月曜日

Windows の Docker Desktop(with Kubernetes)に Eclipse Che をデプロイした

とりあえず、Eclipse Che が何かとか、アーキテクチャーとか、細かい用語とかは後回しにして、 Eclipse Che をローカル PC 上で動かす。

ワークスペース作成画面の表示まで確認できたので作業記録をのこす。

環境

  • OS: Windows 10 Pro
  • Docker: Docker version 18.09.2, build 6247962
  • Docker Desktop の Kubernetes を使う感じで

Docker Desktop の設定

Docker Desktop のタスクトレイアイコンを右クリック -> Settings で、 Docker Desktop の設定を行う。

マシン性能の設定

マシン性能を求められるので、それなりの性能に設定。

  1. Advanced タブ内の以下の項目を設定
    • CPUs: 4
    • Memory: 10240MB
    • Swap: 1024MB
    • Disk image max size: 64GB

Deploying single-user Che to Kubernetes | Eclipse Che Documentation では CPU 2, RAM 4 GB に設定されている。今回は倍程度に設定した。

Kubernetes の設定

Kubernetes の有効化

  1. Kubernetes タブ内の Enable Kubernetes のチェックを入れる
  2. Apply ボタンを押下すると Kubernetes cluster installation のダイアログが表示されるので Install ボタンを押す

...けーっこう時間かかりますね。

インストールと起動が成功すると、こんな感じで Kubernetes is running と表示される。

コンテキストの確認

Kubernetes のコンテキストが docker-for-desktop になっていることを確認する。

Kubernetes の動作確認

PowerShell で kubectl get services と入力して以下のように出力されていれば OK.

> kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   11m

Che の環境構築

Deploying single-user Che to Kubernetes | Eclipse Che Documentation の通りに進めて、 Minikube の変わりに docker-for-desktop を使うようにする。

role binding のデプロイ

正直何やっているのかわかんない。

kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default

Helm のインストール

今回は Chocolatey でインストールした。PowerShell を管理者で開いて下記コマンドを実行。

choco install kubernetes-helm

ユーザーコンテキストの設定

今回はデフォルトコンテキスト(docker-for-desktop)でいいから何もしない。

クラスターに tiller をインストール

この辺りも何やっているのかわかんない...。

kubectl create serviceaccount tiller --namespace kube-system
wget https://raw.githubusercontent.com/eclipse/che/0ce04088634d979b4f6372dceb970b35b910a7e1/deploy/kubernetes/helm/che/tiller-rbac.yaml -OutFile ./tiller-rbac.yaml
kubectl apply -f ./tiller-rbac.yaml
helm init --service-account tiller --wait

デプロイ

ソース取得

設定ファイル類(yaml) が必要なので、ソース一式を clone する。

git clone https://github.com/eclipse/che.git

デプロイコマンドを実行

cd CHE_ROOT/deploy/kubernetes/helm/che
helm dependency update
helm upgrade --install che --namespace che ./

helm upgrade の時点で次のエラーが発生した。

Release "che" does not exist. Installing it now.
Error: validation failed: error validating "": error validating data: [unknown object type "nil" in ConfigMap.data.CHE_INFRA_KUBERNETES_NAMESPACE, unknown object type "nil" in ConfigMap.data.CHE_LOGGER_CONFIG, unknown object type "nil" in ConfigMap.data.CHE_OAUTH_GITHUB_CLIENTID, unknown object type "nil" in ConfigMap.data.CHE_OAUTH_GITHUB_CLIENTSECRET, unknown object type "nil" in ConfigMap.data.CHE_WORKSPACE_HTTPS__PROXY, unknown object type "nil" in ConfigMap.data.CHE_WORKSPACE_HTTP__PROXY, unknown object type "nil" in ConfigMap.data.CHE_WORKSPACE_NO__PROXY]

エラーメッセージで検索したら、Helm 2.14.0 から空文字列が invalid になるらしい issue が見つかった。 (Helm install v2.14.0 "validation failed" error when using a template variable with value "" - helm/helm)

Helm をダウングレードする。

choco upgrade kubernetes-helm --version 2.13.1 --allow-downgrade

サーバー側の Helm はまだ 2.14.0 のままだから入れ直し。

helm reset --force
helm init --service-account tiller --wait

もういちどデプロイに挑戦。

helm upgrade --install che --namespace che ./

上手く言ったっぽい。 以下のような出力が得られた。

> helm upgrade --install che --namespace che .
Release "che" does not exist. Installing it now.
NAME:   che
LAST DEPLOYED: Mon May 27 04:29:16 2019
NAMESPACE: che
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME  DATA  AGE
che   52    0s

==> v1/PersistentVolumeClaim
NAME             STATUS   VOLUME    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
che-data-volume  Pending  hostpath  0s

==> v1/Pod(related)
NAME                 READY  STATUS       RESTARTS  AGE
che-865f8c767-dpxff  0/1    Terminating  0         11m
che-865f8c767-fn8n5  0/1    Pending      0         0s

==> v1/Service
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)            AGE
che-host  ClusterIP  10.106.203.150  <none>       8080/TCP,8087/TCP  0s

==> v1/ServiceAccount
NAME  SECRETS  AGE
che   1        0s

==> v1beta1/ClusterRoleBinding
NAME                         AGE
che-che-clusterrole-binding  0s

==> v1beta1/Deployment
NAME  READY  UP-TO-DATE  AVAILABLE  AGE
che   0/1    1           0          0s

==> v1beta1/Ingress
NAME         HOSTS                          ADDRESS  PORTS  AGE
che-ingress  che-che.192.168.99.100.nip.io  80       0s

...ここからどうやって Che サーバーに接続すればいいのかわからない。

再挑戦

Running Eclipse Che on Kubernetes using Docker Desktop for mac あたりを真似すればいけそうなのでやってみる。

ingress-nginx をインストール

helm で ingress-nginx をインストール。

helm install stable/nginx-ingress --name ingress-nginx --namespace ingress-nginx --set rbac.create=true

ループバックアドレスを登録

ingress-nginxLoadBalancerCLUSTER-IP を確認する。

> kubectl get services --namespace ingress-nginx
NAME       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
ingress-nginx-nginx-ingress-controller        LoadBalancer   10.100.110.35   localhost     80:30627/TCP,443:31390/TCP   29s
ingress-nginx-nginx-ingress-default-backend   ClusterIP      10.109.12.145   <none>        80/TCP                       29s

Windows のループバックアドレス設定。

netsh interface ip add address Loopback 10.100.110.35 255.255.255.255

10.106.203.150 は、 kubectl get services ... で確認した CLUSTER-IP を指定。

Che の構成情報(?)更新

value.yaml を書き直して che を入れなおす

cd CHE_ROOT/deploy/kubernetes/helm/che
sed.exe -i -e 's/  cheNamespace: \"\"/  cheNamespace: ""che""/' .\values.yaml
sed.exe -i -e 's/  cheWorkspacesNamespace: \"\"/  cheWorkspacesNamespace: ""che""/' .\values.yaml
sed.exe -i -e 's/  ingressDomain: 192.168.99.100.nip.io/  ingressDomain: 10.100.110.35.nip.io/' .\values.yaml
helm dependency update
helm upgrade --install che --namespace che .

http://<cheNamespace>-<cheWorkspacesNamespace>.<ingressDomain> でアクセス可能になるようだ。

Che へ接続

start http://che-che.10.100.110.35.nip.io

Che のワークスペース作成画面が表示された。

とりあえず、今日はここまで。

参考資料