“稳定”なHelm ChartリポジトリからChartCenterでNGINXを移行する

過去4年間,Kubernetes用の入口NGINX控制器をデプロイしたい人は执掌プロジェクトで管理されている稳定的リポジトリで公式の舵图であるnginx-ingressを見けることができました。

ですがもうそんな時代は終わりました。リポジトリはリバースプロキシやロードバランサーとして使用されている最も人気のある入口コントローラーであるNGINXだけでなく,すべてのオープンソースのk8アプリのためのものです。

Helm 3の登場に伴い,Helmプロジェクトは稳定的リポジトリを非推奨としています。2019年11月時点では图所有者が個々のリポジトリに移行していく中で,新規图は稳定的として受入れられませんでした。- - - - - -稳定的リポジトリはHelm Hubから削除され,今年の11月には正式に廃止される予定です。

これはnginxデプロのンストラやメンテナにとって何を意味するのでしょうか?まず最初にNGINXプロジェクトはGitHubリポジトリにKubernetes用に新しいingress-nginx执掌图表を提供しています。NGINX入口控制器のデプロイメントをインストールおよび更新する場合はこのリポジトリの图表を使用してください。

新しい图表は現在,同じバ,ジョンのNGINXアプリを展開しているにもかかわらず,稳定的の图表と同じではありません。このため,新しい图表を使用してNGINXを更新する際には多少の調整が必要になります。

ここではどのような機能があるのか,またJFrog ChartCenterが移行に際してどのようにして役立つのかを見てみましょう。

Helmセントラル·リポジトリ

稳定的な执掌图表は人気のある多数のKubernetesアプリの公式图表を常にセントラル・リポジトリで見つけることができることを意味していました。それはHelmクラアントに稳定的リポジトリを追加するだけです:

Helm repo添加稳定https://kubernetes-charts.storage.googleapis.com/

この単一の稳定的リポジトリから作成者が承認した最新の舵图を使用して間違いなくnginx-ingressをデプロ@ @することができます。

稳定的リポジトリはほぼ陳腐化しているため,既知の执掌图表唯一のソースとしては利用できなくなっています。NGINXはHelmクラアントに個別にingress-nginxを追加するように指示するようになっています:

Helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

セントラル·リポジトリがなければ別のK8sアプリを維持する度に別のHelm repo添加を実行する必要があります。

もっと良い方法はないのでしょうか?

ChartCenterのIngress NGINXコントロ、ラ、

JFrog ChartCenterは执掌コミュニティによって変更不可であり,安全で信頼性の高い图表を見つけ,1つの場所からすべての图表をプロキシするための信頼できる唯一の情報源を持つために構築された無料の舵图セントラル·リポジトリです。执掌クライアントから1つの执掌セントラル・リポジトリとして使用できるので,多数公開されている执掌リポジトリを追加する必要がなく,代わりに1つだけを利用することができます。

30000年ChartCenterを通してバージョン以上の执掌图表が利用可能であり,NGINX入口コントローラーを含む多数の人気のあるアプリ图表がホームページに掲載されているため,容易に検索できます。

ChartCenterから稳定的执掌图表からnginx-ingressを検索可能です:

また,ChartCenterで当前な图表からingress-nginxを見けることもできます。

ChartCenterの利用

一度,ChartCenterを执掌クライアントに追加すると我々のデモで使用するNGINXリポジトリの両方を含む全てを执掌图表セントラル・リポジトリとして使用することができます。

ステップ1:HelmリポジトリとしてChartCenterを追加

执掌クライアントを設定し,ChartCenterリポジトリを単一のセントラルロケーションとして图表が使用できるように設定します:

Helm repo添加中心https://repo.chartcenter.io

Helm repo添加中心https://repo.chartcenter.ioHelm回购更新

ステップ:リポジトリとしてChartCenterを利用

それではhelmクラemcアントからnginx-ingressingress-nginxの图表を確認してみましょう:

Helm search repo center/stable/nginx-ingressNAME CHART VERSION APP版本描述center/stable/nginx- Ingress 1.41.2 v0.34.1使用ConfigMap的nginx Ingress控制器。$Helm search repo center/kubernetes-ingress-nginx/ingress-nginxNAME CHART VERSION APP VERSION DESCRIPTION center/ Kubernetes - Ingress - NGINX / Ingress - NGINX 2.11.2 0.34.1 Kubernetes的入口控制器使用NGINX a…

ChartCenter界面で検索した同一バ,ジョンの图表が表示されます。

そして,ここでは異なる执掌リポジトリからの图表を1つの执掌セントラル・リポジトリで利用することがいかに簡単なのかが分かります。

nginx-ingress Helm chartのaapl .ンスト.ル

アップグレ,ドをテストするためにnginx-ingress图表をンストルする必要があります。小さなシェルスクリプトnginx-ingress.shを使用して,上書き用の值ファescルを作成し,nginx-ingressを▪▪ンスト▪▪ルします。

nginx-ingress.shには图表名,バ,ジョン,ロ,ドバランサ,の固定IPがあります:

