2020年6月16日火曜日

Eclipse Che 7.10.0 以降 で Helm + TLS + 自己証明書を使うときの create secret コマンドメモ

使用コマンド

create secret generic を使う。

$ kubectl create secret generic che-tls --from-file=ca.crt=ca.crt --from-file=tls.key=domain.key --from-file=tls.crt=domain.crt -n che

7.10.0 からは、自己証明書を使う場合には che-tls の中に CA 証明書を含める必要がある。

secret の内容は次のようになる。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> kubectl get secret che-tls -nche -oyaml
apiVersion: v1
data:
  ca.crt: ...(snip)
  tls.crt: ...(snip)
  tls.key: ...(snip)
kind: Secret
metadata:
  creationTimestamp: "2020-06-14T16:50:20Z"
  name: che-tls
  namespace: che
  resourceVersion: "396587"
  selfLink: /api/v1/namespaces/che/secrets/che-tls
  uid: bbc0bca4-560b-4ae5-8521-8d17b0d83ba8
type: kubernetes.io/tls

CA 証明書、サーバー証明書、サーバー秘密鍵をそれぞれ ca.crt, tls.crt, tls.key で登録する。

あとはいつも通り helm upgrade でデプロイすれば OKデプロイすれば OK

以上。

参考資料

2020年6月11日木曜日

Windows で Eclipse Che を動かす(2020/6/11 版)

Docker Desktop(Windows版) で Eclipse Che を動かす 2020/6/11 版。

前回使っていなかったので、今回も chectl は使用しません。使ったほうが楽なはず。

前提

  • OS: Windows10 Pro
  • Docker: Docker version 19.03.8, build afacb8b
  • helm: version.BuildInfo{Version:“v3.2.3”, GitCommit:“8f832046e258e2cb800894579b1b3b50c2d83492”, GitTreeState:“clean”, GoVersion:“go1.13.12”}
  • Docker Desktop の Kubernetes 有効化済み
    • Docker Desktop の Kubernetes を使う
  • インストールする che: 7.4.0

現状確認

Docker Desktop の Kubernetes をリセットした直後の状態を確認。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm> kubectl get pods --all-namespaces
NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE
docker        compose-78f95d4f8c-67gg5                 1/1     Running   0          8m41s
docker        compose-api-6ffb89dc58-zjnb6             1/1     Running   0          8m41s
kube-system   coredns-5644d7b6d9-rlb55                 1/1     Running   0          9m58s
kube-system   coredns-5644d7b6d9-z4fx8                 1/1     Running   0          9m58s
kube-system   etcd-docker-desktop                      1/1     Running   0          8m42s
kube-system   kube-apiserver-docker-desktop            1/1     Running   0          8m48s
kube-system   kube-controller-manager-docker-desktop   1/1     Running   0          8m43s
kube-system   kube-proxy-pv8dq                         1/1     Running   0          9m58s
kube-system   kube-scheduler-docker-desktop            1/1     Running   0          9m9s
kube-system   storage-provisioner                      1/1     Running   0          8m42s
kube-system   vpnkit-controller                        1/1     Running   0          8m42s

che の環境構築

che のソースコード取得

clone。

cd ~/project
git clone https://github.com/eclipse/che.git
$CHE_SOURCE=$(pwd)

helm のインストール

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

choco install kubernetes-helm

インストール済みであればアップグレード。

choco upgrade kubernetes-helm

ingress のデプロイ

ingress をデプロイ。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/cloud/deploy.yaml

pod の確認。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> kubectl get pods --all-namespaces
NAMESPACE       NAME                                        READY   STATUS      RESTARTS   AGE
docker          compose-78f95d4f8c-67gg5                    1/1     Running     0          12m
docker          compose-api-6ffb89dc58-zjnb6                1/1     Running     0          12m
ingress-nginx   ingress-nginx-admission-create-vrgbk        0/1     Completed   0          113s
ingress-nginx   ingress-nginx-admission-patch-dvjk6         0/1     Completed   0          113s
ingress-nginx   ingress-nginx-controller-5cc4589cc8-kz9f5   1/1     Running     0          2m3s
kube-system     coredns-5644d7b6d9-rlb55                    1/1     Running     0          13m
kube-system     coredns-5644d7b6d9-z4fx8                    1/1     Running     0          13m
kube-system     etcd-docker-desktop                         1/1     Running     0          12m
kube-system     kube-apiserver-docker-desktop               1/1     Running     0          12m
kube-system     kube-controller-manager-docker-desktop      1/1     Running     0          12m
kube-system     kube-proxy-pv8dq                            1/1     Running     0          13m
kube-system     kube-scheduler-docker-desktop               1/1     Running     0          13m
kube-system     storage-provisioner                         1/1     Running     0          12m
kube-system     vpnkit-controller                           1/1     Running     0          12m

NAMESPACEingress-nginx のものが 3 つ増えている。(うち 2 つは Completed)

