はじめに
できるかなーと思って始めたのですが結果的にはうまくいかなかったという記事です。良い解決策があれば教えてください!!
公式のインストール手順に「Stay Tuned」とある通り、いろいろ変わってるところなんじゃないかと思います。
さてきっかけですが今年の10月、Gitlabのリリースノートに「Gitpodと連携するよ」というものがあり、Gitpodを触ってみたのがきっかけです。
普段部内でGitLabを利用しているというのもあり「軽い開発環境にいいかも」ということで
インストールしてGitLabGitHubとのインテグレーション設定までを試してみることにしました。
※もともと記事を書き始めたときはGitLabと連携していたのですがタイムリーに動かなくなったので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へのインストール手順を参考にすすめました。
これによると前提条件は以下です。
前提条件
- 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は単体として認証機能をもっていないのでGitHubと認証連携を設定して動作確認します。
1. 前提ソフトのインストール
1.1. Dnsmasqをインストール
Homebrewでインストールします。
$ 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 ファイルの最後尾に以下を追記します。
address=/gitpod.io-local/192.168.11.2
address=/registry.gitpod.io-local/<registryサービスのClusterIP>
registry.gitpod.io-local
側のレコードはGitpodを構築してから再設定しますので仮の値で設定しておきます。
dnsmasqを再起動して設定を反映します。
$ sudo brew services restart dnsmasq
PCの「ネットワーク設定」を開き、DNS設定に127.0.0.1を追加してdnsmasqを参照するようにします。
1.2. Kubernetesをインストールする
今回はDocker Desktop付属のKubernetesを使います。
Docker Desktopの「Preferences」を開き、「Kubernetes」-「Enable Kubernetes」のチェックをつけて「Apply&Restart」ボタンを押します。
初めてKubernetesを有効化した場合はそこそこ時間がかかりますので気長にまちます。
この画面のようにPreferences画面の左下にKubernetesが緑色ステータスになったらkubectlが使えるか試してみましょう。
# 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チャートで提供されているので手順自体はシンプルです。
# 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ファイルを次のように修正していきます。
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ファイルを指定してインストールします。こちらもそこそこ時間がかかります。
$ 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
クラスタの状況を確認して以下のようにサービスやデプロイが増えていればデプロイされています。
$ 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を再起動します。
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アプリを追加します。
「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
この設定を反映します。
$ helm upgrade -f values.yml mygpod gitpod/gitpod
3. 動作確認
さてブラウザで http://gitpod.io-local/ にアクセスしてみます。
右上の「Login」からGitHubにログインします。
サンプルのリポジトリリストが表示されました。やったね!
と一見動いているように見えるのですけど冒頭に書いてあるようにうまくいってません。
「Create Workspace」を押してみると・・・・
初回なので「workspace-full」のイメージをビルドされて・・・
ここで固まってWorkspace(Theia)が起動してこない・・・という状況になります。
(ご参考)その他のつまづきポイント
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が起動しきらないという問題は一部のポッドが正常に起動できていないことに起因している可能性があり、現象としては
こちらと類似の現象となっています。
どうもBindマウント絡みの問題っぽいので次は素直にLinuxで試してみようかと思います。
参考文献
この記事は以下の情報を参考にして執筆しました。
そして、
- AWS, Cloud9は、Amazon Web Services, Inc. の米国または他の国における商標登録または商標です。
- Google、Google Cloud、Google Cloud PlatformおよびGCPは、Google LLCの商標または登録商標です。
- その他記載されている会社名、製品名、サービス名、ロゴ等は各社の商標または登録商標です。