Gitpod をローカルのk8sにインストールしてみたらできなかった件



# はじめに

できるかなーと思って始めたのですが結果的にはうまくいかなかったという記事です。良い解決策があれば教えてください！！

公式のインストール手順に「Stay Tuned」とある通り、いろいろ変わってるところなんじゃないかと思います。


さてきっかけですが今年の10月、Gitlabのリリースノートに「Gitpodと連携するよ」というものがあり、Gitpodを触ってみたのがきっかけです。

普段部内でGitLabを利用しているというのもあり「軽い開発環境にいいかも」ということで
インストールして~~GitLab~~GitHubとのインテグレーション設定までを試してみることにしました。

※もともと記事を書き始めたときはGitLabと連携していたのですが[タイムリー](https://github.com/gitpod-io/gitpod/issues/2371)に動かなくなったのでGitHubに変更してみました。

# Gitpodとは

TypeFox社が開発したCloudIDEです。GitHub codespaces、AWS Cloud9、Eclipse Cheみたいなものです。

環境自体をDockerイメージで管理するため環境の可搬性が高く、コンテナ化できるのであれば移行もしやすい印象です。
またデフォルトで提供される開発環境のベースイメージ「workspace-full」が様々な開発言語に対応しているため、基本的な構成であれば何も考えずにベースイメージで開発を始めることができるところもよいです。



# インストールしてみる

まずは味見するためにall-in-one構成でノートPCにインストールしてみようということで手元のMacBookにインストールしてみました。

##### 対象のバージョン

- Gitpod: 0.5.0
- Docker Desktop for mac: 2.5.0.1
 - Docker Engine: 19.03.13
 - Kubernetes: v1.19.3
- OS: macOS Catalina


Gitpodのインストール物はHelmチャートとして提供されています。今回はローカル環境で試したかったのでKubernetesへのインストール手順を参考にすすめました。

https://www.gitpod.io/docs/self-hosted/latest/install/install-on-kubernetes/

これによると前提条件は以下です。

##### 前提条件

- Kubernetesクラスタ: v1.13以上
- ホストするためのドメイン
- HTTPS用証明書: オプション
- helm: バージョン 3系
- MySQL データベース: オプション
- Docker Registry: オプション
- MinIOなどのBucketsストレージ： オプション 

ここでオプションになっているものは「Chartで自動生成されるから事前に準備する必要はない」という意味も含みます。今回は味見が目的ですのでできるだけラクして構築するために次の方針にしました。

- Kubernetes: Docker Desktopに入っているものを利用
- ドメイン: dnsmasqでローカルホストDNS構築し`gitpod.io-local`ドメインでアクセス
- HTTPS証明書: HTTPでも動作は可能との記述があったため今回はHTTPを利用
- MySQL, Docker Registry: 運用では外部サービスの利用が推奨となっているがChartで自動構築されるのでそのまま利用
- MinIO: 自動構築されるもののクラウド環境でない場合は個別に設定が必要なので無効化

![ gitpod構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695122/966997b6-8a50-62dd-0b01-571831aae0c6.png)

また、Gitpodは単体として認証機能をもっていないのでGitHubと認証連携を設定して動作確認します。



## 1. 前提ソフトのインストール

### 1.1.  Dnsmasqをインストール

Homebrewでインストールします。

```sh
$ brew install dnsmasq
```

DNSレコードの設定をします。今回想定するドメインは`gitpod.io-local`、インストールする自PCのIPアドレスが`192.168.11.2`であることを仮定します。

Gitpodは単一のホスト名で動くのではなく、例えば起動したワークスペースにアクセスするURLは`http://fa38ecdf-66b3-4a24-9d4d-0c878ead3ee5.ws.gitpod.io-local/`のようなランダム文字列のホスト名になります。これらのホスト名も`192.168.11.2`に名前解決するように設定します。

- gitpod.io-local: 画面/APIへのアクセス用
- *.gitpod.io-local: registoryなどへのアクセス用
- *.ws.gitpod.io-local: ワークスペースへのアクセス用


/usr/local/etc/dnsmasq.conf ファイルの最後尾に以下を追記します。

```dnsmasq.conf
address=/gitpod.io-local/192.168.11.2
address=/registry.gitpod.io-local/<registryサービスのClusterIP>
```


:point_up: `registry.gitpod.io-local`側のレコードはGitpodを構築してから再設定しますので仮の値で設定しておきます。



dnsmasqを再起動して設定を反映します。

```sh
$ sudo brew services restart dnsmasq
```

PCの「ネットワーク設定」を開き、DNS設定に127.0.0.1を追加してdnsmasqを参照するようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695122/811c2d87-99e0-1964-1db8-2b95a79e60aa.png)



