#chiroito ’s blog

Java を中心とした趣味の技術について

WindowsにPodman Desktopを入れた後にIntelliJ IDEAと他のWSLから実行できるようにする

Windows に Podman Desktop を入れると、コマンドプロンプトやGUI上でコンテナを使えるようになります。

それだけだと不便なので、使用しているIDEとWSLからも使えるように設定をした備忘録です。

Podman Desktop を入れると WSL 上に podman-machine-default という Linux が入ります。

> wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
podman-machine-default
Ubuntu-22.04

Windows 側の Podman の設定は、SSH を使って podman-machine-defaultへ接続するようになっています。

> podman context list
Name                         URI                                                          Identity                                    Default
podman-machine-default       ssh://user@localhost:50725/run/user/1000/podman/podman.sock  C:\Users\c_hir\.ssh\podman-machine-default  true
podman-machine-default-root  ssh://root@localhost:50725/run/podman/podman.sock            C:\Users\c_hir\.ssh\podman-machine-default  false

ある日、急に繋がらなくなったのでいろいろ試した結果、ホスト名をlocalhostからpodman-machine-defaultのIPにしたらアクセスできるようになった。netsh.exe interface portproxy add v4tov4 で同IPにフォワードしているので不思議。

podman system connection remove podman-machine-default 
podman system connection add podman-machine-default --identity C:\Users\c_hir\.ssh\podman-machine-default ssh://user@172.26.130.33:50725/run/user/1000/podman/podman.sock

IntelliJ IDEA

IntelliJ IDEAのコンテナの設定は Services で行います。

「+」を選択するとメニューが出るので、Docker Connection を選択します。

Docker ダイアログが表示され、特に変更は必要ありません。分かりやすいように名前だけ変えると良いでしょう。ダイアログの下側に Connection Successful と表示されてればOKです。

この設定方法以外にも podman context list で表示された情報を使って、Podman Desktop が作成した WSL へ SSH で接続する方法も可能です。

OK を選択すると、 Services に追加されます。

WSL

SSHの鍵をWindowsからWSLへコピーして、権限を設定

sudo mkdir /root/.ssh
sudo chmod 700 /root/.ssh
sudo cp /mnt/c/Users/c_hir/.ssh/podman-machine-default /root/.ssh/podman-machine-default
sudo chmod 600 /root/.ssh/podman-machine-default

鍵を使って接続できることを確認

> sudo ssh -i ~/.ssh/podman-machine-default user@localhost -p 50725 exit

podman にリモートホストの情報を登録

> sudo podman system connection add -d --identity /root/.ssh/podman-machine-default --socket-path /run/user/1000/podman/podman.sock podman ssh://user@localhost:50725

情報が登録されたことを確認

> sudo podman system connection list
Name        Identity                           URI
podman*     /root/.ssh/podman-machine-default  ssh://user@localhost:50725/run/user/1000/podman/podman.sock

イメージとコンテナの状況を見てみてもなぜか見えない・・・

> sudo podman image list
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
> sudo podman container list
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

なぜか実行はできる

