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

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

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

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

随着掌舵3的出现,Helm项目正在弃用稳定的存储库。截至2019年11月,没有新的图表被接受稳定的随着图表所有者过渡到个人回购。这个过渡期现在已经结束了稳定的repos已经从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使用最新的作者认可的赫尔姆图。

随着稳定的存储库几乎已经过时了,它不再是已知好的Helm图表的一站式来源。NGINX现在会提示你添加ingress-nginx分别到Helm客户端:

美元添加ingress-nginx https://kubernetes.github.io/ingress-nginx

如果没有中央存储库,您需要执行一个单独的舵手回购每次你需要维护一个不同的K8s应用程序。

有没有更好的办法?

在ChartCenter中进入NGINX控制器

JFrog ChartCenter是一个免费的舵图中央仓库它的建立是为了帮助Helm社区找到不可变的、安全的、可靠的图表,并有一个单一的事实来源来代理来自一个位置的所有图表。它可以作为一个中央舵机仓库因此,您不必添加许多公共Helm存储库,而只需使用一个。

通过ChartCenter,有超过30,000个版本的Helm图表可用,许多流行的应用程序图表-包括NGINX入口控制器-在其主页上有特色,所以你可以方便地找到它们。

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

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

使用ChartCenter

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

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

将您的Helm客户端设置为使用ChartCenter存储库作为您的单一中心位置来使用图表:

美元Helm repo添加中心https://repo.chartcenter.io美元Helm回购更新

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

现在我们来检查一下nginx-ingressingress-nginx来自掌舵客户端的图表:

美元Helm search repo center/stable/nginx-ingress名称图表版本应用版本说明center/stable/nginx- Ingress 1.41.2 v0.34.1 nginx Ingress控制器使用ConfigMap…美元Helm search repo center/kubernetes-ingress-nginx/ingress-nginx名称图表版本应用版本说明center/ Kubernetes - Ingress - NGINX / Ingress - NGINX 2.11.2 0.34.1 Kubernetes使用NGINX的入口控制器…

很好,我们看到的图表版本与我们在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. shyaml LB_STATIC_IP=35.197.192.35 generatevalvalues () {cat << EOF > "${VALUES_FILE}" #覆盖nginx-ingress控制器的值:##使用主机端口80和443 daemonset: useHostPort: true kind: daemonset服务:##为LoadBalancer设置静态IP loadBalancerIP: ${LB_STATIC_IP} externalTrafficPolicy: Local stats: enabled: true metrics: enabled:true EOF} generatevalvalues 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不存在。现在正在安装。NAME: nginx-ingress最后部署:Mon Aug 10 17:27:13 2020 NAMESPACE: nginx-ingress STATUS:已部署REVISION: 1 TEST SUITE:无备注:nginx-ingress控制器已安装。LoadBalancer IP可用可能需要几分钟的时间。您可以通过执行'kubectl——namespace nginx- Ingress get services -o wide -w nginx- Ingress -controller'查看状态一个使用控制器的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如果入口启用了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 - latest可用节点选择器年龄守护进程。apps/nginx-ingress-controller 1 10 10 10 s NAME READY - updated AVAILABLE AGE部署。apps/nginx-ingress-default-backend 0/1 0 0 s NAME期望当前就绪年龄的复制集。Apps /nginx-ingress-default-backend-5b967cf596

让我们检查一下豆荚和服务:

美元Kubectl -n nginx-ingress get pods名称READY STATUS重启AGE nginx-ingress-controller-rrsl9 1/1运行0 78s nginx-ingress-default-backend-5b967cf596-wrrfl 1/1运行0 78s $Kubectl -n nginx-ingress获取SVC名称类型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图表

让我们尝试使用最新的图表来升级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. confyaml LB_STATIC_IP=35.197.192.35 generatevalvalues () {cat << EOF > "${VALUES_FILE}" #覆盖ingress-nginx控制器的值:##使用主机端口80和443 hostPort: enabled: true kind: DaemonSet服务:##为LoadBalancer设置静态IP loadBalancerIP: ${LB_STATIC_IP} externalTrafficPolicy: Local stats: enabled: true metrics: enabled: true admissionWebhooks: enabled: false defaultBackend: enabled:true EOF} generatevalvalues 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最后部署:星期一8月10日18:00:31 2020 NAMESPACE: nginx-ingress STATUS:已部署REVISION: 2 TEST SUITE:无备注:已经安装了ingress-nginx控制器。LoadBalancer IP可用可能需要几分钟的时间。你可以通过命令kubectl——namespace nginx-ingress get services -o wide -w nginx-ingress- 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名称准备状态重启AGE pod/nginx-ingress-controller-rrsl9 1/1终止0 33m pod/nginx-ingress-default-backend-5b967cf596-wrrfl 0/1终止0 33m pod/nginx-ingress-ingress-nginx-controller-f9ztr 0/1等待0 5s pod/nginx-ingress-ingress-nginx-defaultbackend-845f7cfd46-56grw 1/1运行0 5s名称类型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-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 - AVAILABLE NODE SELECTOR AGE daemonset。apps/nginx-ingress-ingress-nginx-controller 1 1 0 0 0 6s NAME READY - updated AVAILABLE AGE部署。apps/nginx-ingress-ingress-nginx-defaultbackend 1/1 1 1 1 s NAME期望当前就绪年龄的复制集。Apps /nginx-ingress-ingress-nginx-defaultbackend-845f7cfd46 1 1 1 1 6s

现在让我们检查一下pod和服务:

美元Kubectl -n nginx-ingress get pods名称READY STATUS重启AGE nginx-ingress-ingress-nginx-controller-f9ztr 0/1运行0 34s nginx-ingress-ingress-nginx-defaultbackend-845f7cfd46- 56grow 1/1运行0 34s $Kubectl -n nginx-ingress获取SVC名称类型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正在更新,我们看到两个服务,一个是旧的,一个是新的。

让我们运行Kubectl -n nginx-ingress获取SVC再次:

美元Kubectl -n nginx-ingress获取SVC名称类型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-ingress-nginx-defaultbackend ClusterIP 10.242.11.112 80/TCP 3m25s

,旧服务被删除,新服务通过运行创建执掌升级不要在kubectl中使用任何其他魔法。当然,由于需要为新服务创建新的负载平衡器,更换服务时预计会出现一些停机时间。

谢谢,祝你好运

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

幸运的是,你的其他K8s应用程序也会同样顺利地过渡到个人图表仓库。使用ChartCenter因为您的中央Helm图表存储库可以帮助您进行这些更新。

安格尔快乐