### 1.2. Kubernetesをインストールする

今回はDocker Desktop付属のKubernetesを使います。

Docker Desktopの「Preferences」を開き、「Kubernetes」-「Enable Kubernetes」のチェックをつけて「Apply&Restart」ボタンを押します。

初めてKubernetesを有効化した場合はそこそこ時間がかかりますので気長にまちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695122/8babaf06-5cf8-2ce4-5483-0a6f2d6d0b14.png)

この画面のようにPreferences画面の左下にKubernetesが緑色ステータスになったらkubectlが使えるか試してみましょう。

```sh
# Kubernetes クラスタの情報取得
$ kubectl cluster-info
Kubernetes master is running at https://kubernetes.docker.internal:6443
KubeDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

# ノード一覧の取得
$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
docker-desktop   Ready    master   1h   v1.19.3
```

### 1.3. Helmをインストールする

Homebrewでインストールします。

```
$ brew install helm
```

## 2. Gitpodのインストール

### 2.1 HelmへのGitpodリポジトリの登録

それでは本題のGitpodのインストールです。といってもHelmチャートで提供されているので手順自体はシンプルです。


```sh
# gitpodという名前でGitpodのリポジトリを登録
$ helm repo add gitpod https://charts.gitpod.io
"gitpod" has been added to your repositories

# リポジトリにgitpodのチャートがあるか確認
$ helm search repo gitpod
gitpod/gitpod                     	0.5.0        	0.1.5      	The core chart for Gitpod                         
gitpod/gitpod-selfhosted          	0.4.0        	0.1.5      	The configuration chart for your Gitpod install...

# mygpodというリソース名で'gitpod/gitpod'のインストール
$ helm install mygpod charts.gitpod.io/gitpod
Error: template: gitpod/charts/minio/templates/deployment.yaml:192:20: executing "gitpod/charts/minio/templates/deployment.yaml" at <(not .Values.gcsgateway.enabled) (not .Values.azuregateway.enabled) (not .Values.s3gateway.enabled) (not .Values.b2gateway.enabled)>: can't give argument to non-function not .Values.gcsgateway.enabled
```
デフォルトの設定値をつかってインストールが実行されましたが何やら失敗しているようです。これはMinIOのテンプレート内でMinIOのストレージ設定がされていないためです（GCPのCloudStorageかAWSのS3が期待されている）。

いずれにせよデフォルトのままではインストールできないので設定を見直します。


```
# Valuesの出力
$ helm show values gitpod/gitpod > values.yml
```

### 2.2. Valuesファイルの変更


values.ymlファイルを次のように修正していきます。

```yaml
hostname: gitpod.io-local # Host名を指定
components:
  imageBuilder:
    hostDindData: "" # イメージビルド時にhostPath(bind mount)がうまく行かないため
  wsManagerNode:
    containerdSocket: /var/run/docker.sock # デフォルトだとcontainerdのUNIXSocketなのでDockerのものに変更
  wsSync:
    fullWorkspaceBackup:
      containerd:
        socket: /var/run/docker.sock
minio:
  enabled: false # MinIOを無効化
```

このvaluesファイルを指定してインストールします。こちらもそこそこ時間がかかります。

```sh
$ helm install -f values.yml mygpod gitpod/gitpod
NAME: mygpod
LAST DEPLOYED: Thu Dec X XX:XX:XX 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
```

