如何使用Helm在Silicon Cloud Kubernetes上设置Nginx Ingress

导语

Kubernetes的Ingress可灵活地将来自集群外部的流量路由到内部的Kubernetes服务。Ingress资源是Kubernetes中定义HTTP和HTTPS流量路由规则到服务的对象。要使其生效,必须有一个Ingress控制器来实现规则,通过接受流量(通常通过负载均衡器)并将其路由到适当的服务。大多数Ingress控制器只使用一个全局负载均衡器来处理所有的Ingress,这比为每个要暴露的服务创建一个负载均衡器更高效。

Helm是用于管理Kubernetes的软件包管理器。在Kubernetes中使用Helm Charts可以提供配置性和生命周期管理,用于更新、回滚和删除Kubernetes应用程序。

在本指南中,您将使用Helm设置Kubernetes维护的Nginx Ingress Controller。然后,您将创建一个Ingress资源,将流量从您的域名路由到示例Hello World后端服务。一旦设置了Ingress,您将向集群安装Cert Manager,以自动提供Let’s Encrypt TLS证书来保护您的Ingresses。

如果您正在寻找一种托管的Kubernetes主机服务,那么请查看我们专为增长而构建的简单、托管的Kubernetes服务。

先决条件

  • A Kubernetes cluster above version 1.20, set up with your connection configuration configured as the kubectl default. This setup will use a Silicon Cloud Kubernetes cluster with three nodes, but you could also create a cluster manually. To create a Kubernetes cluster in the Silicon Cloud Cloud Panel, see our Kubernetes Quickstart.
  • The kubectl command-line tool installed in your local environment and configured to connect to your cluster. You can read more about installing kubectl in the official documentation. If you are using a Silicon Cloud Kubernetes cluster, instructions on how to configure kubectl are in the Connect to your Cluster section when you create your cluster, and you can also refer to the How to Connect to a Silicon Cloud Kubernetes Cluster docs.
  • The Silicon Cloud command-line client, doctl, installed on your machine. See How To Use doctl for more information on using doctl.
  • The Helm 3 package manager available in your development environment. Complete Step 1 of the How To Install Software on Kubernetes Clusters with the Helm 3 Package Manager tutorial.
  • A fully registered domain name with two available A records. This tutorial will use hw1.your_domain and hw2.your_domain throughout. You can purchase a domain name on Namecheap, get one for free on Freenom, or use the domain registrar of your choice. These A records will be directed to a Load Balancer that you will create in Step 2.

步骤一:建立“Hello World”部署

在部署Nginx Ingress之前,您将部署一个名为hello-kubernetes的“Hello World”应用程序,以便有一些服务可以通过路由发送流量。为了确认Nginx Ingress在接下来的步骤中正常工作,您将部署两次,每次使用不同的欢迎消息,在您从浏览器访问时将显示。

您将在本地计算机上存储部署配置。如果您愿意,您还可以创建一个目录,用于存储此教程中的配置。第一个部署配置文件将命名为hello-kubernetes-first.yaml。请使用您喜欢的文本编辑器创建它。

  1. nano hello-kubernetes-first.yaml

 

请加入以下的内容:

你好,Kubernetes-首先.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes-first
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-kubernetes-first
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes-first
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-kubernetes-first
  template:
    metadata:
      labels:
        app: hello-kubernetes-first
    spec:
      containers:
      - name: hello-kubernetes
        image: paulbouwer/hello-kubernetes:1.10
        ports:
        - containerPort: 8080
        env:
        - name: MESSAGE
          value: Hello from the first deployment!

这个配置定义了一个部署(Deployment)和一个服务(Service)。部署由三个副本的paulbouwer/hello-kubernetes:1.7镜像和一个名为MESSAGE的环境变量组成(当您访问应用程序时,您会看到它的值)。这里定义的服务旨在在集群内部将部署公开在80端口。

保存并关闭文件。

然后,在Kubernetes中运行以下命令来创建hello-kubernetes应用的第一个变体。

  1. kubectl create -f hello-kubernetes-first.yaml

 

-f选项指示create命令使用文件hello-kubernetes-first.yaml。

您将收到以下输出:

Output

service/hello-kubernetes-first created deployment.apps/hello-kubernetes-first created

运行以下命令以验证服务的创建。

  1. kubectl get service hello-kubernetes-first

 

输出将会是以下内容:

Output

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-kubernetes-first ClusterIP 10.245.124.46 <none> 80/TCP 7s

你会发现新创建的Service有一个分配的ClusterIP,这意味着它正常工作。所有发送到它的流量将被转发到选定的8080端口上的Deployment。现在你已经部署了hello-kubernetes应用的第一个变体,接下来你将处理第二个。

创建一个名为hello-kubernetes-second.yaml的新文件。

  1. nano hello-kubernetes-second.yaml

 

请添加以下行:

你好,kubernetes-second.yaml。
apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes-second
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-kubernetes-second
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes-second
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-kubernetes-second
  template:
    metadata:
      labels:
        app: hello-kubernetes-second
    spec:
      containers:
      - name: hello-kubernetes
        image: paulbouwer/hello-kubernetes:1.10
        ports:
        - containerPort: 8080
        env:
        - name: MESSAGE
          value: Hello from the second deployment!

这个变体与之前的配置具有相同的结构。为了避免冲突,您需要改变用于部署和服务名称的名称。同时,您还需要更新将在浏览器中加载的信息的值。

保存并关闭文件。

现在使用下面的命令在Kubernetes中创建它:

  1. kubectl create -f hello-kubernetes-second.yaml

 

输出将是:

Output

service/hello-kubernetes-second created deployment.apps/hello-kubernetes-second created

通过列出所有的服务来验证第二个服务是否正常运行。

  1. kubectl get service

 

输出将类似于这个:

Output

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-kubernetes-first ClusterIP 10.245.124.46 <none> 80/TCP 49s hello-kubernetes-second ClusterIP 10.245.254.124 <none> 80/TCP 10s kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 65m

hello-kubernetes-first和hello-kubernetes-second都被列出来了,这意味着Kubernetes已经成功创建了它们。

在测试过程中,您创建了两个 hello-kubernetes 应用的部署及其相应的服务。每个部署规范中都设置了不同的消息,以便在测试中进行区分。接下来,您将安装 Nginx Ingress Controller。

第二步 – 安装Kubernetes Nginx Ingress控制器

现在您将使用Helm安装Kubernetes维护的Nginx Ingress控制器。

Nginx Ingress Controller由一个Pod和一个Service组成。Pod运行Controller,它会不断轮询集群的API服务器上的/ingresses端点,以获取可用的Ingress资源的更新。Service的类型是LoadBalancer。由于您将其部署到Silicon Cloud Kubernetes集群,集群将自动创建一个Silicon Cloud负载均衡器,通过该负载均衡器将所有外部流量流向Controller。然后,Controller将根据Ingress资源中定义的规则,将流量路由到适当的Services。

只有负载均衡器服务才知道自动创建的负载均衡器的IP地址。一些应用程序(例如ExternalDNS)需要知道其IP地址,但只能读取Ingress的配置。在helm安装期间,可以通过将controller.publishService.enabled参数设置为true来配置控制器在每个Ingress上发布IP地址。建议启用此设置以支持可能依赖负载均衡器的IP地址的应用程序。

要将Nginx Ingress Controller安装到您的集群中,首先需要通过运行以下命令将其存储库添加到Helm中:

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

 

结果将是:

Output

“ingress-nginx” has been added to your repositories

更新你的系统,使得Helm知道其中包含的内容。

  1. helm repo update

 

可能需要一点时间来加载。

Output

Hang tight while we grab the latest from your chart repositories… …Successfully got an update from the “ingress-nginx” chart repository Update Complete. ⎈Happy Helming!⎈

最后,运行以下命令来安装Nginx ingress:

  1. helm install nginx-ingress ingress-nginx/ingress-nginx –set controller.publishService.enabled=true

 

使用以下命令从稳定图表存储库安装 Nginx Ingress Controller,将 Helm 发布命名为 nginx-ingress,并将 publishService 参数设置为 true。

一旦程序运行完毕,您将会收到一个类似如下的输出(此输出已被截断)。

Output

NAME: nginx-ingress LAST DEPLOYED: Thu Dec 1 11:40:28 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: …

Helm在安装图表的过程中,已将其所创建的资源记录在Kubernetes中。

运行此命令以观察负载均衡器变为可用状态:

  1. kubectl –namespace default get services -o wide -w nginx-ingress-ingress-nginx-controller

 