# !/bin/bash CHART_NAME="center/stable/nginx-ingress" CHART_VERSION="1.41.2" RELEASE=nginx-ingress NAMESPACE=nginx-ingress VALUES_FILE=nginx-ingress。yaml LB_STATIC_IP=35.197.192.35 generateValues() {cat << EOF > "${VALUES_FILE}" #重写nginx-ingress控制器的值:##使用主机端口80和443 daemonset: useHostPort: true kind: daemonset service: ##为LoadBalancer设置静态IP loadBalancerIP: ${LB_STATIC_IP} externalTrafficPolicy: Local stats: enabled: true metrics: enabled: enabledtrue EOF} generateValues kubectl create ns nginx-ingress || true echo helm upgrade——install ${RELEASE} -n ${NAMESPACE} ${CHART_NAME}——version ${CHART_VERSION} -f ${VALUES_FILE} echo kubectl -n ${NAMESPACE} get all

nginx-ingress.shを実行し,nginx-ingressを:

。/ nginx-ingress.shnamespace/nginx-ingress created Release“nginx-ingress”不存在。现在正在安装。NAME: nginx-ingress LAST DEPLOYED: Mon Aug 10 17:27:13 2020 NAMESPACE: nginx-ingress STATUS: DEPLOYED REVISION: 1 TEST SUITE: None备注:nginx-ingress控制器已经安装。可能需要几分钟,LoadBalancer IP才可用。使用控制器的Ingress示例:apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ Ingress .class: nginx name: example namespace: foo spec: rules: - host: www.example.com http: paths: - backend: serviceName: exampleService servicePort: 80 path: / #仅当Ingress启用TLS时才需要此节:TLS:—hosts:—www.example.com secretName: example-tls如果Ingress启用了TLS,还需要提供一个包含证书和密钥的Secret: apiVersion: v1 kind: Secret metadata: name: example-tls namespace: foo data: TLS。crt: tls。关键字:类型:kubernetes。io/tls NAME READY STATUS重启AGE pod/nginx-ingress-controller-rrsl9 0/1 ContainerCreating 0 1s pod/nginx-ingress-default-backend-5b967cf596-wrrfl 0/1 ContainerCreating 0 1s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginx-ingress-controller LoadBalancer 10.242.2.213 80:30643/TCP,443:31622/TCP 2s service/nginx-ingress-controller-metrics ClusterIP 10.242.10.112 9913/TCP 2s service/nginx-ingress-default-backend ClusterIP 10.242.11.172 80/TCP 2s NAME DESIRED CURRENT READY - up - up - up可用的节点选择器年龄守护进程启动。apps/nginx-ingress-controller 1 1 0 10 0 3s NAME READY updated AVAILABLE AGE部署。apps/nginx-ingress-default-backend 0/1 1 0 2s NAME DESIRED CURRENT READY AGE replicaset。Apps /nginx-ingress-default-backend-5b967cf596 1 1 0 2s

そしてPodとserviceを確認してみましょう:

Kubectl -n nginx-ingress get podsNAME READY STATUS重启AGE nginx-ingress-controller-rrsl9 1/1 Running 0 78s nginx-ingress-default-backend-5b967cf596-wrrfl 1/1 Running 0 78s $Kubectl -n nginx-ingress get SVCNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-controller LoadBalancer 10.242.2.213 35.197.192.35 80:30643/TCP,443:31622/TCP 89s nginx-ingress-controller-metrics ClusterIP 10.242.10.112 9913/TCP 89s nginx-ingress-default-backend ClusterIP 10.242.11.172 80/TCP 89s

NGINX入口コントローラーPodが起動し,ロードバランサーで外部IPが割当てられました。

nginx-ingress图表のンストルが成功したので,アップグレドに移りましょう。

ingress-nginx Helm chartのアップグレ,ド

NGINX入口控制器のアップグレードを最新の图表を利用して実施しましょう。

ingress-nginx.shという名前に変えて今回もシェルスクリプトを実行します。

ingress-nginx.shは图表名とバージョンは異なりますが执掌のリリース名とロードバランサーの静的IPは同じです。

# !/bin/bash CHART_NAME="center/kubernetes-ingress-nginx/ingress-nginx" CHART_VERSION="2.11.1" RELEASE=nginx-ingress NAMESPACE=nginx-ingress VALUES_FILE=ingress-nginx. "yaml LB_STATIC_IP=35.197.192.35 generateValues() {cat << EOF > "${VALUES_FILE}" #覆盖ingress-nginx控制器的值:##使用主机端口80和443 hostPort: enabled: true kind: DaemonSet service: ##为LoadBalancer设置静态IP loadBalancerIP: ${LB_STATIC_IP} externalTrafficPolicy: Local stats: enabled: true metrics: enabled: true admissionWebhooks: enabled: false defaultBackend: enabled: enabledtrue EOF} generateValues echo helm upgrade——install ${RELEASE} -n ${NAMESPACE} ${CHART_NAME}——version ${CHART_VERSION} -f ${VALUES_FILE} echo kubectl -n ${NAMESPACE} get all

ingress-nginx.shnginx-ingress.shといくかの違いがあります:

使用80和443主机端口daemonset: useHostPort: true