クラスタの状況を確認して以下のようにサービスやデプロイが増えていればデプロイされています。

```sh
$ kubectl get svc
NAME              TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                 AGE
blobserve         ClusterIP      10.111.101.82    <none>        4000/TCP                                5m55s
dashboard         ClusterIP      10.109.232.47    <none>        3001/TCP                                5m55s
db                ClusterIP      10.107.99.165    <none>        3306/TCP                                5m56s
image-builder     ClusterIP      10.107.187.51    <none>        8080/TCP                                5m55s
kubernetes        ClusterIP      10.96.0.1        <none>        443/TCP                                 2d
messagebus        ClusterIP      10.109.117.247   <none>        5672/TCP,25672/TCP,4369/TCP,15672/TCP   5m55s
mysql             ClusterIP      10.102.73.55     <none>        3306/TCP                                5m55s
proxy             LoadBalancer   10.110.184.148   <localhost>     80:31080/TCP,443:31443/TCP              5m55s
registry          ClusterIP      10.97.219.208    <none>        443/TCP                                 5m56s
registry-facade   ClusterIP      10.96.87.3       <none>        3000/TCP                                5m56s
server            ClusterIP      10.104.57.237    <none>        3000/TCP,9500/TCP                       5m55s
theia-server      ClusterIP      10.99.81.103     <none>        80/TCP                                  5m55s
ws-manager        ClusterIP      10.97.75.106     <none>        8080/TCP                                5m56s

# デプロイ状況
$ kubectl get deploy
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
dashboard           1/1     1            1           9m43s
image-builder       1/1     1            1           9m43s
messagebus          1/1     1            1           9m43s
mysql               1/1     1            1           9m43s
proxy               1/1     1            1           9m43s
registry            1/1     1            1           9m43s
registry-facade     1/1     1            1           9m43s
server              1/1     1            1           9m43s
theia-server        1/1     1            1           9m43s
ws-manager          1/1     1            1           9m43s
ws-manager-bridge   0/1     1            0           9m43s
ws-scheduler        1/1     1            1           9m43s
```

### 2.3. Dnsmasqの再設定

registryサービスのClusterIPも10.97.219.208でふられていますので

前述のdnsmasq.confを次のように更新してDnsmasqを再起動します。

```dnsmasq.conf

address=/gitpod.io-local/192.168.11.2
address=/registry.gitpod.io-local/10.97.219.208
```


### 2.4. GitHubとの認証連携

さて実はすでにブラウザで http://gitpod.io-local/ にアクセスするとGitpodの画面が表示されるようになっているはずなのですが、Gitpodは認証機能を持たないため認証連携を設定しないと何もできません・・・。


今回はGitHubで認証できるようにしていきます。

GitHubにアクセスして右上のメニューから「Settings」 - 「Developer Setting」 - 「OAuth App」までいき「New OAuth App」から新しいOAuthアプリを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695122/40f0c415-ca12-91b8-3529-95890263ad67.png)

「Authorization callback URL」は `http://gitpod.io-local/auth/github/callback`とします。

「Register application」ボタンを押して `clientId` と `clientSecret`をメモします。

さきほどのvalues.ymlに OAuthProvider 設定を追加していきます。

```
authProviders:
- host: github.com
  id: Public-GitHub
  oauth:
    callBackUrl: http://gitpod.io-local/auth/github/callback
    clientId: <GitHubで取得するclientId>
    clientSecret: <GitHubで取得するclientSecret>
  type: GitHub
```

この設定を反映します。

```sh

$ helm upgrade -f values.yml mygpod gitpod/gitpod
```

## 3. 動作確認

さてブラウザで http://gitpod.io-local/ にアクセスしてみます。

![スクリーンショット_2020-12-10_12.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695122/16a2a9ab-b368-1008-a792-e5f084d5a396.png)

右上の「Login」からGitHubにログインします。

![スクリーンショット_2020-12-10_12.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695122/490ed3d4-7fc9-17f2-b0b2-0c55aacb61ef.png)

