[ 言語選択: English ]

1. Harbor - Docker Registry互換環境

HarborはKubernetesと同様に Cloud NativeComputing Foundation(CNCF) が支援するプロジェクトです。 Dockerのページでは、DockerHubについて説明しましたが、このHarborは学内ネットワークのみで利用できます。

2. Harborの基本情報

kubecamp.u-aizu.ac.jpの利用を開始すると自動的にHarborに登録できるようになります。

  • Private Project Name: "AINS ID".private

  • Public Project Name: "AINS ID"

harbor.console

詳細はHarbor https://inovtst9.u-aizu.ac.jp/ にログインして確認してください。

3. 使い方

基本的な利用方法について説明します。

3.1. Harborへのログイン

Webブラウザから、https://inovtst9.u-aizu.ac.jp/ にアクセスし、AINSのIDとパスワードでログインします。

harbor.harbor login

3.2. Dockerコンテナイメージの作成・準備

ここからはdockerコマンドが実行できる環境で実行します。

準備として、事前にhello-worldコンテナをdocker.ioからダウンロードしておきます。 Dockerfileからbuildした場合には、hello-worldは適宜置き換えて読んでください。

$ podman pull --platform linux/amd64 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

以上