いくかの値が変更されました:

controller: ##使用80和443主机端口hostPort: enabled: true kind: DaemonSet

いくかの値が追加されました:

admissionWebhooks: enabled: false defaultBackend: enabled: true

今回のアップグレ,ドシナリオではadmissionWebhooksを使用していないため無効にし,nginx-ingressの图表ではデフォルトで有効になっていますがdefaultBackendを有効にしています。もろん,必要に応じて値を微調整することができます。

ingress-nginx.shを実行し,nginx-ingressをアップグレ,ドしてみましょう:

nginx-ingress版本升级。稳住快乐!NAME: nginx-ingress LAST DEPLOYED: Mon Aug 10 18:00:31 2020 NAMESPACE: nginx-ingress STATUS: DEPLOYED REVISION: 2 TEST SUITE: None备注:ingress-nginx控制器已经安装。可能需要几分钟,LoadBalancer IP才可用。你可以通过运行'kubectl——namespace nginx-ingress get services -o wide -w nginx-ingress- nginx-controller'来查看状态。io / v1beta1:导入元数据注释:kubernetes.io / ingress.class: nginx的名字:示例名称空间:foo规范:规则:主持人:www.example.com http:道路:-后端:名:exampleService servicePort: 80路径:/ #如果TLS是本节只需要启用入口TLS:主机:www.example.com secretName: example-tls如果启用了TLS的入口,一个秘密提供的证书和密钥也必须包含:apiVersion: v1:秘密的元数据:名称:示例-tls namespace: foo data: tls。crt: tls。关键字:类型:kubernetes。io/tls NAME READY STATUS重启AGE pod/nginx-ingress-controller-rrsl9 1/1 Terminating 0 33m pod/nginx-ingress-default-backend-5b967cf596-wrrfl 0/1 Terminating 0 33m pod/nginx-ingress-ingress-nginx-controller-f9ztr 0/1 Pending 0 5s pod/nginx-ingress-ingress-nginx-defaultbackend-845f7cfd46-56grw 1/1 Running 0 5s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginx-ingress-controller LoadBalancer 10.242.2.213 35.197.192.35 80:30643/TCP,443:31622/TCP 33mservice/nginx-ingress-ingress-nginx-controller LoadBalancer 10.242.13.184 80:30601/TCP,443:30644/TCP 6s service/nginx-ingress- nginx-controller-metrics ClusterIP 10.242.12.190 9913/TCP 6s service/nginx-ingress-ingress-nginx-defaultbackend ClusterIP 10.242.11.112 80/TCP 5s NAME DESIRED CURRENT READY - up - up - up - AVAILABLE NODE SELECTOR AGE daemonset。apps/nginx-ingress-ingress-nginx-controller 1 1 0 10 0 6s NAME READY updated AVAILABLE AGE部署。apps/nginx-ingress-ingress-nginx-defaultbackend 1/1 1 1 6s NAME DESIRED CURRENT READY AGE replicaset。Apps /nginx-ingress-ingress-nginx-defaultbackend-845f7cfd46 1 1 16 6s

Podとserviceを確認してみましょう:

Kubectl -n nginx-ingress get podsNAME READY STATUS重启AGE nginx-ingress-ingress-nginx-controller-f9ztr 0/1 Running 0 34s nginx-ingress- nginx-defaultbackend-845f7cfd46-56grw 1/1 Running 0 34s $Kubectl -n nginx-ingress get SVCNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-controller LoadBalancer 10.242.2.213 35.197.192.35 80:30643/TCP,443:31622/TCP 34m nginx-ingress-ingress-nginx-controller LoadBalancer 10.242.13.184 80:30601/TCP,443:30644/TCP 40s nginx-ingress-ingress-nginx-controller-metrics ClusterIP 10.242.12.190 9913/TCP 40s nginx-ingress-ingress-nginx-defaultbackend ClusterIP 10.242.11.112 80/TCP 39s

Podが更新されていて,新旧2のserviceがあります。

Kubectl -n nginx-ingress get SVCを再度,実行してみましょう:

Kubectl -n nginx-ingress get SVCNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-ingress-nginx-controller LoadBalancer 10.242.13.184 35.197.192.35 80:30601/TCP,443:30644/TCP 3m26s nginx-ingress-ingress-nginx-controller-metrics ClusterIP 10.242.12.190 9913/TCP 3m26s nginx-ingress- nginx-defaultbackend ClusterIP 10.242.11.112 80/TCP 3m25s

すると,古い服务は削除され,kubectlを使った他のコマンドを利用せすに执掌升级を実行しただけで新しいserviceが作成されました。もちろん、服务を置換する場合は新しい服务のために新しいロードバランサーを作成する必要があるため,ダウンタイムが発生します。

ありがとう,そして幸運を

2つの異なる图表間のシームレスなアップグレードを実現してくれたNGINX入口コントローラーの图表メンテナーに感謝します。

他のK8sアプリの個々の图表リポジトリへの移行も同様にスム,ズに実施できます。舵图セントラル·リポジトリとしてChartCenterを利用することで,これらを実施することができます。


安格尔快乐