CPへ届け Kubernetesで利用するコンテナレジストリ② nexus repository

こんにちはサイオステクノロジー前田です。本日はKubernetesで利用するコンテナレジストリnexus repositoryについてお話ししていきます。
LinuxのYum,Node.js の npmなど様々な形でパッケージにされており、それを管理するリポジトリ、さらにリポジトリを管理するレジストリが存在します。コンテナイメージをリポジトリとして管理して、全体をまとめるためにレジストリを利用されている方は増えています。

コンテナレジストリは便利ですが、管理コンソールがないものも多くあります。管理コンソールがあり、コンテナ以外のリポジトリも管理できるnexus repositoryに関してデプロイ(kubernetes上)と利用についてお話します。

コンテナリポジトリとヘルムチャートリポジトリ

前回にコンテナレジストリについて記載しましたので今回はKubernetesで利用するリポジトリという観点でお話ししていきます。

Kubernetesで使用するリポジトリは1つはイメージの管理をするコンテナリポジトリ(dockerリポジトリとも言われます)、もう1つはHelmのリポジトリです。

  • コンテナリポジトリ

    • コンテナリポジトリは、コンテナのイメージを管理しています。
    • イメージはWEB、DB等一つずつ管理しているものがほとんどです。

サービスとして確立するにはコンテナとコンテナの結合、環境設定や、コンテナが止まったときどのように動作するか、リソースの制限をどうするか等々いろいろあります。この設定はコンテナリポジトリだけでは管理しないことが多いです。そこで利用されるのがHelmになります。

  • Helmリポジトリ

    • HelmはKubernetes上で実行されるアプリケーションパッケージマネージャです。
    • Helmチャートという形で構造を記述して、簡単なコマンドで管理できます。
    • Helmチャートという形でリポジトリに保存されていて、Helmチャート内部でコンテナリポジトリを記述しています。

Bitnamiで比べるコンテナリポジトリとHelmリポジトリ

二つのリポジトリの違いを見るためにBitnamiの2つのリポジトリを比べてください。

nexus repositoryについて

https://github.com/sonatype/nexus-public

Sonatypeが提供している様々なパッケージのリポジトリを補完ができるものです。RHEL系のLinuxのYum, DebianのAPT, Node.jsのnpm,KubernetesのHelm等様々なリポジトリとして管理することができます。

nexus repositoryはossとproと2種類あります。ossでも十分な機能がありますが、サポートを受けたい方はproを利用するというような方法を取れます。

参考URL

nexus repositoryのデプロイ

Kubernetes環境にnexus repositoryをHelmを利用してデプロイしていきます。※OpenShiftのみOperatorが対応しているためGUIからデプロイすることが可能です。ほかはCLIを利用してデプロイします。

 

※デプロイの検証のみですとCPU4以下でもデプロイは可能です。ほかの要件に関しては公式ドキュメントをご参照ください。

デプロイ環境

  • Kubernetes基盤: OKD v4.10
  • 基盤:AWS
  • デプロイ
    • nexus repository oss 3.39
    • 推奨スペック: CPUs: 8( 最小4)

 

Helmを利用したデプロイ

Helmを利用してのプロジェクト空間にデプロイしていきます。

