2022年4月16日土曜日

Oracle Cloud の Ampere A1 VM(ARM VM) に Eclipse Che をインストールする

前回 は、 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-brokerche-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 版に書き換える。

リポジトリ取得

main7.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-brokerche-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-watcherche(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: 16Mi
diff --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 clear
diff --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: 16Mi
diff --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 がセグフォ吐いて死ぬ」についての関連ツイート。

参考資料

付録

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 件のコメント:

コメントを投稿