这个命令从默认命名空间获取Nginx Ingress服务的信息并输出,但命令不会立即退出。使用-w参数后,当发生变化时,它会监视并刷新输出。

当等待负载均衡器变得可用时,您可能会收到一个挂起的响应。

Output

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx-ingress-ingress-nginx-controller LoadBalancer 10.245.3.122 <pending> 80:30953/TCP,443:30869/TCP 36s …

过一段时间后,您新创建的负载均衡器的IP地址将会显示出来。

Output

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx-ingress-ingress-nginx-controller LoadBalancer 10.245.3.122 167.99.16.184 80:30953/TCP,443:30869/TCP 2m29s …

接下来,您需要确保通过A记录将您的两个域名指向负载均衡器。这是通过您的DNS提供商完成的。要在Silicon Cloud上配置您的DNS记录,请参阅《如何管理DNS记录》。

你已经安装了由Kubernetes社区维护的Nginx Ingress。它将把HTTP和HTTPS流量从负载均衡器路由到在Ingress资源中配置的适当后端服务。下一步,你将使用Ingress资源来暴露hello-kubernetes应用程序的部署。

第三步 – 使用 Ingress 来暴露应用程序

现在你要创建一个Ingress资源,并使用它来将hello-kubernetes应用的部署暴露在你期望的域名下。然后你将通过浏览器访问来测试它。

使用编辑器创建一个名为hello-kubernetes-ingress.yaml的文件,并将Ingress存储在其中。

  1. nano hello-kubernetes-ingress.yaml

 

在你的文件中添加以下几行内容:

你好,Kubernetes Ingress 的配置文件 hello-kubernetes-ingress.yaml。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-kubernetes-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: "hw1.your_domain_name"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-kubernetes-first
            port:
              number: 80
  - host: "hw2.your_domain_name"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-kubernetes-second
            port:
              number: 80

您可以通过命名为hello-kubernetes-ingress的Ingress资源来定义。然后,您可以指定两个主机规则,将hw1.your_domain路由到hello-kubernetes-first服务,并将hw2.your_domain路由到第二个部署(hello-kubernetes-second)的服务。

请记得将高亮颜色的域名替换为您自己的,然后保存并关闭文件。

通过运行以下命令在Kubernetes中创建它:

  1. kubectl apply -f hello-kubernetes-ingress.yaml

 

您现在可以在浏览器中导航到 hw1.your_domain。首次部署将会加载。

Hello Kubernetes - First Deployment

第二个变量(hw2.your_domain)将显示不同的消息。

Hello Kubernetes - Second Deployment

您已验证过,Ingress Controller正确地将请求路由到两个不同的服务,这两个服务来自于您的两个域名。

你已经创建并配置了一个Ingress资源,以便在你的域名上提供hello-kubernetes应用程序的部署。接下来,你将设置Cert-Manager来使用来自Let’s Encrypt的免费TLS证书来保护你的Ingress资源。

第四步 – 使用Cert-Manager保护入口

为了保护您的进入资源,您需要安装Cert-Manager,并为生产环境创建一个ClusterIssuer,并修改Ingress的配置以使用TLS证书。安装和配置完成后,您的应用程序将在HTTPS背后运行。

ClusterIssuers是Kubernetes中的Cert-Manager资源,用于为整个集群提供TLS证书。ClusterIssuer是一种特定类型的发行者。

在使用Helm将Cert-Manager安装到您的集群之前,您需要为其创建一个命名空间。

  1. kubectl create namespace cert-manager

 

您需要将Jetstack Helm存储库添加到Helm中,该存储库托管Cert-Manager图表。要执行此操作,请运行以下命令。

  1. helm repo add jetstack https://charts.jetstack.io

 

Helm 将返回以下输出:

Output

“jetstack” has been added to your repositories

然后,更新Helm的图表缓存。

  1. helm repo update

 

更新可能需要一点时间。

Output

Hang tight while we grab the latest from your chart repositories… …Successfully got an update from the “ingress-nginx” chart repository …Successfully got an update from the “jetstack” chart repository Update Complete. ⎈Happy Helming!⎈

最后,通过运行以下命令将Cert-Manager安装到cert-manager命名空间中。

  1. helm install cert-manager jetstack/cert-manager –namespace cert-manager –version v1.10.1 –set installCRDs=true

 

