k8s安装nginx Ingress超详细指南 在本全面的 Ingress 指南中,您将学习如何在 Kubernetes上设置 Nginx Ingress控制器 并使用 DNS 配置 Ingress。
目前有两种 Nginx Ingress 控制器。
kubernetes 社区的 Nginx Ingress 控制器
Nginx Inc 开发的 Nginx Ingress 控制器
我们将使用 Kubernetes 社区 Nginx 控制器 。
Ingress & Nginx Ingress 控制器架构 下面是使用 Nginx Ingress 控制器的 Kubernetes Ingress 的高级架构。在本指南中,我们将学习如何在体系结构中构建设置。
先决条件
Kubernetes 集群
Kubectl 已安装并已通过 Kubernetes 集群的身份验证。
对 kubernetes 集群的管理员访问权限。
指向 Ingress 控制器负载均衡器 IP 的有效域。(可选 )
Nginx Ingress 控制器 Kubernetes 清单 本教程中使用的所有 kubernetes 清单都托管在 Github 存储库 中。
您可以按照指南直接部署 YAML 文件。
1 git clone https://github.com/techiescamp/nginx-ingress-controller
首先,我们将通过使用 YAML 清单部署 Nginx 控制器 来了解所有关联的 Kubernetes 对象。一旦我们理解了,我们将使用 Helm 图表进行部署 。
注意 :如果你想了解所有的 Nginx Ingress 控制器对象以及它们之间的关系,我建议你从 repo 中单独创建对象。了解其工作原理后,可以使用单个清单或 helm 图表来部署它。
如果要一次性部署所有对象,请在 termal 中打开克隆的存储库。
cd 进入 manifest 文件夹并执行以下命令。它将部署此博客中介绍的所有清单。
使用清单部署 Nginx Ingress 控制器 我们需要部署以下 Kubernetes 对象才能拥有一个有效的 Nginx 控制器 。
ingress-nginx
命名空间
Nginx 准入控制器 的服务帐户/角色/集群角色
验证 Webhook 配置
用于创建/更新 Webhook CA 捆绑包的作业
Nginx 控制器部署 的服务帐户/角色/集群角色
Nginx 控制器配置图
Nginx 控制器和准入控制器的服务
Ingress 控制器部署
注意 :您可以自己创建所有清单,也可以使用 Github 存储库。但是,我强烈建议您仔细检查每个清单并了解您正在部署的内容。
需要准入控制器和验证 Webhook Kubernetes Admission Controller 是一小段代码,用于在创建 Kubernetes 对象之前对其进行验证或更新。在本例中,它是用于验证 Ingress 对象的准入控制器 。准入控制器代码是侦听8443
端口的 Nginx 控制器的一部分。
为什么需要 Ingress 控制器?
如果没有准入控制器,则可以部署**可能包含错误配置的 **Ingress 对象。错误的配置可能会破坏与 Ingress 控制器关联的所有 Ingress 规则。
使用准入控制器后,如果部署配置错误的 Ingress 对象,则会引发错误。这样,您可以确保您创建的 Ingress 对象具有正确的配置,并且不会破坏路由规则。
以下是 Nginx 的准入控制器的工作方式。
部署 Ingress YAML 时,验证允许会截获请求。
然后,Kubernetes API 根据准入 Webhook 终结点将 Ingress 对象发送到验证准入控制器服务终结点。
Service 将请求发送到端口 8443 上的 Nginx 部署,以验证 ingress 对象。
然后,准入控制器向 k8s API 发送响应。
如果响应有效,API 将创建 ingress 对象。
现在,让我们从为 Ingress 控制器创建 Kubernetes 对象开始。
注意 :在以下各节中,您不必复制和创建 YAML 文件。您可以直接使用存储库中的文件并部署它。我在这里给出了完整的 YAML 以供参考。
创建 Namespace 我们将把所有Nginx控制器对象部署在 ingress-nginx
命名空间中。
1 kubectl create ns ingress-nginx
创建 Admin 控制器角色和服务帐户 我们需要一个具有所需权限的 Role 和 ClusterRole,并绑定到 ingress-nginx-admission
服务帐户。
创建一个名为 admission-service-account.yaml
的文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 --- apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission namespace: ingress-nginx --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: annotations: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission namespace: ingress-nginx rules: - apiGroups: - "" resources: - secrets verbs: - get - create --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission namespace: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ingress-nginx-admission subjects: - kind: ServiceAccount name: ingress-nginx-admission namespace: ingress-nginx --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission rules: - apiGroups: - admissionregistration.k8s.io resources: - validatingwebhookconfigurations verbs: - get - update --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ingress-nginx-admission subjects: - kind: ServiceAccount name: ingress-nginx-admission namespace: ingress-nginx
部署清单
1 kubectl apply -f admission-service-account.yaml
创建验证 Webhook 配置 创建一个名为 validating-webhook.yaml
的文件,并复制以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 --- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission webhooks: - admissionReviewVersions: - v1 clientConfig: service: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io rules: - apiGroups: - networking.k8s.io apiVersions: - v1 operations: - CREATE - UPDATE resources: - ingresses sideEffects: None
创建 ValidatingWebhookConfiguration
1 kubectl apply -f validating-webhook.yaml
部署 Job 更新 Webhook 证书 ValidatingWebhookConfiguration
只在 HTTPS 上有效,所以它需要一个 CA bundle。
我们使用 kube-webhook-certgen 与第一个 job 一起生成 CA 证书包。生成的CA证书存储在一个名为 ingress-nginx-admission
的秘密文件中。
创建一个名为 jobs.yaml
的文件,并复制以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 --- apiVersion: batch/v1 kind: Job metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission-create namespace: ingress-nginx spec: template: metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission-create spec: containers: - args: - create - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc - --namespace=$(POD_NAMESPACE) - --secret-name=ingress-nginx-admission env: - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure securityContext: runAsNonRoot: true runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 kind: Job metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission-patch namespace: ingress-nginx spec: template: metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-admission-patch spec: containers: - args: - patch - --webhook-name=ingress-nginx-admission - --namespace=$(POD_NAMESPACE) - --patch-mutating=false - --secret-name=ingress-nginx-admission - --patch-failure-policy=Fail env: - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure securityContext: runAsNonRoot: true runAsUser: 2000 serviceAccountName: ingress-nginx-admission
创建 jobs
1 kubectl apply -f jobs.yaml
使用以下命令验证 jobs 完成情况。
一旦作业被执行,就可以describe ValidatingWebhookConfigurationand
。
1 kubectl describe ValidatingWebhookConfiguration ingress-nginx-admission
创建 Ingress 控制器角色和服务帐户 创建名为 ingress-service-account.yaml
的文件,并复制以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 --- apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx namespace: ingress-nginx --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx namespace: ingress-nginx rules: - apiGroups: - "" resources: - namespaces verbs: - get - apiGroups: - "" resources: - configmaps - pods - secrets - endpoints verbs: - get - list - watch - apiGroups: - "" resources: - services verbs: - get - list - watch - apiGroups: - networking.k8s.io resources: - ingresses verbs: - get - list - watch - apiGroups: - networking.k8s.io resources: - ingresses/status verbs: - update - apiGroups: - networking.k8s.io resources: - ingressclasses verbs: - get - list - watch - apiGroups: - "" resourceNames: - ingress-controller-leader resources: - configmaps verbs: - get - update - apiGroups: - "" resources: - configmaps verbs: - create - apiGroups: - "" resources: - events verbs: - create - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx namespace: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ingress-nginx subjects: - kind: ServiceAccount name: ingress-nginx namespace: ingress-nginx --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx rules: - apiGroups: - "" resources: - configmaps - endpoints - nodes - pods - secrets - namespaces verbs: - list - watch - apiGroups: - "" resources: - nodes verbs: - get - apiGroups: - "" resources: - services verbs: - get - list - watch - apiGroups: - networking.k8s.io resources: - ingresses verbs: - get - list - watch - apiGroups: - "" resources: - events verbs: - create - patch - apiGroups: - networking.k8s.io resources: - ingresses/status verbs: - update - apiGroups: - networking.k8s.io resources: - ingressclasses verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ingress-nginx subjects: - kind: ServiceAccount name: ingress-nginx namespace: ingress-nginx
部署清单
1 kubectl apply -f ingress-service-account.yaml
创建 Configmap 有了configmap,你可以自定义 Nginx 的设置。例如,可以设置自定义 headers 和大多数 Nginx 设置。
有关所有支持的配置,请参阅官方社区文档 。
创建名为 services.yaml
的文件并复制以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-controller namespace: ingress-nginx spec: externalTrafficPolicy: Local ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - appProtocol: http name: http port: 80 protocol: TCP targetPort: http - appProtocol: https name: https port: 443 protocol: TCP targetPort: https selector: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx type: LoadBalancer --- apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-controller-admission namespace: ingress-nginx spec: ports: - appProtocol: https name: https-webhook port: 443 targetPort: webhook selector: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx
创建服务。
1 kubectl apply -f services.yaml
ingress-nginx-controller
service 在正在部署的相应云平台中创建负载均衡器 。
您可以使用以下命令获取负载均衡器 IP/DNS。
1 kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller
注意 :对于每个云提供商,您可以使用特定的注释将静态 IP 地址和其他配置映射到 Loadbalancer。
创建 Ingress Controller 部署 创建名为 deployment.yaml
的文件并复制以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 --- apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-controller namespace: ingress-nginx spec: minReadySeconds: 0 revisionHistoryLimit: 10 selector: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx template: metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx spec: containers: - args: - /nginx-ingress-controller - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller - --election-id=ingress-controller-leader - --controller-class=k8s.io/ingress-nginx - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller - --validating-webhook=:8443 - --validating-webhook-certificate=/usr/local/certificates/cert - --validating-webhook-key=/usr/local/certificates/key env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so image: registry.k8s.io/ingress-nginx/controller:v1.9.5 imagePullPolicy: IfNotPresent lifecycle: preStop: exec: command: - /wait-shutdown livenessProbe: failureThreshold: 5 httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 name: controller ports: - containerPort: 80 name: http protocol: TCP - containerPort: 443 name: https protocol: TCP - containerPort: 8443 name: webhook protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 resources: requests: cpu: 100m memory: 90Mi securityContext: allowPrivilegeEscalation: true capabilities: add: - NET_BIND_SERVICE drop: - ALL runAsUser: 101 volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert readOnly: true dnsPolicy: ClusterFirst nodeSelector: kubernetes.io/os: linux serviceAccountName: ingress-nginx terminationGracePeriodSeconds: 300 volumes: - name: webhook-cert secret: secretName: ingress-nginx-admission
创建部署。
1 kubectl apply -f deployment.yaml
要确保部署正常工作,请检查容器状态。
1 kubectl get pods -n ingress-nginx
验证 Ingress Controller 部署 您可以使用服务创建的 LoadBlancer 终结点验证 Ingress 控制器部署。
Nginx Ingress 控制器具有默认后端。Ingress 中没有条目的所有请求都将转到此默认后端。
我们将使用默认后端验证控制器。
获取 Loadbalancer 终端节点,尝试使用它。您应该收到 404 错误,如下所示。
现在尝试使用 curl 访问 /heathz url,如下所示。你应该得到 200 的回复。将 替换为您的 Loadbalancer 终端节点。
1 curl http://<LOAD-BALANCER-ENDPOINT>/healthz
Nginx Ingress Controller Helm 部署 如果您是 Helm 用户,则可以使用社区 Helm 图表部署 Ingress Controller。 ValidatingWebhookConfiguration 默认处于禁用状态。
部署 helm 图表。如果 ingress-nginx
不存在,它将创建命名空间。
1 2 3 helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx --create-namespace
验证 helm 版本。
1 helm list -n ingress-nginx
若要清理资源,请卸载该版本。
1 helm uninstall ingress-nginx -n ingress-nginx
将域名映射到 Nginx Ingress Loadbalancer IP Ingress 的主要目标是接收运行在 Kubernetes 上的服务的外部流量 。理想情况下,在项目中,DNS 将映射到 Ingress 控制器负载均衡器 IP。
这可以通过具有您拥有的域名的相应 DNS 提供商 来完成。
信息 :对于面向 Internet 的应用,它将是指向负载均衡器的公共 IP 的公共 DNS。如果是内部应用,则它将是映射到专用负载均衡器 IP 的组织专用 DNS。
单个 DNS 映射 您可以将单个域作为 A 记录直接映射到负载均衡器 IP 。使用此选项,Ingress 控制器只能有一个域和多个基于路径的流量路由。
例如
1 www.example.com --> Loadbalancer IP
您还可以使用此模型进行基于路径的路由。
几个例子,
1 2 3 4 http://www.example.com/app1 http://www.example.com/app2 http://www.example.com/app1/api http://ww.example.com/app2/api
通配符 DNS 映射 如果将通配符 DNS 映射到负载均衡器 ,则可以通过 Ingress 获得动态 DNS 终结点。
在 DNS 记录中添加通配符条目后,需要在 Ingress 对象中提及所需的 DNS,Nginx Ingress 控制器将负责将其路由到所需的服务终结点。
例如,检查以下两个映射。
1 2 *.example.com --> Loadbalancer IP *.apps.example.com --> Loadbalancer IP
这样,**您可以通过单个 **Ingress 控制器拥有多个动态子域 ,并且每个 DNS 都可以拥有自己的基于路径的路由。
几个例子,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 http://demo1.example.com/api http://demo1.example.com/api/v1 http://demo1.example.com/api/v2 http://grafana.apps.example.com http://prometheus.apps.example.com http://demo2.apps.example.com/api http://demo2.apps.example.com/api/v1 http://demo2.apps.example.com/api/v2
出于演示目的,我已将通配符 DNS 映射到 LoadBalancer IP 。根据您的 DNS 提供商,您可以添加 DNS 记录。
下图显示了我用于此博客演示的 DNS 记录。我使用了 EKS ,因此我有一个网络负载均衡器终端节点的 DNS, 而不是 Loadnbalacer IP,它将是一个 CNAME。在 GKE 的情况下,您将获得一个 IP,在这种情况下,您需要创建一个 A 记录。
部署 Demo 应用程序 为了测试 Ingress ,我们将部署一个演示应用程序,并向其添加一个 ClusterIp 服务。此应用程序只能在群集中访问,而不能进入。
**步骤1: **创建名为 dev 的命名空间
1 kubectl create namespace dev
步骤2: 创建名为hello-app.yaml的文件,并复制以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 apiVersion: apps/v1 kind: Deployment metadata: name: hello-app namespace: dev spec: selector: matchLabels: app: hello replicas: 2 template: metadata: labels: app: hello spec: containers: - name: hello image: "gcr.io/google-samples/hello-app:2.0"
步骤3: 使用 kubectl 创建部署
1 kubectl create -f hello-app.yaml
检查部署状态。
1 kubectl get deployments -n dev
步骤5: 创建一个名为并复制以下内容的文件并保存该文件。hello-app-service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 apiVersion: v1 kind: Service metadata: name: hello-service namespace: dev labels: app: hello spec: type: ClusterIP selector: app: hello ports: - port: 80 targetPort: 8080 protocol: TCP
步骤6: 使用 kubectl 创建服务。
1 kubectl create -f hello-app-service.yaml
为应用程序创建 Ingress 对象 现在,让我们创建一个 Ingress 对象,以使用 DNS 访问我们的 hello 应用 。Ingress 对象只不过是一组路由规则。
如果你想知道ingress对象是如何连接到 Nginx 控制器的,ingress 控制器 pod 连接到 ingress API来检查规则,并相应地更新它的 nginx .conf。
因为我用 DNS 提供程序映射了通配符DNS (*.apps.mlopshub.com),所以我将使用 demo.apps.mlopshub.com 指向 hello app 服务。
步骤1: 创建一个名为ingress.yaml文件
步骤2: 复制以下内容并保存文件。
替换demo.apps.mlopshub.com``dev``dev
为您的域名。此外,我们在命名空间中创建此Ingress 对象,因为 hello 应用正在命名空间中运行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress namespace: dev spec: ingressClassName: nginx rules: - host: "demo.apps.mlopshub.com" http: paths: - pathType: Prefix path: "/" backend: service: name: hello-service port: number: 80
步骤3: 描述为检查配置而创建的 Ingress 对象。
1 kubectl describe ingress -n dev
现在,如果我尝试访问域demo.apps.mlopshub.com
,我将能够访问hello应用程序,如下所示。(您应该将其替换为您的域名)
您可能会在浏览器中遇到 https 错误。在这种情况下,您可以使用 curl 命令来验证 Ingress 端点。
1 curl demo.apps.mlopshub.com
结论 在本文中,我们学习了如何设置 Nginx Ingress 控制器。
这很容易上手。但是,对于项目实现,请确保您完成所有 Nginx 配置并根据要求进行调整 。
使用 Nginx 控制器配置映射,您可以配置所有 Nginx 设置,而无需重新部署控制器。