$ podman pull --platform linux/amd64 hello-world
1. Harbor - Docker Registry互換環境
HarborはKubernetesと同様に Cloud NativeComputing Foundation(CNCF) が支援するプロジェクトです。 Dockerのページでは、DockerHubについて説明しましたが、このHarborは学内ネットワークのみで利用できます。
-
https://goharbor.io/ - Official Site
2. Harborの基本情報
-
利用可能な範囲: 学内ネットワークからのアクセスのみ可能
-
利用可能なID: AINS ID
kubecamp.u-aizu.ac.jpの利用を開始すると自動的にHarborに登録できるようになります。
-
Private Project Name: "AINS ID".private
-
Public Project Name: "AINS ID"
詳細はHarbor https://inovtst9.u-aizu.ac.jp/ にログインして確認してください。
3. 使い方
基本的な利用方法について説明します。
3.2. Dockerコンテナイメージの作成・準備
ここからはdockerコマンドが実行できる環境で実行します。
準備として、事前にhello-worldコンテナをdocker.ioからダウンロードしておきます。 Dockerfileからbuildした場合には、hello-worldは適宜置き換えて読んでください。
次の要領で、pullに成功したか確認してください。
$ podman images hello-world
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 12 months ago 1.84kB
このローカルPCにダウンロードした、hello-world:latestをHarbor(inovtst9.u-aizu.ac.jp)に転送(push)します。
3.3. Harbor(inovtst9.u-aizu.ac.jp)への転送
作業を進める前に、podman loginコマンドを実行します。
$ podman login inovtst9.u-aizu.ac.jp
ここでUsername, Passwordを入力するよう促されますので、AINS-IDの情報を入力します。
Username:
Password:
Login Succeeded
このように Login Succeeded と表示されれば成功です。
podmanを利用した場合には入力したユーザーIDとパスワードは /run/user/$UID/containers/auth.json に格納されます。
パーミッションは適切に設定されていますので容易に他のユーザーから閲覧できることはありませんが、念のため利用が終ったら podman logout inovtst9.u-aizu.ac.jp コマンドを実行して、これらの情報を削除してください。
dockerコマンドを利用した場合には ~/.docker/config.json ファイルに情報が格納されます。
同様に docker logout inovtst9.u-aizu.ac.jp のようにして認証情報を削除してください。
3.3.1. hello-world:latestに自分用の名前を付ける
podman images コマンドで表示されたローカルPC上のコンテナイメージに、 Server名/Project名/Repository名:TAG の形式で別名(エイリアス, alias)を付けます。
-
Server名 - "inovtst9.u-aizu.ac.jp" を指定する
-
Project名 - WebブラウザでHarborにログインした際に作成したProject名を 指定する (以下ではユーザーIDと同じと仮定して説明します)
-
Repository名 - 任意の文字列を指定する (e.g. "my-hello-world")
-
TAG - 任意の文字列を指定する (e.g. "latest" or "1.0")
$ podman tag hello-world:latest inovtst9.u-aizu.ac.jp/$(id -un)/my-hello-world:1.0
このコマンドは正常な場合、なにも画面に出力しません。
3.3.2. 名前をつけたイメージをHarborに転送する
このalias(Server名/Project名/Repository名:TAG)を利用して、Harbor上に作成したProjectに登録していきます。
$ podman push inovtst9.u-aizu.ac.jp/$(id -un)/my-hello-world:1.0
The push refers to repository [inovtst9.u-aizu.ac.jp/$(id -un)/my-hello-world]
af0b15c8625b: Pushed
1.0: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524
実際にイメージが登録されているか、WebブラウザからHarbor(inovtst9.u-aizu.ac.jp)にアクセスし、確認してください。
ユーザーID・パスワードに関連した情報を削除するため、必ず下記のように podman logout`
してください。
$ podman logout inovtst9.u-aizu.ac.jp
4. PodmanからのHarborの利用
podman push を実行したマシンには既にイメージがあるので、ゼミ室10や 学内の他のマシンから登録したイメージを利用するための方法について説明 します。
ProjectをPublicにしている場合には、podman loginコマンドは不要です。 例えば、公開した inovtst9.u-aizu.ac.jp/<自分のProject名>/my-hello-world:1.0 は次のように利用する事ができます。
## まずローカルにあるimageを削除します
$ podman rmi inovtst9.u-aizu.ac.jp/$(id -un)/my-hello-world:1.0
## その後、harborからイメージをダウンロードし実行します。
$ podman run --rm --name my-hello-world --security-opt label=disable inovtst9.u-aizu.ac.jp/$(id -un)/my-hello-world:1.0
画面に次のようなメッセージが表示されれば成功です。
Trying to pull inovtst9.u-aizu.ac.jp/yasu-abe/my-hello-world:1.0...
Getting image source signatures
Copying blob 06aa973b0700 done
Copying config a4e07799a3 done
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
Desktop: https://podman-desktop.io
Documents: https://docs.podman.io
YouTube: https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon: @Podman_io@fosstodon.org
上記のコマンドを実行して"hello podman world"ではなく、"Hello from Docker!"が表示された場合には、次のコマンドで同じ結果が得られます。
$ podman run --rm -it quay.io/podman/hello
ProjectがPrivateに設定されている場合には、事前にpodman login inovtst9.u-aizu.ac.jp を実行しておく必要があります。次のイメージはPrivateに設定されているProject:yasu-abe-privに登録されているので、podman loginしてもMembersに登録されていないため実行できません。
$ podman run --rm --name mynginx inovtst9.u-aizu.ac.jp/yasu-abe.private/my-nginx:1.0
Trying to pull inovtst9.u-aizu.ac.jp/yasu-abe.private/my-nginx:1.0...
Error: initializing source docker://inovtst9.u-aizu.ac.jp/yasu-abe.private/my-nginx:1.0: reading manifest 1.0 in inovtst9.u-aizu.ac.jp/yasu-abe.private/my-nginx: unauthorized: unauthorized to access repository: yasu-abe.private/my-nginx, action: pull: unauthorized to access repository: yasu-abe.private/my-nginx, action: pull
4.1. my-nginxイメージの登録
my-hello-world:1.0は画面にメッセージを出力するだけのアプリケーションでした。
Kubernetesなどで動作を確認するには、Webサーバーのように動き続けるアプリケーションである必要があるので、次に同様の手順で、適当なnginxのイメージを登録してみましょう。
$ podman pull --platform linux/amd64 docker.io/library/nginx:latest
$ podman tag nginx:latest inovtst9.u-aizu.ac.jp/$(id -un)/my-nginx:1.0
$ podman login inovtst9.u-aizu.ac.jp
$ podman push inovtst9.u-aizu.ac.jp/$(id -un)/my-nginx:1.0
$ podman logout inovtst9.u-aizu.ac.jp
これで、Harbor(https://inovtst9.u-aizu.ac.jp/)の自分のProjectに、my-nginx:1.0 が登録されました。
5. KubernetesからのHarborの利用
あらかじめ kubectlコマンドが利用できるよう、 ~/.kube/config の id-token を更新しておいてください。
先ほどHarborに登録した my-nginx:1.0 を実行してみましょう。
次の2つのYAMLファイルを例に、説明します。
5.1. deploy-nginx.yamlの反映
$ curl -s "https://web-int.u-aizu.ac.jp/~yasu-abe/ja/sccp/manual/harbor.deploy-nginx.yaml" | sed -e "s/s12xxxxx/$(id -un)/" | kubectl -n $(id -un) apply -f -
5.2. svc-nginx.yamlの反映
$ kubectl -n $(id -un) apply -f "https://web-int.u-aizu.ac.jp/~yasu-abe/ja/sccp/manual/harbor.svc-nginx.yaml"
ここまで終ったら、設定が反映されているか確認してください。
$ kubectl -n $(id -un) get all -l app=harbor-nginx
NAME READY STATUS RESTARTS AGE
pod/harbor-nginx-58bc5c5976-4fcwg 1/1 Running 0 3m25s
pod/harbor-nginx-58bc5c5976-tc2rw 1/1 Running 0 3m24s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/harbor-nginx ClusterIP 10.233.63.156 <none> 80/TCP 11m
NAME DESIRED CURRENT READY AGE
replicaset.apps/harbor-nginx-58bc5c5976 2 2 2 3m25s
replicaset.apps/harbor-nginx-65d5c68c79 0 0 0 4m56s
このアプリケーションにアクセスするためには、svc設定を変更して、typeをLoadBalancerにしてIPアドレスを割り振るか、Ingressから振り先をこの service/harbor-nginx に変更する必要があります。
Ingressからのリクエストをこのnginxに向けるだけであれば、次のような方法で確認ができます。
apiVersion: v1
kind: Service
metadata:
name: s12xxxxx-svc
spec:
type: ClusterIP
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: harbor-nginx
$ curl -s "https://web-int.u-aizu.ac.jp/~yasu-abe/ja/sccp/manual/harbor.svc-proxy.yaml" | sed -e "s/s12xxxxx/$(id -un)/" | kubectl -n $(id -un) apply -f -
service/yasu-abe-svc configured
$ kubectl -n $(id -un) exec -it $(kubectl -n $(id -un) get pod -l app=harbor-nginx -o jsonpath={.items[0].metadata.name}) -- bash -c "mkdir -p /usr/share/nginx/html/$(id -un) && echo Hello World, $(id -un) at $(date) > /usr/share/nginx/html/$(id -un)/index.html"
$ curl -s https://kubecamp.u-aizu.ac.jp/$(id -un)/
replica:2に設定しているため、次のように文字列が表示されるか、nginxが表示する404 Not Foundページのいずれかが表示されます。
Hello World, yasu-abe at Mon Mar 18 04:14:28 PM JST 2024
5.3. (オフトピック: 上級者向け) ProjectをPrivate設定にしている場合の対処
もしHarborでProjectをprivate設定で作成した場合には次のように設定を行ないます。
まず、適当な名称(ここでは"selfreg")のsecretオブジェクトを作成します。
## AINS IDのパスワードを"regpasswd"変数に格納する
$ read -s regpasswd
$ kubectl -n $(id -un) create secret docker-registry selfreg --docker-username=$(id -un) --docker-email=$(id -un)@u-aizu.ac.jp --docker-password="${regpasswd}"
## 他にauth.jsonファイルがあれば、次のようにsecret/selfregを作成することもできます。
$ kubectl -n $(id -un) create secret generic selfreg --from-file=.dockerconfigjson=/var/run/user/$(id -u)/containers/auth.json --type=kubernetes.io/dockerconfigjson
YAMLファイルに、ここで作成した"selfreg"を使用するよう、spec:の下にimagePullSecrets:を追加します。
spec:
imagePullSecrets:
- name: selfreg
以上