在此命令中,您还需要将installCRDs参数设置为true,以便在Helm安装期间安装cert-manager的CustomResourceDefinition清单。在撰写本文时,v1.10.1是最新版本。您可以参考ArtifactHub查找最新的版本号。

你将收到以下的输出结果:

Output

NAME: cert-manager LAST DEPLOYED: Wed Nov 30 19:46:39 2022 NAMESPACE: cert-manager STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: cert-manager v1.10.1 has been deployed successfully! …

输出表明安装成功。

上面显示的输出(已截断)的注释说明您需要设置发行者以发行TLS证书。

现在您将创建一个用于发布Let’s Encrypt证书的工具,并将其配置保存在名为production_issuer.yaml的文件中。创建并打开这个文件。

  1. nano production_issuer.yaml

 

请添加以下内容:

生产_发行者.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # Email address used for ACME registration
    email: your_email_address
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Name of a secret used to store the ACME account private key
      name: letsencrypt-prod-private-key
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
    - http01:
        ingress:
          class: nginx

这个配置定义了一个 ClusterIssuer,它联系 Let’s Encrypt 以发行证书。你需要将 your_email_address 替换为你的电子邮箱地址,以便接收有关证书安全性和过期的任何通知。

保存并关闭文件。

使用kubectl进行部署。

  1. kubectl apply -f production_issuer.yaml

 

你将收到以下的输出结果。

Output

clusterissuer.cert-manager.io/letsencrypt-prod created

安装了Cert-Manager后,你可以准备将证书引入到之前步骤中定义的Ingress资源中。打开hello-kubernetes-ingress.yaml进行编辑。

  1. nano hello-kubernetes-ingress.yaml

 

请添加这些标记的句子。

添加标记的句子。

你好,Kubernetes入口配置文件。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-kubernetes-ingress
annotations:
  kubernetes.io/ingress.class: nginx
  cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - hw1.your_domain
    - hw2.your_domain
    secretName: hello-kubernetes-tls
  rules:
  - host: "hw1.your_domain_name"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-kubernetes-first
            port:
              number: 80
  - host: "hw2.your_domain_name"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-kubernetes-second
            port:
              number: 80

在规范下的tls块定义了Secret将存储您网站的证书(列在hosts下),这是由letsencrypt-prod ClusterIssuer发行的。对于您创建的每个Ingress,secretName必须不同。

请记得将hw1.your_domain和hw2.your_domain替换为您自己的域名。完成编辑后,请保存并关闭文件。

通过运行以下命令,重新将此配置应用到您的集群中。

  1. kubectl apply -f hello-kubernetes-ingress.yaml

 

您将收到以下输出:

Output

ingress.networking.k8s.io/hello-kubernetes-ingress configured

您需要等待几分钟,让Let’s Encrypt服务器为您的域名发放证书。在此期间,您可以通过检查下列命令的输出来跟踪进度。

  1. kubectl describe certificate hello-kubernetes-tls

 

输出的结尾将类似于这样:

Output

Events: Type Reason Age From Message —- —— —- —- ——- Normal Issuing 2m34s cert-manager-certificates-trigger Issuing certificate as Secret does not exist Normal Generated 2m34s cert-manager-certificates-key-manager Stored new private key in temporary Secret resource “hello-kubernetes-tls-hxtql” Normal Requested 2m34s cert-manager-certificates-request-manager Created new CertificateRequest resource “hello-kubernetes-tls-jnnwx” Normal Issuing 2m7s cert-manager-certificates-issuing The certificate has been successfully issued

当输出的最后一行显示证书已成功颁发时,您可以通过按CTRL + C退出。

在浏览器中导航到您的任一域名。您会发现小锁图标出现在URL旁边,表示您的连接现在是安全的。

在此步骤中,您使用Helm安装了证书管理器Cert-Manager,并创建了一个Let’s Encrypt Cluster Issuer。然后,您更新了Ingress资源,以利用该Issuer来生成TLS证书。最后,您通过在浏览器中导航到其中一个域名,确认HTTPS正常工作。

结论

你已经成功地在你的Silicon Cloud Kubernetes集群上使用Helm设置了Nginx Ingress Controller和Cert-Manager。现在你可以使用Let’s Encrypt TLS证书来保护你的应用程序,并将其暴露在你的域名下,让其可以通过互联网访问。

了解有关Helm软件包管理器的更多信息,请阅读这份关于Helm的介绍。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds