用ChartCenter从“稳定的”Helm Charts Repo迁移NGINX

更新:截至2021年5月1日- ChartCenter中央存储库已被淘汰,所有功能已弃用。有关中心日落的更多信息,请阅读中心弃用博客文章

在过去的四年里,任何想要为Kubernetes部署Ingress NGINX控制器的人都可以找到它的官方Helm图表nginx-ingress稳定的由Helm项目维护的存储库。

这样的日子已经过去了。而且不仅适用于NGINX(最流行的入口控制器,用作反向代理和负载均衡器),而且适用于所有开源K8s应用程序。

随着Helm 3的出现,Helm项目正在贬低稳定的存储库.截至2019年11月,没有新的图表被接受稳定的随着图表所有者过渡到个人回购。这个过渡期现在已经结束稳定的回购已经从Helm Hub摘牌,并将在今年11月正式淘汰。

这对NGINX部署的安装和维护人员意味着什么?首先,NGINX项目现在维护了一个ingress-nginx执掌图表在Kubernetes的GitHub存储库中。任何安装或更新NGINX入口控制器部署的人现在都应该使用这个回购中的图表。

尽管新图表目前部署了相同版本的NGINX应用程序,但它并不完全相同的图表稳定的.这需要在用新图表更新NGINX安装时进行一些调整。

让我们来看看涉及到什么,以及JFrog ChartCenter如何帮助您转换。

中央舵手储存库

稳定的一组Helm图表意味着许多流行的Kubernetes应用程序的官方图表总是可以在中央存储库中找到。你只需添加稳定的回购给Helm客户端:

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

从这个单稳定的存储库,您可以自信地部署nginx-ingress使用最新的作者批准的赫尔姆图表。

随着稳定的存储库几乎是过时的,它不再是一个已知良好的赫尔姆图表的一站式来源。NGINX现在指示你添加ingress-nginx分别给Helm客户:

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

如果没有中央存储库,则需要执行单独的Helm repo添加每次你都需要维护不同的K8s应用程序。

有没有更好的办法?

在ChartCenter中导入NGINX控制器

JFrog ChartCenter是一个免费的舵舵图中央存储库它的建立是为了帮助Helm社区找到不可变的、安全的、可靠的图表,并有一个真实的来源来代理来自一个位置的所有图表。它可以作为一个中央赫尔姆储存库从Helm客户端,所以您不需要添加许多公共Helm存储库,只需使用一个即可。

通过ChartCenter,有超过30,000个版本的Helm图表可用,许多流行的应用程序图表(包括NGINX Ingress Controller)都在其主页上,所以你可以方便地找到它们。

通过ChartCenter的搜索,我们可以找到稳定的执掌图表nginx-ingress

我们也可以定位当前的图表ingress-nginx在ChartCenter:

使用ChartCenter

一旦我们将ChartCenter添加到Helm客户端,我们就可以将其用作所有Helm图表的中央存储库,包括我们将在演示中使用的NGINX存储库。

步骤1:添加ChartCenter作为Helm存储库

设置您的Helm客户端使用ChartCenter存储库作为您的单一中心位置,从以下地方消费图表:

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

步骤2:使用ChartCenter作为存储库

现在我们来检查nginx-ingress而且ingress-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 UI中看到的一样。

在这里,您可以看到使用一个中央Helm存储库来存储来自不同Helm存储库的图表是多么容易。

安装nginx-ingress Helm chart

为了测试升级,我们首先需要安装一个nginx-ingress图表。我将使用一个小型shell脚本nginx-ingress.sh它创建一个覆盖值文件,然后安装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和服务:

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 Ingress Controller pod up了,它的服务被负载均衡器分配了外部IP。

好的,我们得到了nginx-ingress图表已成功安装,让我们继续升级它。

升级到ingress-nginx Helm图表

让我们尝试升级NGINX入口控制器使用更当前的图表..

这次我们将再次使用不同名称的shell脚本ingress-nginx.sh
ingress-nginx.sh具有不同的图表名称和版本,相同的Helm发布名称和相同的负载均衡器静态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.sh有一些不同nginx-ingress.sh

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

由于一些值被更改为:

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

还有一些额外的元素:

admissionWebhooks: enabled: false defaultBackend: enabled: true

在这个升级场景中,我们没有使用admissionWebhooks所以我们禁用它,然后启用它defaultBackend就像在nginx-ingress图表默认启用。当然,您可以根据需要调整这些值。

让我们运行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

现在让我们来看看豆荚和服务:

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

你看,这些舱正在更新,我们看到两个服务,一个旧的,一个新的。

让我们运行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

,旧的服务被删除,新的服务通过运行被创建执掌升级不用其他魔法对付库贝特尔。当然,由于需要为新服务创建新的负载均衡器,因此在停机期间更换服务是预期的。

谢谢,祝你好运

很简单,对吧?非常感谢NGINX入口控制器图表的维护者在两个不同的图表之间进行无缝升级!

如果运气好的话,你的其他K8s应用程序向个人图表回购的过渡也会同样顺利。使用ChartCenter因为你的中央Helm图表库可以帮助你进行更新。

安格尔快乐