手順としてはHelmを利用してKubernetes環境にデプロイを行います。そしてOKDのためSCCの設定変更を行いデプロイを完了させます。外部からアクセスするルートを追加して管理コンソールにアクセスが可能なことを確認します。ログインパスワードをポッドから取得し管理コンソールにアクセスを行い、リポジトリを作成します。リポジトリを作成後リポジトリにアクセスできるポートにつなぐルートとサービスを作成します。このようにしてコンテナイメージを保管するリポジトリを作成します。

 

  • プロジェクト作成します。
    oc new-project nexusrepo
  • Helmレポジトリを追加します。
    helm repo add sonatype https://sonatype.github.io/helm3-charts/
  • 作成したプロジェクトにデプロイします。(OKDではSCCを変更しないと完全にはデプロイ完了しません。)
    helm install nexus-repo sonatype/nexus-repository-manager
    • NAME: nexus-repo
      LAST DEPLOYED: Tue Jun 14 02:47:46 2022
      NAMESPACE: nexusrepo
      STATUS: deployed
      REVISION: 1
      NOTES:
      1. Get the application URL by running these commands:
        export POD_NAME=$(kubectl get pods --namespace nexusrepo -l "app.kubernetes.io/name=nexus-repository-manager,app.kubernetes.io/instance=nexus-repo" -o jsonpath="{.items[0].metadata.name}")
        kubectl --namespace nexusrepo port-forward $POD_NAME 8081:80
        Your application is available at http://127.0.0.1
  • SCC設定(OKDのセキュリティ対応のため)を行います。
    • oc adm policy add-scc-to-user anyuid -z nexus-repo-nexus-repository-manager
  • デプロイが終了してポッドが全部動作しているか確認します。
    • 確認コマンド
      oc get all
    • 結果 (podがRunningの状態であることを確認します)
      NAME                                                       READY   STATUS    RESTARTS   AGE
      pod/nexus-repo-nexus-repository-manager-57bfdf768b-l6rbz   1/1     Running   0          3m44s
      
      NAME                                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
      service/nexus-repo-nexus-repository-manager   ClusterIP   172.30.136.109   <none>        8081/TCP   7m50s
      
      NAME                                                  READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/nexus-repo-nexus-repository-manager   1/1     1            1           7m50s
      
      NAME                                                             DESIRED   CURRENT   READY   AGE
      replicaset.apps/nexus-repo-nexus-repository-manager-57bfdf768b   1         1         1       7m50s
      

       

  • 外部アクセス可能にするためサービスの情報からルートを作成します。
    oc expose svc nexus-repo-nexus-repository-manager
    • 作成したルートを 確認します。
      oc get route -o jsonpath={$.items[].spec.host}
    • 表示されたURLにアクセスして表示が見れることを確認します。
  • サインイン情報のパスワードを確認します。
    • oc rsh $(oc get pod -o name) cat /nexus-data/admin.password
  • サインイン
    • 画面右上のサインインを押下します。
    • ユーザー名を admin パスワードを先ほど調べた情報を利用してサインインします。
    • ログイン画面が表示されます。

nexus repositoryへの利用 コンテナプッシュ

コンテナイメージのレポジトリであるDocker Repositoryを作成していきます。主な作業としてはnexus repositoryで①docker repositoryの作成,②Kubernetes側のレポジトリへのアクセス設定、③コンテナイメージのプッシュを行います。

Docker Repository作成

  • コンテナレポジトリ設定
    • 画面上の歯車マークを押下します。
    • Rpositoriesを選択します。作成されているレポジトリが表示されます。
    • Create repositoryを選択します。
    • docker(hosted)を選択します。
      • Nameにimagerepo と入力します
      • HTTPにチェックをつけ、5000 とポート番号を設定します。
      • Create repositoryを選択します。
    • imagerepo のRepositoryが作成されています。imagerepoの管理URLを確認します。

レポジトリへのアクセス設定

docker レポジトリの5000番ポートにアクセスするための設定を行います。先ほどのレポジトリ作成でPod側には5000でアクセスすることは可能になりました。KubernetesでPodにアクセスするためのServiceを作成します。さらに外部からアクセスできるようにルートを作成します。

  • レジストリへの接続設定
    • サービスを作成します。
      oc expose deploy nexus-repo-nexus-repository-manager --name=nexus-registry --port=5000
    • ルートを作成します。
      oc create route edge nexus-registry --service=nexus-registry
    • ルートを確認します。
      REPO=$(oc get route nexus-registry  -o jsonpath={$.spec.host});echo $REPO
    •  レポジトリにログインします。
      podman login  $REPO --tls-verify=false

コンテナプッシュ テスト

サンプルコンテナを外部から取得し、コンテナをリポジトリにアップロードします。

  • コンテナプッシュ
    • コンテナサンプルを外部から取得します。
      podmann pull alpine:latest
    • コンテナのタグ付けを実施します。
      podman tag alpine:latest $REPO/repository/imagerepo/alpine:latest
    • コンテナをプッシュします。
      podman push $REPO/repository/imagerepo/alpine:latest --tls-verify=false
    • 管理コンソールからコンテナが存在していることを確認します

最後に

Kubernetes環境のアプリケーション初期設定は難しいですが、Helmを利用すればKubernetesに慣れていない方でもデプロイできます。GUIありの管理コンソールが存在すれば、運用者や慣れていない方でも利用できるようになり学習コストを下げることができます。学習して全部理解して触るより、目的のために利用&操作ができるためのnexus repositoryを導入するのはとてもいいことだと思います。機能が足りなければ有償ライセンスや、高性能なQuayの利用を考えてください。

nexus repositoryにはコンテナレポジトリ以外にもHelmレポジトリも作成することができます。Helmの形で保管しておけば再利用やCI/CDの活用等がより簡単に利用できます。java等もソースコードではなくリポジトリに保管しておくことで、デプロイ管理をすごく楽にすることができます。

コンテナイメージとしてリポジトリに保管しておくのは、コンテナのメリットを受ける初めの作業の一つです。コンテナを有効活用するにはいろいろなことを考慮する必要がありますが、この記事が読者の負担軽減の一端になれれば幸いです。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です