ingress が提供するサービスの IP アドレスをメモ。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> kubectl get services --namespace ingress-nginx
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.96.64.235   localhost     80:32686/TCP,443:32705/TCP   2m58s
ingress-nginx-controller-admission   ClusterIP      10.98.91.42    <none>        443/TCP                      2m58s

TYPELoadBalancerCLUSTER-IP をメモする。この場合は 10.96.64.235。 以降は $CHE_IP にメモした IP を設定したこととして進める。

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

Powershell を管理者権限で開いて、 netsh コマンドでループバックアドレスを追加する。

start-process -verb runas powershell -ArgumentList netsh,interface,ipv4,add,address,Loopback,$CHE_IP

追加されたことを確認。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> netsh interface ipv4 show address Loopback

インターフェイスの構成 "Loopback Pseudo-Interface 1"
    DHCP 有効:                         いいえ
    IP アドレス:                           10.96.64.235
    サブネット プレフィックス:                        10.0.0.0/8 (マスク 255.0.0.0)

che のデプロイ

kubectl create namespace che
cd $CHE_SOURCE\deploy\kubernetes\helm\che
helm dependency update
helm upgrade --install che --namespace che --set global.cheWorkspacesNamespace="che" --set global.ingressDomain=${CHE_IP}.nip.io ./

アプリの確認。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> helm list -n che
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
che     che             1               2020-06-11 01:39:49.0499342 +0900 JST   deployed        che-0.1.0

pod の確認。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> kubectl get pods --all-namespaces
NAMESPACE       NAME                                        READY   STATUS      RESTARTS   AGE
che             che-976cb79f5-zzffd                         1/1     Running     0          79s
che             devfile-registry-d9fd7f648-wblg8            1/1     Running     0          79s
che             plugin-registry-58587b799b-947tb            1/1     Running     0          79s
docker          compose-78f95d4f8c-67gg5                    1/1     Running     0          30m
docker          compose-api-6ffb89dc58-zjnb6                1/1     Running     0          30m
ingress-nginx   ingress-nginx-admission-create-vrgbk        0/1     Completed   0          19m
ingress-nginx   ingress-nginx-admission-patch-dvjk6         0/1     Completed   0          19m
ingress-nginx   ingress-nginx-controller-5cc4589cc8-kz9f5   1/1     Running     0          19m
kube-system     coredns-5644d7b6d9-rlb55                    1/1     Running     0          31m
kube-system     coredns-5644d7b6d9-z4fx8                    1/1     Running     0          31m
kube-system     etcd-docker-desktop                         1/1     Running     0          30m
kube-system     kube-apiserver-docker-desktop               1/1     Running     0          30m
kube-system     kube-controller-manager-docker-desktop      1/1     Running     0          30m
kube-system     kube-proxy-pv8dq                            1/1     Running     0          31m
kube-system     kube-scheduler-docker-desktop               1/1     Running     0          30m
kube-system     storage-provisioner                         1/1     Running     0          30m
kube-system     vpnkit-controller                           1/1     Running     0          30m

NAMESPACEche のものが 3 つ増えている。

che にアクセス

http://che-che.${CHE_IP}.nip.io にアクセスすると、 che の画面が開く。

start http://che-che.${CHE_IP}.nip.io

後片付け

ループバックアドレスの削除

管理者権限で開いた Powershell で以下のコマンドを実行。

start-process -verb runas powershell -ArgumentList netsh,interface,ipv4,delete,address,Loopback,$CHE_IP

che の削除

helm delete --purge で削除できる。

cd $CHE_SOURCE\deploy\kubernetes\helm\che
helm delete che -n che

ingress の削除

こちらも kubectl delete で削除。

kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/cloud/deploy.yaml

helm の削除

choco コマンドで削除。

choco uninstall kubernetes-helm

参考資料

2020年6月9日火曜日

Maven + Java14 + JavaFX14 + jpackage で Hello, World をパッケージ化する

前提

プロジェクト作成から実行まで

プロジェクトテンプレート作成

