前回 は、 Kubernetes をインストールしたので、その上に Eclipse Che を載せてみる。
Che が提供している Docker イメージは、 amd64 版なので、 Ampere A1 VM 上で動くように arm64 版でビルドしなおしてデプロイする。
あらかじめ残課題をあげておくとこんな感じ。まだあるかも。
- che-theia は謎の Exception でロードが完了しないため amd64 版のまま使用する
- 今回 arm64 ビルドしたイメージ以外は qemu-user-static を使って amd64 イメージとして動かす
- Che が提供するほとんどのスタックは、QEMU がセグフォ吐いて死ぬ
ビルド環境構築
ビルド用コンテナ起動
dind を使用するので、 /var/run/docker.sock
をマウントしておく。
docker run -it --rm -v "$HOME/.m2:/root/.m2" -v /var/run/docker.sock:/var/run/docker.sock --name che-buildkit --user root quay.io/eclipse/che-java11-maven:nightly bash
Node のインストール
che-plugin-registry が 16 系を使用しているので、 16 系をインストール。
apt-get update
apt-get install -y curl
curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
apt-get install -y nodejs
Docker のインストール
minikube が推奨しているので Docker を利用する。
curl -fsSL https://download.docker.com/linux/debian/gpg \
| gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian buster stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update \
&& apt-get -y install \
\
docker-ce \
docker-ce-cli containerd.io
各イメージを arm64 用にビルドと push
以後の作業では、 $HOME/work
を作業ディレクトリとして使う。
mkdir -p $HOME/work
WORKDIR=$HOME/work
コンテナレジストリにログイン
ビルドしたものをそのまま push できるようにログインしておく。
docker login
devfile-registry
単純に docker buildx build
で arm64 ビルドすれば OK.
リポジトリの取得
cd $WORKDIR
git clone --depth 1 https://github.com/eclipse-che/che-devfile-registry.git
cd che-devfile-registry
devfile-registry のビルド
docker buildx build --platform linux/arm64 -t mikoto2000/che-devfile-registry:arm64 -f ./build/dockerfiles/Dockerfile --target registry .
devfile-registry のプッシュ
docker push mikoto2000/che-devfile-registry:arm64
plugin-registry
yarn プロジェクトをビルドしたうえで、
docker buildx build
する。
リポジトリの取得
cd $WORKDIR
git clone --depth 1 https://github.com/eclipse-che/che-plugin-registry.git
cd che-plugin-registry
yarn プロジェクトのビルド
npx yarn
cd ./tools/build
npx yarn build
cd ../..
npx yarn node ./tools/build/lib/entrypoint.js --output-folder:./output
che-plugin-registry のビルド
docker buildx build --platform linux/arm64 -t mikoto2000/che-plugin-registry:arm64 -f ./build/dockerfiles/Dockerfile .
che-plugin-registry のプッシュ
docker push mikoto2000/che-plugin-registry:arm64
che-plugin-broker
このリポジトリ内に che-plugin-artifacts-broker
と
che-plugin-metadata-broker
が含まれているので、両方ともビルド・プッシュする。
リポジトリ取得
cd $WORKDIR
git clone --depth 1 https://github.com/eclipse-che/che-plugin-broker.git
cd che-plugin-broker
Docker イメージのビルド
# che-plugin-artifacts-broker
docker buildx build --platform linux/arm64 -t mikoto2000/che-plugin-artifacts-broker:arm64 -f build/artifacts/Dockerfile .
# che-plugin-metadata-broker
docker buildx build --platform linux/arm64 -t mikoto2000/che-plugin-metadata-broker:arm64 -f build/metadata/Dockerfile .
Docker イメージのプッシュ
docker push mikoto2000/che-plugin-artifacts-broker:arm64
docker push mikoto2000/che-plugin-metadata-broker:arm64
che-server
Maven プロジェクトをビルドしてから docker buildx build
でビルドする。
また、使用する Docker イメージを設定するプロパティがあるため、それを arm64 版に書き換える。
リポジトリ取得
main
と 7.46.0
は、起動前に例外が出てしまい
Che が起動しなかった。
そのため、今回は 7.45.0
を利用する。
cd $WORKDIR
git clone --depth 1 -b 7.45.0 https://github.com/eclipse-che/che-server.git
cd che-server
che.properties の修正
che-plugin-metadata-broker
と
che-plugin-artifacts-broker
を、 arm64 版に書き換える。
diff --git a/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties b/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
index b9c8358..0e008fa 100644--- a/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
+++ b/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
@@ -560,13 +560,13 @@ che.infra.openshift.project.init_with_server_sa=true
# Docker image of {prod-short} plugin broker app that resolves workspace tools configuration and copies plugins dependencies to a workspace.
# The {prod-short} Operator overrides these images by default. Changing the images here will not
# have an effect if {prod-short} is installed using the Operator.-che.workspace.plugin_broker.metadata.image=quay.io/eclipse/che-plugin-metadata-broker:v3.4.0
+che.workspace.plugin_broker.metadata.image=mikoto2000/che-plugin-metadata-broker:arm64
# Docker image of Che plugin artifacts broker.
# This broker runs as an init container on the workspace Pod. Its job is to take in a list of plugin identifiers
# (either references to a plugin in the registry or a link to a plugin meta.yaml) and ensure that the correct .vsix
# and .theia extensions are downloaded into the /plugins directory, for each plugin requested for the workspace.-che.workspace.plugin_broker.artifacts.image=quay.io/eclipse/che-plugin-artifacts-broker:v3.4.0
+che.workspace.plugin_broker.artifacts.image=mikoto2000/che-plugin-artifacts-broker:arm64
# Configures the default behavior of the plugin brokers when provisioning plugins into a workspace. # If set to true, the plugin brokers will attempt to merge plugins when possible: they run in
Maven プロジェクトのビルド
Che Multiuser :: PostgreSQL Tck
で失敗するため、動作に必要なモジュールを別途個別にビルドしている。
「これで十分かよくわからないけど動いているからヨシ!」という状態。
mvn -B clean install -U -Pintegration -Dmaven.test.skip=true -Dfindbugs.skip=true -Dskip-validate-sources
cd infrastructures
mvn -B install -U -Pintegration -Dmaven.test.skip=true -Dfindbugs.skip=true -Dskip-validate-sources
cd ../assembly
mvn -B install -U -Pintegration -Dmaven.test.skip=true -Dfindbugs.skip=true -Dskip-validate-sources
Docker イメージのビルド
arm64 イメージをビルドするようにビルドスクリプトを修正
ファイルコピーなど必要なようなので、ビルドスクリプトを修正して走らせる方針で行くことにした。
diff --git a/dockerfiles/build.include b/dockerfiles/build.include
index 641be64a26..d7afe297da 100755--- a/dockerfiles/build.include
+++ b/dockerfiles/build.include
@@ -137,7 +137,7 @@ build_image() {
-e "s;\${BUILD_PREFIX};${PREFIX};" \
-e "s;\${BUILD_TAG};${TAG};" \
> ${DIR}/.Dockerfile- cd "${DIR}" && docker build -f ${DIR}/.Dockerfile -t ${IMAGE_NAME} ${BUILD_ARGS} .
+ cd "${DIR}" && docker buildx build --platform linux/arm64 -f ${DIR}/.Dockerfile -t ${IMAGE_NAME} ${BUILD_ARGS} .
DOCKER_BUILD_STATUS=$?
rm ${DIR}/.Dockerfile if [ $DOCKER_BUILD_STATUS -eq 0 ]; then
Docker イメージビルド
このタイミングでビルド可能な endpoint-watcher
と
che
(che-server) をビルド。
cd $WORKDIR/che-server/dockerfiles/
./build.sh --organization:mikoto2000 --tag:arm64 endpoint-watcher che
Docker イメージプッシュ
ビルドしたイメージを push する。
docker push mikoto2000/che-endpoint-watcher:arm64
docker push mikoto2000/che-server:arm64
postgres
ベースイメージが arm64
をサポートしていないため、ベースイメージをさかのぼっていき、大元のイメージを
centos:7
にして再構築する。
ベースイメージのビルド
大元のベースイメージを
registry.centos.org/centos/centos:7
から
centos:7
へ変更。
s2i-base-container のビルド(根本のイメージ)
cd $WORKDIR
git clone --depth 1 --recursive https://github.com/sclorg/s2i-base-container.git
cd s2i-base-container
Dockerfile の FROM を centos:7
に変更
また、centos:7
には nss_wrapper
がインストールされていないため、そのパッケージも追加する。
diff --git a/core/Dockerfile b/core/Dockerfile
index 70483fa..428aa9a 100644--- a/core/Dockerfile
+++ b/core/Dockerfile
@@ -1,5 +1,5 @@
# This image is the base image for all s2i configurable container images.-FROM registry.centos.org/centos/centos:7
+FROM centos:7
ENV SUMMARY="Base image which allows using of source-to-image." \
DESCRIPTION="The s2i-core image provides any images layered on top of it \@@ -50,9 +50,11 @@ RUN rpmkeys --import file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 && \
scl-utils \
tar \
unzip \- yum-utils" && \
+ yum-utils \
+ nss_wrapper" && \
mkdir -p ${HOME}/.pki/nssdb && \
chown -R 1001:0 ${HOME}/.pki && \+ yum install -y epel-release && \
yum install -y --setopt=tsflags=nodocs $INSTALL_PKGS && \
rpm -V $INSTALL_PKGS && \ yum -y clean all --enablerepo='*'
修正が完了したらビルドする。
docker buildx build --platform linux/arm64 -t mikoto2000/s2i-core-centos7:arm64 -f core/Dockerfile .
postgresql-13-centos7 のビルド(che-postgres が直接依存しているイメージ)
cd $WORKDIR
git clone --depth 1 https://github.com/sclorg/postgresql-container.git -b generated
cd postgresql-container/13
Dockerfile の FROM を mikoto2000/s2i-core-centos7:arm64
に修正。
diff --git a/13/Dockerfile b/13/Dockerfile
index c4de6e1..860a6da 100644--- a/13/Dockerfile
+++ b/13/Dockerfile
@@ -1,4 +1,4 @@
-FROM quay.io/centos7/s2i-core-centos7
+FROM mikoto2000/s2i-core-centos7:arm64
# PostgreSQL image for OpenShift. # Volumes:
Docker イメージのビルド
docker buildx build --platform linux/arm64 -t mikoto2000/postgresql-13-centos7:arm64 .
che-postgres のビルド
che-server 内に Dockerfile があるので、それを利用してビルドする。
cd $WORKDIR/che-server/dockerfiles/postgres
FROM を mikoto2000/postgresql-13-centos7:arm64
へ修正。
diff --git a/dockerfiles/postgres/Dockerfile b/dockerfiles/postgres/Dockerfile
index fe02d72..f36b2d5 100644--- a/dockerfiles/postgres/Dockerfile
+++ b/dockerfiles/postgres/Dockerfile
@@ -6,7 +6,7 @@
# SPDX-License-Identifier: EPL-2.0
#
-FROM centos/postgresql-96-centos7
+FROM mikoto2000/postgresql-13-centos7:arm64
ADD init-che-user-and-run.sh.erb init-che-user.sh.erb /var/lib/pgsql/
RUN cat /var/lib/pgsql/init-che-user.sh.erb | \ sed -e "/exit 0/d" > /var/lib/pgsql/init-che-user-and-run.sh && \
che-postgres のビルド
docker buildx build --platform linux/arm64 -t mikoto2000/che-postgres:arm64 .
che-postgres のプッシュ
docker push mikoto2000/che-postgres:arm64
keycloak
keycloak のビルド(che-keycloak が依存しているイメージ)
che-keycloak が使用しているのベースイメージを取得して、 arm64 版としてビルドする。
cd $WORKDIR
git clone --depth 1 https://github.com/keycloak/keycloak-containers.git
cd keycloak-containers/server
docker buildx build --platform linux/arm64 -t mikoto2000/keycloak:arm64 .
che-keycloak のビルド
che-server 内に Dockerfile があるので、それを利用してビルド。
cd $WORKDIR/che-server/dockerfiles/keycloak
Dockerfile の FROM を mikoto2000/keycloak:arm64
に修正
diff --git a/dockerfiles/keycloak/Dockerfile b/dockerfiles/keycloak/Dockerfile
index 0af6915..a82a458 100644--- a/dockerfiles/keycloak/Dockerfile
+++ b/dockerfiles/keycloak/Dockerfile
@@ -6,7 +6,7 @@
# SPDX-License-Identifier: EPL-2.0
#
-FROM quay.io/keycloak/keycloak:15.0.2
+FROM mikoto2000/keycloak:arm64
ADD che /opt/jboss/keycloak/themes/che ADD che-username-readonly /opt/jboss/keycloak/themes/che-username-readonly
修正が終わったらビルドする。
docker buildx build --platform linux/arm64 -t mikoto2000/che-keycloak:arm64 .
che-keycloak のプッシュ
docker push mikoto2000/che-keycloak:arm64
che-dashboard
リポジトリ取得
クローンしてビルドするだけ。
cd $WORKDIR
git clone --depth 1 https://github.com/eclipse-che/che-dashboard.git
cd che-dashboard
che-dashboard のビルド
docker buildx build --platform linux/arm64 . -f build/dockerfiles/Dockerfile -t mikoto2000/che-dashboard:arm64
Docker イメージのプッシュ
docker push mikoto2000/che-dashboard:arm64
Eclipse Che デプロイ
ここからは、 Ampere A1 VM 上で作業する。
ARM 対応していないイメージへの対応
qemu-user-static
をインストールすることで、
amd64
のイメージも、 QEMU
上で実行してくれるようになる。
sudo apt update
sudo apt install -y qemu-user-static
リポジトリ取得
git clone --depth 1 -b 7.45.0 https://github.com/eclipse-che/che-server.git
cd che-server/deploy/kubernetes/helm/che/
イメージ名を修正
diff --git a/deploy/kubernetes/helm/che/custom-charts/che-devfile-registry/values.yaml b/deploy/kubernetes/helm/che/custom-charts/che-devfile-registry/values.yaml
index 6e84ca680e..6a3fbc7401 100644--- a/deploy/kubernetes/helm/che/custom-charts/che-devfile-registry/values.yaml
+++ b/deploy/kubernetes/helm/che/custom-charts/che-devfile-registry/values.yaml
@@ -12,7 +12,7 @@ global:
class: "nginx"
cheDevfileRegistry:- image: quay.io/eclipse/che-devfile-registry:next
+ image: mikoto2000/che-devfile-registry:arm64
imagePullPolicy: Always
memoryLimit: 256Mi
memoryRequests: 16Midiff --git a/deploy/kubernetes/helm/che/custom-charts/che-keycloak/values.yaml b/deploy/kubernetes/helm/che/custom-charts/che-keycloak/values.yaml
index a192f56a24..6881844402 100644--- a/deploy/kubernetes/helm/che/custom-charts/che-keycloak/values.yaml
+++ b/deploy/kubernetes/helm/che/custom-charts/che-keycloak/values.yaml
@@ -19,9 +19,9 @@ global:
serverTrustStoreConfigMapName: ""
# Image used by endpoint watcher (postgres)
endpointWatcher:- image: quay.io/eclipse/che-endpoint-watcher:nightly
+ image: mikoto2000/che-endpoint-watcher:arm64
-image: quay.io/eclipse/che-keycloak:nightly
+image: mikoto2000/che-keycloak:arm64
## Admin credentials configuration
# Manually define them in cleardiff --git a/deploy/kubernetes/helm/che/custom-charts/che-plugin-registry/values.yaml b/deploy/kubernetes/helm/che/custom-charts/che-plugin-registry/values.yaml
index 3fd3b90f8a..f75b524d57 100644--- a/deploy/kubernetes/helm/che/custom-charts/che-plugin-registry/values.yaml
+++ b/deploy/kubernetes/helm/che/custom-charts/che-plugin-registry/values.yaml
@@ -12,7 +12,7 @@ global:
class: "nginx"
chePluginRegistry:- image: quay.io/eclipse/che-plugin-registry:next
+ image: mikoto2000/che-plugin-registry:arm64
imagePullPolicy: Always
memoryLimit: 256Mi
memoryRequests: 16Midiff --git a/deploy/kubernetes/helm/che/custom-charts/che-postgres/values.yaml b/deploy/kubernetes/helm/che/custom-charts/che-postgres/values.yaml
index 4e68228059..65168d2e67 100644--- a/deploy/kubernetes/helm/che/custom-charts/che-postgres/values.yaml
+++ b/deploy/kubernetes/helm/che/custom-charts/che-postgres/values.yaml
@@ -10,4 +10,4 @@
# Default values for postgres.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.-image: quay.io/eclipse/che-postgres:next
+image: mikoto2000/che-postgres:arm64
diff --git a/deploy/kubernetes/helm/che/values.yaml b/deploy/kubernetes/helm/che/values.yaml
index dea4689a5b..9ea49edc02 100644--- a/deploy/kubernetes/helm/che/values.yaml
+++ b/deploy/kubernetes/helm/che/values.yaml
@@ -21,7 +21,7 @@ cheWorkspaceNoProxy: ""
# operator: "Equal"
# value: "aValue"
# effect: "NoExecute"-cheImage: quay.io/eclipse/che-server:next
+cheImage: mikoto2000/che-server:arm64
cheImagePullPolicy: Always
cheKeycloakRealm: "che"
cheKeycloakClientId: "che-public"@@ -50,7 +50,7 @@ global:
cheHost: ""
# Image used by endpoint watchers
endpointWatcher:- image: quay.io/eclipse/che-endpoint-watcher:next
+ image: mikoto2000/che-endpoint-watcher:arm64
# Use internal cluster svc names to communicate between components
useInternalClusterSVCNames: true
@@ -129,7 +129,7 @@ che:
logLevel: "INFO"
dashboard:- image: quay.io/eclipse/che-dashboard:next
+ image: mikoto2000/che-dashboard:arm64
imagePullPolicy: "Always"
memoryRequest: 16Mi memoryLimit: 256Mi
デプロイ
helm dependency update
helm upgrade --install che --namespace che --create-namespace --set global.ingressDomain=140-83-80-200.nip.io ./
しばらく待つと、一通りの Pod が Running になっているのが確認できる。
ubuntu@eclipse-che:~$ ubuntu@eclipse-che:~$ kubectl get pod -nche
NAME READY STATUS RESTARTS AGE
che-599ddc4c4c-6p2r7 1/1 Running 0 2m33s
che-dashboard-575588559f-plr4q 1/1 Running 0 41m
devfile-registry-6c68bb7858-drztk 1/1 Running 0 41m
keycloak-6455687696-vjg4j 1/1 Running 0 41m
plugin-registry-7f7bb8d6d4-rx8hn 1/1 Running 0 41m
postgres-5b8856f9b9-zfkkl 1/1 Running 0 41m
その他
「Che が提供するほとんどのスタックは、QEMU がセグフォ吐いて死ぬ」についての関連ツイート。
go のスタック、 qemu-user-static 併用で起動はしたけど、 go がセグフォで死んだ。 pic.twitter.com/qdXjXFjJsq
— 大雪 命 (@mikoto2000) April 13, 2022
qemu-user-static 使ったやつは、 che-theia の起動まではいくんだけどなぁ… pic.twitter.com/8lUzdoR8Rr
— 大雪 命 (@mikoto2000) April 15, 2022
参考資料
- Helm | Helm のインストール
- Installation Guide - NGINX Ingress Controller
- MetalLB, bare metal load-balancer for Kubernetes
- kubeadmで作ったクラスタにNGINX Ingress Controllerを入れる
- ingress-nginx 4.0.18 · kubernetes/ingress-nginx
- ingress is not listening on port 80 · Issue #4799 · kubernetes/ingress-nginx
付録
che-theia のビルド挑戦メモ
以下て順で arm64 のビルドを行ったが、ワークスペース作成時に例外を吐いてロード画面から進まなくなる。
コンテナ起動
che-theia は、ubuntu:20.04 コンテナを起動してビルドする。
docker run -it --rm -v "/var/run/docker.sock:/var/run/docker.sock" arm64v8/ubuntu:20.04 bash
ビルド環境構築
# Docker
apt update
apt install -y curl gpg
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update \
&& apt-get -y install \
\
docker-ce \
docker-ce-cli
containerd.io
# node
apt update
apt-get install -y build-essential curl git pkg-config libsecret-1-dev
curl -fsSL https://deb.nodesource.com/setup_14.x | bash -
apt-get install -y nodejs
npm install -g yarn
リポジトリの取得
cd $WORKDIR
git clone --depth 1 https://github.com/eclipse-che/che-theia.git
cd che-theia
Docker イメージのビルド
# `docker build` を `docker buildx` に修正する。
export GITHUB_TOKEN=<GitHub のパーソナルアクセストークン、これが無いとプラグインの組み込み(?)に失敗してビルドができない、とりあえず全リード権限を与えた>
export SKIP_LINT=true
export SKIP_TEST=true
export SKIP_FORMAT=true
./build.sh --organization:mikoto2000 --tag:arm64 --skip-tests
0 件のコメント:
コメントを投稿