> sudo podman -r run quay.io/podman/hello
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob sha256:e748d51595bc62e996d56ccaa873a5f520ab314d5c63aca3b53b4110129d42d1
Copying config sha256:54c80734fe405a23783a26881d74c5842f6b047f021b029c0b672565101fef76
Writing manifest to image destination
Storing signatures
!... Hello Podman World ...!

         .--"--.
       / -     - \
      / (O)   (O) \
   ~~~| -=(,Y,)=- |
    .---. /`  \   |~~
 ~/  o  o \~~~~.----. ~~
  | =(X)= |~  / (O (O) \
   ~~~~~~~  ~| =(Y_)=-  |
  ~~~~    ~~~|   U      |~~

Project:   https://github.com/containers/podman
Website:   https://podman.io
Documents: https://docs.podman.io
Twitter:   @Podman_io

再びイメージとコンテナの状況を見てみてもやはり見えない・・・

> sudo podman image list
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
> sudo podman container list
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

Podman DesktopだとこのWSL上で扱ったイメージとコンテナは見られます。

Google Trust Services CAの証明書を OpenShift に適用

※2024年3月13日に更新

自宅にGoogle Domainsでドメイン情報を管理しながらOpenShiftを導入したところ、Chromeからコンソールに繋ごうとすると接続できなくて困ったので、それを修正する備忘録です。

OpenShiftのインストールが終わるとこんな画面になります。

暫定対処としては、PCで、この画面のどこかをマウスでクリックしてthisisunsafeと入力すると開けます。iPad ではできませんでした。

最終的なゴールはちゃんと保護された状態で接続できるようにすることです。

事前準備

Google Trust Service の EABキーとACME DNS APIのアクセストークンが必要です。

まずは、Google Trust Services にアクセスするために必要な情報を取得します。

「EABキーを取得」をクリックします。

次に、同じくセキュリティにあるACME DNS APIにあるトークンを作成をクリックします。

証明書を作成

まずは、証明書を作成するツールをダウンロードします。

git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh

次に証明書作成に必要な環境変数を用意します。ocコマンドがちゃんと動かない場合は、Red Hat Hybrid Cloud Consolekubeconfig をダウンロードしてきてホームディレクトリに.kube/configファイルとして配置しましょう。

export LE_API=$(oc whoami --show-server | cut -f 2 -d ':' | cut -f 3 -d '/' | sed 's/-api././')
export LE_WILDCARD=$(oc get ingresscontroller default -n openshift-ingress-operator -o jsonpath='{.status.domain}')
export EAB_KEY_ID=<Google DomainsのEABキーID>
export EAB_HMAC_KEY=<Google DomainsのEAB HMACキー>
export GOOGLEDOMAINS_ACCESS_TOKEN=<ACME DNS APIのトークン>
export MAIL_ADDRESS=<自身のメールアドレス>
export DOMAIN=<自身のOpenShiftのドメイン> #今回はo.chiroito.dev

あとは発行の処理をするだけです。

./acme.sh --issue -d ${LE_API} -d *.${LE_WILDCARD} --dns dns_googledomains --server google

以下のようなログが出れば完了です。

[Wed Mar 13 10:28:06 JST 2024] Your cert is in: /root/.acme.sh/api.o.chiroito.dev_ecc/api.o.chiroito.dev.cer
[Wed Mar 13 10:28:06 JST 2024] Your cert key is in: /root/.acme.sh/api.o.chiroito.dev_ecc/api.o.chiroito.dev.key
[Wed Mar 13 10:28:06 JST 2024] The intermediate CA cert is in: /root/.acme.sh/api.o.chiroito.dev_ecc/ca.cer
[Wed Mar 13 10:28:06 JST 2024] And the full chain certs is there: /root/.acme.sh/api.o.chiroito.dev_ecc/fullchain.cer
[Wed Mar 13 10:28:06 JST 2024] _on_issue_success
[Wed Mar 13 10:28:06 JST 2024] 'dns_googledomains' does not contain 'dns'
[Wed Mar 13 10:28:06 JST 2024] The NOTIFY_HOOK is empty, just return.

エラーが起きたときは、--debugを付けて再実行しましょう。再実行時に--renewを付けても一定の間隔を待たないと発行できないようで、--forceを付けて強制的に再発行できます。

以前に比べるとかなり簡単に証明書を発行できるようになりました。

環境変数の登録が終わった後は、以下のコマンドでGoogle(?)にアカウントを作ります。

acme.sh --register-account  -m ${MAIL_ADDRESS} --server google \
--eab-kid ${EAB_KEY_ID} --eab-hmac-key ${EAB_HMAC_KEY}

[Tue Apr 18 18:17:35 JST 2023] Registering account: https://dv.acme-v02.api.pki.goog/directory
[Tue Apr 18 18:17:48 JST 2023] Registered
[Tue Apr 18 18:17:49 JST 2023] ACCOUNT_THUMBPRINT='XXXXXXX'

上記のログで最後の行に出力されているものを実行します。

ACCOUNT_THUMBPRINT='XXXXXXX'

証明書を作り始めましょう。1度目は失敗します。

./acme.sh --issue -d ${LE_API} -d *.${LE_WILDCARD} --dns dns_googledomains --server google

必要なTXTレコードが無いらしく、以下のエラーが発生します。

[Tue Apr 18 19:01:00 JST 2023] Using CA: https://dv.acme-v02.api.pki.goog/directory
[Tue Apr 18 19:01:00 JST 2023] Multi domain='DNS:api.o.chiroito.dev,DNS:*.apps.o.chiroito.dev'
[Tue Apr 18 19:01:00 JST 2023] Getting domain auth token for each domain
[Tue Apr 18 19:01:28 JST 2023] Getting webroot for domain='api.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] Getting webroot for domain='*.apps.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] Can not find dns api hook for: dns_googledomains
[Tue Apr 18 19:01:28 JST 2023] You need to add the txt record manually.
[Tue Apr 18 19:01:28 JST 2023] Add the following TXT record:
[Tue Apr 18 19:01:28 JST 2023] Domain: '_acme-challenge.api.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] TXT value: '65fNOPeBc5XQs0Q1nuNk3Z3npDKZ_cRjYKalHaxgsZo'
[Tue Apr 18 19:01:28 JST 2023] Please be aware that you prepend _acme-challenge. before your domain
[Tue Apr 18 19:01:28 JST 2023] so the resulting subdomain will be: _acme-challenge.api.o.chiroito.dev
(略)
[Tue Apr 18 19:01:28 JST 2023] Domain: '_acme-challenge.apps.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] TXT value: 'LIAk1oBiufG5CdkJQiTZinorXzI9AJAIsdI5Jc1e6xI'
(略)
[Tue Apr 18 19:01:28 JST 2023] Please add the TXT records to the domains, and re-run with --renew.
[Tue Apr 18 19:01:28 JST 2023] Please add '--debug' or '--log' to check more details.
[Tue Apr 18 19:01:28 JST 2023] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

こういうのが複数行出力されます。

[Tue Apr 18 19:01:28 JST 2023] Domain: '_acme-challenge.api.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] TXT value: '65fNOPeBc5XQs0Q1nuNk3Z3npDKZ_cRjYKalHaxgsZo'

ログで言われたとおりGoogle Domainsで以下のTXTレコードを作ります。出力された分全部必要です。今回は2つ出力されたので2つ作ります。

ドメイン
_acme-challenge.api.o.chiroito.dev 65fNOPeBc5XQs0Q1nuNk3Z3npDKZ_cRjYKalHaxgsZo
_acme-challenge.apps.o.chiroito.dev LIAk1oBiufG5CdkJQiTZinorXzI9AJAIsdI5Jc1e6xI

追加した後はこんな感じになります。

しばらくしたら--renewを追加して再実行しましょう。

./acme.sh --issue -d ${LE_API} -d *.${LE_WILDCARD} --dns dns_googledomains --server google --renew

(略)

[Tue Apr 18 21:09:54 JST 2023] Your cert is in: /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/api.o.chiroito.dev.cer
[Tue Apr 18 21:09:54 JST 2023] Your cert key is in: /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/api.o.chiroito.dev.key
[Tue Apr 18 21:09:54 JST 2023] The intermediate CA cert is in: /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/ca.cer
[Tue Apr 18 21:09:54 JST 2023] And the full chain certs is there: /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/fullchain.cer
[Tue Apr 18 21:09:54 JST 2023] _on_issue_success

最後の行が出力されたら発行完了です。

OpenShiftへ証明書を適用

証明書の作成されたディレクトリへ移動して、ocコマンドで登録していきます。

cd /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/
oc create configmap google-domain-ca --from-file=ca-bundle.crt=./ca.cer -n openshift-config
oc patch proxy/cluster --type=merge --patch='{"spec":{"trustedCA":{"name":"google-domain-ca"}}}'
# 次のコマンドを実行するとしばらく繋がらなくなる
oc create secret tls google-domain --cert=fullchain.cer --key=api.${DOMAIN}.key -n openshift-ingress
# 次のコマンドを実行するとしばらく繋がらなくなる
oc patch ingresscontroller.operator default --type=merge -p '{"spec":{"defaultCertificate": {"name": "google-domain"}}}' -n openshift-ingress-operator

あとは接続できなくなってから1,2分待つと保護された状態で接続できるようになります。

OpenShift がおかしくなったと感じたら。

失敗したときは、各行でそれぞれ以下のコマンドを実行しました。OpenShiftの知識はゼロなので、雰囲気でやってます。

# 作ったconfigmapを消す
oc delete configmap google-domain-ca -n openshift-config

# CAの設定を消す。最初の値を確認忘れのため、null を入れてます
oc patch proxy/cluster --type=merge --patch='{"spec":{"trustedCA":null}}'

# 作った secret の情報を消す
oc delete secret google-domain -n openshift-ingress

# defaultCertificate の設定を消す。最初の値を確認忘れのため、null を入れてます
oc patch ingresscontroller.operator default --type=merge -p '{"spec":{"defaultCertificate": null}}' -n 
openshift-ingress-operator

参考

Google Trust Services CA · acmesh-official/acme.sh Wiki · GitHub

Let’s Automate :: Let’s Encrypt TLS Certs for OpenShift 4 | by Karan Singh | Medium

第3章 証明書の設定 OpenShift Container Platform 4.12 | Red Hat Customer Portal

困ったときのGitコマンド集

自分がGitで困ったときに使ったGitコマンドをここに日々追加していきます。

PR をレビューしてもらっていろいろいじっていたら、よく分からなくなって変なのまでリモートに行ってしまった。

git push -f origin <戻したい位置>:<ブランチ>

ローカルで良く分からなくなったから、どこかまで戻したい。

git reset --hard <戻したい位置>