> cd ${WORK_DIR}
> mvn archetype:generate
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> am.ik.archetype:elm-spring-boot-blank-archetype (Blank multi project for Spring Boot + Elm)
2: remote -> am.ik.archetype:graalvm-blank-archetype (Blank project for GraalVM)
...(snip)
2332: remote -> org.openjfx:javafx-archetype-fxml (-)
2333: remote -> org.openjfx:javafx-archetype-simple (-)
...(snip)
2720: remote -> xyz.luan.generator:xyz-generator (-)
2721: remote -> za.co.absa.hyperdrive:component-archetype (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1615: 2332
Choose org.openjfx:javafx-archetype-fxml version:
1: 0.0.1
2: 0.0.2
3: 0.0.3
4: 0.0.4
5: 0.0.5
Choose a number: 5:
Define value for property 'groupId': jp.dip.oyasirazu.study.javafx.helloworld
Define value for property 'artifactId': helloworld
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' jp.dip.oyasirazu.study.javafx.helloworld: :
[INFO] Using property: javafx-maven-plugin-version = 0.0.4
[INFO] Using property: javafx-version = 13
Confirm properties configuration:
groupId: jp.dip.oyasirazu.study.javafx.helloworld
artifactId: helloworld
version: 1.0-SNAPSHOT
package: jp.dip.oyasirazu.study.javafx.helloworld
javafx-maven-plugin-version: 0.0.4
javafx-version: 13
 Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: javafx-archetype-fxml:0.0.5
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: jp.dip.oyasirazu.study.javafx.helloworld
[INFO] Parameter: artifactId, Value: helloworld
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: jp.dip.oyasirazu.study.javafx.helloworld
[INFO] Parameter: packageInPathFormat, Value: jp/dip/oyasirazu/study/javafx/helloworld
[INFO] Parameter: package, Value: jp.dip.oyasirazu.study.javafx.helloworld
[INFO] Parameter: groupId, Value: jp.dip.oyasirazu.study.javafx.helloworld
[INFO] Parameter: javafx-version, Value: 13
[INFO] Parameter: artifactId, Value: helloworld
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: javafx-maven-plugin-version, Value: 0.0.4
[INFO] Project created from Archetype in dir: C:\Users\mikoto\project\tmp\HelloWorld\helloworld
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:23 min
[INFO] Finished at: 2020-06-09T03:13:56+09:00
[INFO] ------------------------------------------------------------------------

> cd helloworld
  • 2332: remote -> org.openjfx:javafx-archetype-fxml (-) : これが FXML を使った JavaFX アプリテンプレート
  • Choose org.openjfx:javafx-archetype-fxml version: : とりあえず最新版を選択
  • Define value for property 'groupId': jp.dip.oyasirazu.study.javafx.helloworld : グループ ID。パッケージ名に使われる。
  • Define value for property 'artifactId': helloworld : アプリ名。 jar ファイルに使われる。
  • Define value for property 'version' 1.0-SNAPSHOT: : : アプリバージョン番号。 デフォルトだと jar ファイル名に追加される。

${WORK_DIR}/helloworld に Maven プロジェクトが作成される。

pom.xml の修正

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>jp.dip.oyasirazu.study.javafx.helloworld</groupId>
    <artifactId>helloworld</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>14</maven.compiler.source>
        <maven.compiler.target>14</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>14</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>14</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>14</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.5</version>
                <configuration>
                    <mainClass>jp.dip.oyasirazu.study.javafx.helloworld.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • maven.compiler.source : 14 へ修正
  • maven.compiler.target : 14 へ修正
  • javafx-controls : version14 へ修正
  • javafx-fxml : version14 へ修正
  • maven-compiler-plugin : configuration/release14 へ修正
  • javafx-maven-plugin : version0.0.5 へ修正

コンパイル・ jar の作成

以下コマンドでコンパイルと jar 作成まで行われる。

mvn package

.\target\helloworld-1.0-SNAPSHOT.jar に jar が生成される。

コンパイルだけなら mvn compile

とりあえず実行

java -p ".\target\helloworld-1.0-SNAPSHOT.jar;$Env:JAVAFX_HOME\lib" -m "jp.dip.oyasirazu.study.javafx.helloworld/jp.dip.oyasirazu.study.javafx.helloworld.App"
図 1: テンプレートで生成されるアプリ

ボタンを押すたびに View が切り替わるアプリ。

最小構成 JRE 生成

依存モジュールを確認

jdeps で依存モジュールを確認。

> $DEPS = jdeps --print-module-deps --ignore-missing-deps --module-path "$Env:JAVAFX_HOME\lib" .\target\helloworld-1.0-SNAPSHOT.jar
> echo $DEPS
java.base,javafx.fxml,javafx.graphics

最小構成 JRE を作成

jlink で最小構成 JRE を生成する。

> jlink --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules $DEPS,jdk.charsets,jdk.localedata,jp.dip.oyasirazu.study.javafx.helloworld --include-locales=ja --module-path ".\target\helloworld-1.0-SNAPSHOT.jar;$Env:JAVAFX_HOME\jmods" --output "./release/app" --launcher helloworld="jp.dip.oyasirazu.study.javafx.helloworld/jp.dip.oyasirazu.study.javafx.helloworld.App"

.\release\app に最小構成 JRE が生成され、.\release\app\bin\helloworld.bat にランチャーが生成される。

最小構成 JRE で実行してみる

.\release\app\bin\helloworld.bat

OK, うごいた。

パッケージング

jpackage でパッケージ化

jpackage -n helloworld --app-image ./release/app --dest ./release/package --vendor "mikoto2000" --win-dir-chooser
  • -n: アプリケーション名
  • --app-image: アプリイメージ。 jlink で作ったディレクトリを指定する
  • --dest: 出力先ディレクトリ。このディレクトリに [アプリケーション名].exe が生成される
  • --vendor: Windows だと入れないとエラーになるようだ
  • --win-dir-chooser: ユーザーにインストール場所を選択させるためのフラグ

.\release\package\helloworld-1.0.exe にインストーラーが生成される。

インストール手順はインストール - jpackage を使って HelloWorld をパッケージ化する - mikoto2000 の日記を参照。

以上。

参考資料