サンプルのリポジトリリストが表示されました。やったね！

と一見動いているように見えるのですけど冒頭に書いてあるようにうまくいってません。


「Create Workspace」を押してみると・・・・

![スクリーンショット_2020-12-10_12.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695122/d1637829-3b3e-9ba4-2190-1cf44a62d837.png)

初回なので「workspace-full」のイメージをビルドされて・・・

![スクリーンショット_2020-12-10_13.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695122/46e1dcd7-9681-1342-34b9-d98964820cce.png)

ここで固まってWorkspace(Theia)が起動してこない・・・という状況になります。

:cry: 

### （ご参考）その他のつまづきポイント

#### ws-manager-bridgeデプロイメントがいつまでたっても起動してこないことがある

タイミングによってはws-manager-bridgeポッドが起動してこないことがありました。発生した時のワークアラウンドを備忘録までに記載しておきます。

ws-manage-bridgeポッドはmessagebusポッドの提供するRabbitMQに依存していて、特定のExchange設定が見つからないためエラーになっていました。

messagebusのコンテナ起動時に作成しているはずなのですが一部が欠落しているようです。

再度messagebusのコンテナ内にある'/usr/local/bin/configure.sh'を動かしてあげれば作成されます。

```
# ポッド一覧を表示してIDを調べる
$ kubectl get pods
NAME                                 READY   STATUS             RESTARTS   AGE
dashboard-84df84df84-7lll7           1/1     Running            0          16m
image-builder-64bb8c86f4-c7j5j       1/2     CrashLoopBackOff   4          6m44s
messagebus-5fdc758c94-2j8lq          1/1     Running            0          16m
mysql-598f7b789f-n5krq               1/1     Running            0          16m
node-daemon-p769r                    1/1     Running            7          16m
proxy-67fcf5597-jg7l8                1/1     Running            8          16m
proxy-f95497487-2pqh6                1/1     Running            6          6m44s
registry-644d47c5bc-sh7v9            1/1     Running            0          16m
registry-facade-7f9cc868bb-lzhrz     1/1     Running            0          16m
server-b96ff9df6-rf6zc               1/1     Running            3          16m
theia-server-5c87d9f5c7-bksnh        1/1     Running            0          16m
ws-manager-75b5df76b8-zt2d7          1/1     Running            0          6m44s
ws-manager-bridge-867ffdd64f-hqlxp   0/1     Init:0/2           3          16m
ws-manager-node-9gj4w                0/1     CrashLoopBackOff   6          6m40s
ws-scheduler-df5678796-bmvx8         1/1     Running            0          16m
ws-sync-d9m5f                        0/1     CrashLoopBackOff   6          6m40s


# コンテナの中に入る
$ kubectl exec --stdin --tty messagebus-5fdc758c94-2j8lq   -- /bin/sh

# 設定用のシェルを動かす
/ $ /usr/local/bin/configure.sh

```


## 最後に

さてあと一歩のところな感じではあるもののここで力尽きてしまいました。  

Workspaceが起動しきらないという問題は一部のポッドが正常に起動できていないことに起因している可能性があり、現象としては
[こちら](https://community.gitpod.io/t/deamon-sets-ws-manager-node-and-ws-sync-fail-to-start/1777/5)と類似の現象となっています。

どうもBindマウント絡みの問題っぽいので次は素直にLinuxで試してみようかと思います。

## 参考文献
この記事は以下の情報を参考にして執筆しました。

- [Install Gitpod Self-Hosted on Kubernetes](https://www.gitpod.io/docs/self-hosted/latest/install/install-on-kubernetes/)
- [GitHub Gitpodリポジトリ](https://github.com/gitpod-io/gitpod)


そして、


- AWS, Cloud9は、Amazon Web Services, Inc. の米国または他の国における商標登録または商標です。
- Google、Google Cloud、Google Cloud PlatformおよびGCPは、Google LLCの商標または登録商標です。
- その他記載されている会社名、製品名、サービス名、ロゴ等は各社の商標または登録商標です。