KubernetesクラスタにプライベートDockerレジストリまたはリポジトリを用意することを常にお勧めします。 Dockerプライベートレジストリを使用すると、開発者はプライベートコンテナイメージをプッシュおよびプルできます。アプリケーションのコンテナがプライベートレジストリにプッシュされると、開発者はyamlファイルを作成してデプロイするときにプライベートレジストリのパスを使用できます。
この記事では、プライベートDockerレジストリをKubernetesクラスター上にデプロイする方法を学習します。 Kubernetesクラスタがすでに稼働していると想定しています。
プライベートDockerレジストリを設定するためのKubernetesラボの詳細
- k8s-master – 192.168.1.40 – CentOS 7
- k8s-worker-1 – 192.168.1.41 – CentOS 7
- k8s-worker-2 – 192.168.1.42 – CentOS 7
- sudo権限を持つkadminユーザー
- NFS共有「/opt/certs」と「/opt/registry」
注: 私の場合、マスターノードにnfsサーバーをセットアップし、/ opt/certsと/opt/registryをnfs共有としてエクスポートしました。
プライベートレジストリの展開を開始する前に、これらのnfs共有が各ワーカーノードにマウントされていることを確認してください。各ワーカーノードで次のコマンドを実行します。
$ sudo mkdir / opt / certs / opt / registerry $ sudo mount 192.168.1.40:/ opt / certs / opt / certs $ sudo mount 192.168.1.40:/ opt / registerry / opt / registerry
永続マウントの場合は、/ etc/fstabファイルにnfsエントリを追加します。
これらのnfs共有をマウントする代わりに、nfsベースの永続ボリュームを作成し、後でyamlファイルでこれらの永続ボリュームを使用することもできます。
KubernetesでのプライベートDockerレジストリのインストールと構成の手順を詳しく見ていきましょう。
ステップ1)プライベートレジストリの自己署名証明書を生成する
コントロールプレーンまたはマスターノードにログインし、opensslコマンドを使用して、プライベートDockerリポジトリの自己署名証明書を生成します。
$ cd / opt $ sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout \ ./certs/registry.key -x509 -days 365 -out ./certs/registry.crt
キーと証明書ファイルが生成されたら、lsコマンドを使用してそれらを確認します。
[[email protected] opt] $ ls -l certs /total8-rw-r--r--。 1ルートルート2114Sep2603:26registry.crt-rw-r--r--。 1ルートルート32729月26日03:26registry.key[[email protected] opt] $
ステップ2)yamlファイルを介したデプロイとしてプライベートレジストリをデプロイします
マスターノードで、次の内容のprivate-registry.yamlファイルを作成します
[[email protected]〜] $ mkdir docker-repo [[email protected]〜] $ cd docker-repo / [[email protected] docker-repo] $ vi private-registry.yamlapiVersion:apps / v1kind:Deploymentmetadata :名前:private-repository-k8sラベル:app:private-repository-k8sspec:レプリカ:1セレクター:matchLabels:アプリ:private-repository-k8sテンプレート:メタデータ:labels:app:private-repository-k8s名前:本命-体積ホストパス:パス:は/ opt / certsのタイプ:ディレクトリ - 名前:レジストリ体積ホストパス:パス:は/ opt /レジストリタイプ:Directoryコンテナ: - イメージ:レジストリ:2名:プライベート・リポジトリ-K8S imagePullPolicy: IfNotPresent ENV: - 名前:REGISTRY_HTTP_TLS_CERTIFICATE値: "/certs/registry.crt" - 名前:REGISTRY_HTTP_TLS_KEY値: "/certs/registry.key" ポート: - containerPort:5000 volumeMounts: - 名前:certs-vol mountPath:/ certs-名前:registry-vol mountPath:/ var / lib / registerry
yamlファイルを保存して閉じます
次のkubectlコマンドを実行して、上記で作成したyamlファイルを使用してプライベートレジストリをデプロイします。
[[email protected] docker-repo] $ kubectl create -f private-registry.yamldeployment.apps / private-repository-k8s created [[email protected] docker-repo] $
以下のkubectlコマンドを実行して、レジストリの展開とそのポッドのステータスを確認します。
[[email protected]〜] $ kubectl get deploys private-repository-k8sNAME READY UP-TO-DATE AVAILABLE AGEprivate-repository-k8s 1/1 protected [1 〜] $ kubectl get pods | grep -i private-repoprivate-repository-k8s-85cf76b9d7-qsjxq1/1実行中05分14秒[[メール保護]〜] $
上記の出力は、レジストリが正常にデプロイされたことを示しています。次に、レジストリ証明書ファイルを「/ etc / pki / ca-trust / source/anchors」フォルダの下のワーカーノードとマスターノードにコピーします。マスターノードと各ワーカーノードで次のコマンドを実行します
$ sudo cp /opt/certs/registry.crt /etc/pki/ca-trust/source/anchors/$ sudo update-ca-trust $ sudo systemctl restart docker
ステップ3)ノードポートサービスタイプとしてレジストリデプロイメントを公開する
レジストリのデプロイをノードポートサービスタイプとして公開するには、以下のコンテンツを含むyamlファイルを作成します
[[email protected]〜] $ cd docker-repo / [[email protected] docker-repo] $ vi private-registry-svc.yamlapiVersion:v1kind:Servicemetadata:labels:app:private-repository-k8s name: private-repository-k8sspec:ポート:-ポート:5000 nodePort:31320プロトコル:TCP targetPort:5000セレクター:app:private-repository-k8sタイプ:NodePort
ファイルを保存して閉じます。
次に、次のkubectlコマンドを実行してサービスをデプロイします
$ kubectl create -f private-registry-svc.yamlservice / private-repository-k8s created $
以下のkubectlコマンドを実行して、サービスステータスを確認します。
[[email protected]〜] $ kubectl get svc private-repository-k8sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)530 .5000 AGEprivate-repository-k8s NodePort 10.100メールで保護]〜] $
ステップ4)k8sでプライベートDockerレジストリをテストして使用する
プライベートレジストリをテストするには、nginxイメージをローカルにダウンロードしてから、そのイメージをプライベートレジストリにアップロードします。マスターノードから、次の一連のコマンドを実行します。
$ sudo docker pull nginx $ sudo docker tag nginx:latest k8s-master:31320 / nginx:1.17 $ sudo docker push k8s-master:31320 / nginx:1.17
上記のコマンドの出力は以下のようになります:
以下のdockerコマンドを実行して、nginxがプライベートリポジトリにアップロードされているかどうかを確認します。
[[email protected]〜] $ sudo docker image ls | grep -inginxnginx最新の7e4d58f0e5f32週間前133MBk8s-master:31320 / nginx1.17週間前]7e4d58f0e5次に、nginxベースのデプロイをデプロイし、yamlファイルでイメージのパスをプライベートDockerレジストリとして指定します。例を以下に示します:
[[email protected]〜] $ vi nginx-test-deployment.yamlapiVersion:apps / v1kind:Deploymentmetadata:name:nginx-test-deployment labels:app:nginxspec:replicas:3セレクター:matchLabels:app:nginx template :メタデータ:ラベル:アプリ:nginx仕様:コンテナ:-名前:nginx-1-17画像:k8s-master:31320 / nginx:1.17ポート:-containerPort:80ファイルを保存して閉じます
次のkubectlコマンドを実行します
[[email protected]〜] $ kubectl create -f nginx-test-deployment.yamldeployment.apps / nginx-test-deployment created [[email protected]〜] $ kubectl get deploys nginx-test-deploymentNAME-READY TO-DATE AVAILABLE AGEnginx-test-deployment 3/3 3 13s [[email protected]〜] $ [[email protected]〜] $ kubectl get pods | grepnginx-test-deploymentnginx-test-deployment-f488694b5-2rvmv1/1実行中080snginx-test-deployment-f488694b5-8kb6c1/1 / 1 xl 80メールで保護]〜] $「kubectldescribe」コマンドを使用してポッドを記述し、イメージパスを確認してみてください
$ kubectl describe pod nginx-test-deployment-f488694b5-2rvmv上記のコマンドの出力は、
になります。
上記の出力は、コンテナのイメージパスがプライベートDockerレジストリであることを確認しているため、nginxイメージがプライベートレジストリからダウンロードされたことを意味します。この記事の内容は以上です。これらの手順が、KubernetesクラスターでプライベートDockerレジストリをセットアップするのに役立つことを願っています。以下のコメントセクションでフィードバックやコメントを共有してください。
また読む : Google Cloud Platform(GCP)でKubernetesクラスタを設定する方法
また読む :KubernetesでNGINXIngressControllerを設定する方法
Docker