Ingress 是什么?
项目地址:https://github.com/kubernetes/ingress-nginx
Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
图. Ingress
Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的 Service。
Ingress简单的理解就是你原来需要改Nginx配置,然后配置各种域名对应哪个 Service,现在把这个动作抽象出来,变成一个 Ingress 对象,你可以用 yaml 创建,每次不要去改Nginx 了,直接改yaml然后创建/更新就行了;那么问题来了:”Nginx 该怎么处理?”
Ingress Controller是什么?
Installation Guide – NGINX Ingress Controller (kubernetes.github.io)
Ingress管理的负载均衡器,为集群提供全局的负载均衡能力。
Ingress Controller 这东西就是解决 “Nginx 的处理方式” 的;Ingress
Controller 通过与 Kubernetes API 交互,动态的去感知集群中Ingress规则变化,然后读取他,按照他自己模板生成一段 Nginx 配置,再写到 Nginx Pod 里,最后 reload 一下,工作流程如下图:
部署
项目地址:https://github.com/kubernetes/ingress-nginx
查看 k8s 支持的版本
Supported Versions table
Supported versions for the ingress-nginx project mean that we have completed E2E tests, and they are passing for the versions listed. Ingress-Nginx versions may work on older versions but the project does not make that guarantee.
Ingress-NGINX version
k8s supported version
Alpine Version
Nginx Version
v1.5.1
1.25, 1.24, 1.23
3.16.2
1.21.6
v1.4.0
1.25, 1.24, 1.23, 1.22
3.16.2
1.19.10†
v1.3.1
1.24, 1.23, 1.22, 1.21, 1.20
3.16.2
1.19.10†
v1.3.0
1.24, 1.23, 1.22, 1.21, 1.20
3.16.0
1.19.10†
v1.2.1
1.23, 1.22, 1.21, 1.20, 1.19
3.14.6
1.19.10†
v1.1.3
1.23, 1.22, 1.21, 1.20, 1.19
3.14.4
1.19.10†
v1.1.2
1.23, 1.22, 1.21, 1.20, 1.19
3.14.2
1.19.9†
v1.1.1
1.23, 1.22, 1.21, 1.20, 1.19
3.14.2
1.19.9†
v1.1.0
1.22, 1.21, 1.20, 1.19
3.14.2
1.19.9†
v1.0.5
1.22, 1.21, 1.20, 1.19
3.14.2
1.19.9†
v1.0.4
1.22, 1.21, 1.20, 1.19
3.14.2
1.19.9†
v1.0.3
1.22, 1.21, 1.20, 1.19
3.14.2
1.19.9†
v1.0.2
1.22, 1.21, 1.20, 1.19
3.14.2
1.19.9†
v1.0.1
1.22, 1.21, 1.20, 1.19
3.14.2
1.19.9†
v1.0.0
1.22, 1.21, 1.20, 1.19
3.13.5
1.20.1
† This build is patched against CVE-2021-23017.
See this article if you want upgrade to the stable Ingress API.
下载yaml文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml
1.应用清单
2.处理国内无法下载k8s.io上的镜像
sed -i s#registry.k8s.io/ingress-nginx/controller:v1.3.1@sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974#registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.1#g deploy.yamlsed -i s#registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0@sha256:549e71a6ca248c5abd51cdb73dbc3083df62cf92ed5e6147c780e30f7e007a47#registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.3.0#g deploy.yaml
3.修改配置
修改位置1
将Ingress Controller暴露,一般使用宿主机网络(hostNetwork: true)或者使用NodePort
HostNetwork (yaml 文件中, 每个containers: 上面添加hostNetwork: true)
是为了打通Cluster和node的网络,让Cluster直接监听node的端口,一般是80和443,不用再通过随机绑定的nodePort来访问集群服务
可以看到不再需要随机绑定的nodePort了,因为hostNetwork直接监听集群的80端口
修改配置2
参考Pod 打散调度 ,将3个副本分配到不通节点。
spec: replicas: 3 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: topologySpreadConstraints: – maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: kubernetes.io/os: linux
修改配置3
修改后的yaml 如下
apiVersion: v1kind: Namespacemetadata: labels: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx—apiVersion: v1automountServiceAccountToken: truekind: ServiceAccountmetadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx namespace: ingress-nginx—apiVersion: v1kind: ServiceAccountmetadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admission namespace: ingress-nginx—apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx namespace: ingress-nginxrules:- 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: – coordination.k8s.io resourceNames: – ingress-controller-leader resources: – leases verbs: – get – update- apiGroups: – coordination.k8s.io resources: – leases verbs: – create- apiGroups: – “” resources: – events verbs: – create – patch—apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admission namespace: ingress-nginxrules:- apiGroups: – “” resources: – secrets verbs: – get – create—apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: labels: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginxrules:- apiGroups: – “” resources: – configmaps – endpoints – nodes – pods – secrets – namespaces verbs: – list – watch- apiGroups: – coordination.k8s.io resources: – leases 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/v1kind: ClusterRolemetadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admissionrules:- apiGroups: – admissionregistration.k8s.io resources: – validatingwebhookconfigurations verbs: – get – update—apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx namespace: ingress-nginxroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ingress-nginxsubjects:- kind: ServiceAccount name: ingress-nginx namespace: ingress-nginx—apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admission namespace: ingress-nginxroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ingress-nginx-admissionsubjects:- kind: ServiceAccount name: ingress-nginx-admission namespace: ingress-nginx—apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: labels: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginxroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ingress-nginxsubjects:- kind: ServiceAccount name: ingress-nginx namespace: ingress-nginx—apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admissionroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ingress-nginx-admissionsubjects:- kind: ServiceAccount name: ingress-nginx-admission namespace: ingress-nginx—apiVersion: v1data: allow-snippet-annotations: “true”kind: ConfigMapmetadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-controller namespace: ingress-nginx—apiVersion: v1kind: Servicemetadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-controller namespace: ingress-nginxspec: 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: v1kind: Servicemetadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-controller-admission namespace: ingress-nginxspec: 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 type: ClusterIP—apiVersion: apps/v1kind: Deploymentmetadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-controller namespace: ingress-nginxspec: replicas: 3 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: topologySpreadConstraints: – maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: kubernetes.io/os: linux hostNetwork: true containers: – args: – /nginx-ingress-controller – –publish-service=$(POD_NAMESPACE)/ingress-nginx-controller – –election-id=ingress-controller-leader – –controller-class=k8s.io/ingress-nginx – –ingress-class=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.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.1 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—apiVersion: batch/v1kind: Jobmetadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admission-create namespace: ingress-nginxspec: template: metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admission-create spec: hostNetwork: true 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.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.3.0 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure securityContext: fsGroup: 2000 runAsNonRoot: true runAsUser: 2000 serviceAccountName: ingress-nginx-admission—apiVersion: batch/v1kind: Jobmetadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admission-patch namespace: ingress-nginxspec: template: metadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admission-patch spec: hostNetwork: true 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.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.3.0 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure securityContext: fsGroup: 2000 runAsNonRoot: true runAsUser: 2000 serviceAccountName: ingress-nginx-admission—apiVersion: networking.k8s.io/v1kind: IngressClassmetadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: nginxspec: controller: k8s.io/ingress-nginx—apiVersion: admissionregistration.k8s.io/v1kind: ValidatingWebhookConfigurationmetadata: labels: app.kubernetes.io/component: admission-webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.3.1 name: ingress-nginx-admissionwebhooks:- 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
验证
kubectl get pod,svc,ing,deploy -n ingress-nginx
发现namespace为ingress-nginx的三个pod已经成功完成,status为completed的两个pod为job类型资源,completed表示job已经成功执行无需管它。
测试代理HTTP
kubectl create ns testkubectl create deploy nginx –image=nginx:1.17.1 –replicas=1 -n testkubectl expose deploy nginx –port=80 -n testkubectl get pod,svc,ing,deploy -n test
编写 ingress-nginx-test.yaml
测试过程中 可能会遇到无法访问的问题 ,解决办法如下
查看已创建的ingressclass
[root@k8s-master1 ~]# kubectl get ingressclassNAME CONTROLLER PARAMETERS AGEnginx k8s.io/ingress-nginx 10m[root@k8s-master1 ~]#
添加 ingressClassName: nginx 不然无法访问
修改ingress资源 添加spec.ingressClassName: nginx
解决方法一
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: nginx namespace: testspec: ingressClassName: nginx rules: – host: k8s.frp.innomcn.com http: paths: – path: / pathType: Prefix backend: service: name: nginx port: number: 80
查看ingress
[root@k8s-master1 ~]# kubectl get ingress -ANAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGEtest nginx nginx k8s.frp.innomcn.com 80 5m2s
解决方法二:
设置默认的 IngressClass 注意:修改后必须新创建的ingress才会默认使用
在集群中,我们可以设定一个默认的 Ingress Class,以便处理所有没有指定 Ingress Class 的 Ingress 资源。
在 IngressClass 资源上,我们可以通过将 ingressclass.kubernetes.io/is-default-class 注解的值设定为 true,来使没有设置 ingressClassName 的 Ingress 使用此默认的 IngressClass。
[root@k8s-master1 ~]# kubectl get ingressclassNAME CONTROLLER PARAMETERS AGEnginx k8s.io/ingress-nginx 10m[root@k8s-master1 ~]#
kubectl edit ingressclass nginx
访问
windows 添加hosts
192.168.40.180 k8s.frp.innomcn.com
192.168.40.181 k8s.frp.innomcn.com
192.168.40.182 k8s.frp.innomcn.com
发现有个报错
安装http-backend
apiVersion: apps/v1kind: Deploymentmetadata: name: default-http-backend labels: k8s-app: default-http-backend namespace: kube-systemspec: replicas: 1 selector: matchLabels: k8s-app: default-http-backend template: metadata: labels: k8s-app: default-http-backend spec: terminationGracePeriodSeconds: 60 containers: – name: default-http-backend # Any image is permissable as long as: # 1. It serves a 404 page at / # 2. It serves 200 on a /healthz endpoint image: registry.cn-hangzhou.aliyuncs.com/hachikou/defaultbackend:1.0 livenessProbe: httpGet: path: /healthz #这个URI是 nginx-ingress-controller中nginx里配置好的localtion port: 8080 scheme: HTTP initialDelaySeconds: 30 #30s检测一次/healthz timeoutSeconds: 5 ports: – containerPort: 8080# resources:# limits:# cpu: 10m# memory: 20Mi# requests:# cpu: 10m# memory: 20Mi—apiVersion: v1kind: Service #为default backend 创建一个servicemetadata: name: default-http-backend namespace: kube-system labels: k8s-app: default-http-backendspec: ports: – port: 80 targetPort: 8080 selector: k8s-app: default-http-backend
查看ingress
测试代理HTTPS
(1)准备证书,在k8s的master1节点操作
openssl genrsa -out tls.key 2048openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=k8s.frp.innomcn.com
(2)生成secret,在k8s的master1节点操作
kubectl create secret tls nginx-ingress-secret –cert=tls.crt –key=tls.key -n test
(3)查看secret
kubectl get secret -ntest
(4)查看tomcat-ingress-secret详细信息
kubectl describe secret nginx-ingress-secret
创建ingress
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: ingress-nginx-tls namespace: test annotations: kubernetes.io/ingress.class: “nginx”spec: tls: – hosts: – k8s.frp.innomcn.com secretName: nginx-ingress-secret rules: – host: k8s.frp.innomcn.com http: paths: – path: / pathType: Prefix backend: service: name: nginx port: number: 80
文章来源于互联网:部署Ingress Controller1.31 以及使用案例