こんにちはサイオステクノロジー前田です。本日は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つのリポジトリを比べてください。
- コンテナリポジトリ:https://bitnami.com/stacks/containers
- Helmリポジトリ:https://bitnami.com/stacks/helm
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}
- 作成したルートを 確認します。
- サインイン情報のパスワードを確認します。
-
oc rsh $(oc get pod -o name) cat /nexus-data/admin.password
-
- サインイン
nexus repositoryへの利用 コンテナプッシュ
コンテナイメージのレポジトリであるDocker Repositoryを作成していきます。主な作業としてはnexus repositoryで①docker repositoryの作成,②Kubernetes側のレポジトリへのアクセス設定、③コンテナイメージのプッシュを行います。
Docker Repository作成
- コンテナレポジトリ設定
レポジトリへのアクセス設定
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等もソースコードではなくリポジトリに保管しておくことで、デプロイ管理をすごく楽にすることができます。
コンテナイメージとしてリポジトリに保管しておくのは、コンテナのメリットを受ける初めの作業の一つです。コンテナを有効活用するにはいろいろなことを考慮する必要がありますが、この記事が読者の負担軽減の一端になれれば幸いです。