Ingress的出现

Ingress是一种Kubernetes资源,用于将外部流量路由到Kubernetes集群内的服务。与NodePort相比,它供给了更高等级的路由功用和负载平衡,能够依据HTTP恳求的途径、主机名、HTTP方法等来路由流量。

因而,能够说Ingress是为了弥补NodePort在流量路由方面的不足而生的。运用NodePort,只能将流量路由到一个详细的Service,而且有必要运用Service的端口号来拜访该服务。可是,运用Ingress,就能够运用自界说域名、途径和其他HTTP头来界说路由规矩,以便将流量路由到不同的Service。

tantianran@test-b-k8s-master:~$kubectlapi-resources|grepingress
ingressclassesnetworking.k8s.io/v1falseIngressClass
ingressesingnetworking.k8s.io/v1trueIngress

此外,Ingress还能够与负载均衡器合作运用,以供给高可用性和水平扩展。这些功用使得Ingress比NodePort更适合在生产环境中运用。

Ingress和Ingress Controller

《做一个不背锅运维:一篇搞定K8s Ingress》

  1. **「Ingress」**Ingress 是 Kubernetes 中的一个笼统资源,它供给了一种界说运用露出进口的方法,能够协助办理员在 Kubernetes 集群中办理多个服务的拜访进口,便利用户拜访。Ingress资源目标仅仅一个规范化的API目标,用于界说流量路由规矩和 TLS 设置等信息。它本身不会直接处理或转发流量,而是需求合作一个 Ingress 控制器来完成。

刚才提到,Ingress 需求合作 Ingress Controller 运用,需求留意了,不同的 Ingress Controller 或许支撑的功用和装备方法不同,需求依据实践情况进行挑选和装备。

  1. **「Ingress Controller」**Ingress 控制器是一个独立的组件,它会监听 Kubernetes API 中的 Ingress 资源改变,并依据界说的路由规矩装备负载均衡器、反向署理或其他网络署理,然后完成外部流量的转发。因而,能够将 Ingress 控制器视为 Ingress 资源的实践执行者。

总之,Kubernetes 的 Ingress 资源目标需求合作 Ingress 控制器才能完成外部流量的转发和路由。Ingress 控制器是 Ingress 资源的实践执行者,担任依据界说的路由规矩装备网络署理。

干流的Ingress Controller

在 Kubernetes 中,有许多不同的 Ingress 控制器能够挑选,例如 Nginx、Traefik、HAProxy、Envoy 等等。不同的控制器或许会供给不同的功用、功能和可靠性,能够依据实践需求来挑选适宜的控制器。Kubernetes生态体系中有许多不同的Ingress控制器可供挑选,其间比较干流的有:

  1. Nginx Ingress Controller:依据Nginx的Ingress控制器,供给了广泛的功用和装备选项。
  2. Traefik Ingress Controller:Traefik是一个盛行的反向署理和负载均衡器,Traefik Ingress Controller供给了灵敏的装备选项和主动发现服务的功用。
  3. Istio Ingress Gateway:Istio是一种服务网格,它供给了依据Envoy署理的Ingress Gateway来办理入站和出站流量。
  4. Contour Ingress Controller:依据Envoy署理的Ingress控制器,具有高度可扩展性和灵敏的路由规矩。
  5. Kong Ingress Controller:Kong是一个API网关,供给了可扩展的路由和服务办理功用。
  6. Ambassador API Gateway:Ambassador是一个Kubernetes-native API Gateway,供给了主动化的服务发现和路由办理功用。

能够依据实践需求挑选恰当的Ingress控制器,并进行相应的装备和布置。

控制器的布置方案

Ingress控制器一般主张布置在 Kubernetes 集群内部。这样能够保证 Ingress 控制器与 Kubernetes API Server 之间的网络推迟较低,而且能够经过 Kubernetes Service 来办理 Ingress 控制器的负载均衡和高可用性。在 Kubernetes 集群内部布置 Ingress 控制器一般有两种方法:

  1. 布置一个独立的 Ingress 控制器 Pod:能够经过将 Ingress 控制器布置为一个独立的 Pod,运用 Kubernetes Service 对其进行负载均衡和露出服务。
  2. 布置一个 DaemonSet 类型的 Ingress 控制器:能够经过布置一个 DaemonSet 类型的 Ingress 控制器,使每个节点上都运转一个 Ingress 控制器 Pod,并经过 Kubernetes Service 对其进行负载均衡和露出服务。

无论是哪种方法,Ingress 控制器都应该被布置在 Kubernetes 集群内部,以便与 Kubernetes API Server 进行通讯,并与 Kubernetes 资源(如 Service、Pod、Endpoints 等)进行交互。

装置Nginx Ingress

Nginx 是一个高功能的 Web 服务器和反向署理服务器,能够供给静态内容的快速响应,同时也能够经过反向署理将恳求转发到后端运用程序。

Nginx Ingress 是依据 Nginx 的 Kubernetes Ingress 控制器,它能够在 Kubernetes 集群中供给负载均衡、路由和 TLS 停止等功用。它将 Kubernetes Ingress API 目标转换为 Nginx 装备,并将其运用于 Nginx 服务器。经过 Nginx Ingress,能够轻松地将 HTTP(S) 流量路由到 Kubernetes 中的不同服务。

kubernetes.github.io/ingress-ngi… github.com/kubernetes/…

装置 Nginx Ingress Controller 的方法有多种,以下是其间的一些:

  • Helm 装置:运用 Helm 工具,能够在 Kubernetes 集群上轻松装置和晋级 Nginx Ingress Controller。
  • Kubernetes YAML 装置:运用 Kubernetes YAML 装备文件,能够在 Kubernetes 集群上装置 Nginx Ingress Controller。
  • Docker 装置:能够经过 Docker 容器运转 Nginx Ingress Controller。
  • Bare-metal 装置:能够在没有 Kubernetes 集群的裸机上装置 Nginx Ingress Controller。
  • Cloud 装置:在某些云渠道上,能够运用托管服务的形式装置 Nginx Ingress Controller,例如 Google Cloud Platform 上的 GKE。

无论挑选哪种方法,都需求依据实践情况进行调整和装备,以保证 Nginx Ingress Controller 能够正常工作。

  1. 装置Nginx Ingress Controller

运用Helm装置:

helmrepoaddingress-nginxhttps://kubernetes.github.io/ingress-nginx
helmrepoupdate
kubectlcreatenamespaceingress-nginx
helminstallingress-nginxingress-nginx/ingress-nginx\
--namespaceingress-nginx\
--setcontroller.publishService.enabled=true
kubectlgetpods-ningress-nginx
kubectlgetsvc-ningress-nginx

上面的指令将在命名空间中装置控制器,假如该命名空间尚不存在,则创立该命名空间ingress-nginx。 此指令是幂等的:

  • 假如未装置进口控制器,它将装置它,
  • 假如已装置进口控制器,它将对其进行晋级。

运用YAML装置:

wgethttps://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml
mvdeploy.yamlingress-nginx-controller.yaml
kubectlapply-fingress-nginx-controller.yaml
#或许直接
kubectlapply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml

留意,或许会应网络问题无法拉取相关镜像,能够修正ingress-nginx-controller.yaml文件里image字段的库房地址,我现已把镜像传到我的Docker Hub库房中:

  • tantianran/ingress-controller:v1.6.4
  • tantianran/kube-webhook-certgen:v20220916-gd32f8c343

例如,修正后:

tantianran@test-b-k8s-master:~$egrep"image"ingress-nginx-controller.yaml|grep-vimagePullPolicy
image:tantianran/ingress-controller:v1.6.4
image:tantianran/kube-webhook-certgen:v20220916-gd32f8c343
image:tantianran/kube-webhook-certgen:v20220916-gd32f8c343
  1. 装置后检查pod
tantianran@test-b-k8s-master:~$kubectlgetpod-ningress-nginx
NAMEREADYSTATUSRESTARTSAGE
ingress-nginx-admission-create-z4hlb0/1Completed047h
ingress-nginx-admission-patch-ffbwz0/1Completed047h
ingress-nginx-controller-5f4c9fdd9b-l55ch1/1Running1(10mago)47h
  • ingress-nginx-controller是Ingress-nginx的控制器组件,它担任监督Kubernetes API server上的Ingress目标,并依据装备动态地更新Nginx装备文件,完成HTTP(S)的负载均衡和路由。
  • ingress-nginx-admission-create和ingress-nginx-admission-patch都是Kubernetes Admission Controller,它们不是一直处于运转状况的容器,而是依据需求动态地生成和销毁。这些Admission Controller在Kubernetes中以Deployment的方法进行布置,因而,它们的Pod将依据副本数创立多个副本,并依据负载和需求动态地生成和销毁。
    • ingress-nginx-admission-create是一个Kubernetes Admission Controller,它能够拦截Kubernetes集群内的Ingress目标的创立操作,并在Ingress目标创立之前,对其进行一些额定的验证和处理。
    • ingress-nginx-admission-patch也是一个Kubernetes Admission Controller,它能够在Ingress目标更新之前,对其进行额定的验证和处理,类似于ingress-nginx-admission-create。

「有没有留意到nginx-admission-create和ingress-nginx-admission-patch这两个pod的状况是Completed?」当这两个Pod被创立时,它将开始运转容器,执行必要的初始化和验证操作,然后测验处理Kubernetes API server发送的恳求。假如恳求现已被处理完毕,容器将正常停止,并将Pod的状况设置为Completed。因而,Pod处于Completed状况并不表明有任何问题或过错,而是表明容器现已完成了它需求完成的任务并停止了运转。

需求留意的是,假如在Pod停止之前出现过错或异常,Pod的状况将会被设置为Failed,这或许需求进行进一步的毛病扫除和修正。

  1. 装置后检查Service
tantianran@test-b-k8s-master:~$kubectlgetsvc-ningress-nginx
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
ingress-nginx-controllerLoadBalancer10.106.241.48<pending>80:30806/TCP,443:30178/TCP2d
ingress-nginx-controller-admissionClusterIP10.109.39.65<none>443/TCP2d
tantianran@test-b-k8s-master:~$

ingress-nginx-controller Service:这个Service担任将恳求转发到ingress-nginx-controller Pods。它一般会将流量分发到ingress-nginx-controller的多个副本中,并保证副本集的负载平衡。这个Service能够被装备为运用NodePort、LoadBalancer或ClusterIP类型,依据需求进行露出。

ingress-nginx-controller-admission Service:这个Service是用于 Kubernetes Admission Webhooks 的,允许在创立、更新或删除资源时,对其进行校验或修正。它供给了一个API Endpoint,用于与 Kubernetes API Server 进行通讯,以便进行这些校验或修正。该Service也能够被装备为运用NodePort、LoadBalancer或ClusterIP类型,依据需求进行露出。

一般情况下,ingress-nginx-controller和ingress-nginx-controller-admission都是在同一个Deployment中运转的,以保证它们一直具有相同的标签。这些标签允许其他Kubernetes目标(例如Ingress)能够识别哪些Pods是由ingress-nginx-controller和ingress-nginx-controller-admission担任的,并将恳求路由到正确的Pods中。

创立测验运用和ingress资源目标

  1. 创立测验运用的Deployment和Services,修改test-goweb.yaml:
apiVersion:apps/v1
kind:Deployment
metadata:
labels:
app:test-goweb
name:test-goweb
spec:
replicas:6
selector:
matchLabels:
app:test-goweb
template:
metadata:
labels:
app:test-goweb
spec:
containers:
-image:192.168.11.247/web-demo/goweb-demo:20221229v3
name:goweb-demo
ports:
-containerPort:8090
protocol:TCP
---
apiVersion:v1
kind:Service
metadata:
labels:
app:test-goweb
name:test-goweb
spec:
ports:
-name:80-8090
port:80
protocol:TCP
targetPort:8090
selector:
app:test-goweb
type:ClusterIP

在上面的Yaml装备文件中,选用的Service类型是ClusterIP类型,ClusterIP类型的Service只能从K8S集群内部拜访,因而需求将其与Ingress Controller结合运用,以便外部客户端能够拜访集群中的运用程序。当客户端恳求到达Ingress时,Ingress Controller会将恳求路由到相应的Service,然后Service再将恳求路由到Pod中运转的容器。

kubectlapply-ftest-goweb.yaml
  1. 检查Service资源
tantianran@test-b-k8s-master:~$kubectlgetsvc
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
kubernetesClusterIP10.96.0.1<none>443/TCP120d
test-gowebClusterIP10.105.248.32<none>80/TCP81m#这个等会是要用到的,Service称号为test-goweb,端口为80
tantianran@test-b-k8s-master:~$
  1. 检查当时集群中界说的一切IngressClass目标
tantianran@test-b-k8s-master:~$kubectlgetingressclass
NAMECONTROLLERPARAMETERSAGE
nginxk8s.io/ingress-nginx<none>2d2h#这个nginx控制器便是咱们等会要用的
tantianran@test-b-k8s-master:~$

在k8s中,Ingress 资源目标能够用来露出服务,将外部流量路由到内部集群服务。可是,在一个集群中,或许需求运用不同的 Ingress 控制器来满足不同的需求,而每个控制器都需求运用不同的装备和规矩。这便是 IngressClass 的作用。经过界说不同的 IngressClass,能够为不同的 Ingress 控制器指定不同的装备和规矩,然后更好地办理 Ingress 资源目标。

  1. 界说Ingress资源的YAML文件,用于创立Ingress资源目标,修改test-goweb-ingress.yaml:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:test-goweb
spec:
ingressClassName:nginx
rules:
-host:"test.noblameops.local"
http:
paths:
-path:/login
pathType:Prefix
backend:
service:
name:test-goweb
port:
number:80
-path:/home
pathType:Prefix
backend:
service:
name:test-goweb
port:
number:80
-path:/
pathType:Prefix
backend:
service:
name:test-goweb
port:
number:80

这个 Ingress 装备了3个途径,后端为同一个Services,下面仅拿途径”/”做解说:

  • 在 metadata 字段中,name 字段指定了创立的 Ingress 资源的称号。
  • 在 spec 字段中,ingressClassName 字段指定了要运用的 Ingress 控制器。在这儿运用了名为 nginx 的 Ingress 类别。
  • rules 字段指定了 Ingress 的规矩列表。在这儿只需一个规矩,即当外部流量经过 HTTP 拜访 Ingress 时,应该运用下面的装备:
  • path 字段指定了应该匹配的 URL 途径。在这儿,一切途径都匹配 /。
  • pathType 字段指定了途径匹配方法,这儿运用了 Prefix 类型,表明只需途径以 / 最初,就匹配成功。
  • backend 字段指定了要将匹配的流量转发到哪个后端(Service)。在这儿挑选了名为 test-goweb 的 Service(ClusterIP类型),该 Service 中的 80 端口将接纳流量。

开始创立

kubectlapply-ftest-goweb-ingress.yaml
  1. 创立ingress资源目标后检查
tantianran@test-b-k8s-master:~$kubectlgetingress
NAMECLASSHOSTSADDRESSPORTSAGE
test-gowebnginxtest.noblameops.local10.105.254.90809m32s
tantianran@test-b-k8s-master:~$

这条指令输出了一个名为 test-goweb 的 Ingress 资源,它将路由到 test.noblameops.local 这个主机名,并在端口 80 上监听恳求。咱们来看看输出字段的含义:

  • NAME: Ingress 资源的称号是 test-goweb。
  • CLASS: Ingress 资源运用的 Ingress 类别为 nginx。
  • HOSTS: Ingress 资源装备的主机名为 test.noblameops.local。这表明一切恳求都将被路由到这个主机名。
  • ADDRESS: 没有指定 IP 地址,这意味着 Ingress 控制器将为 Ingress 资源分配一个 IP 地址。
  • PORTS: Ingress 资源将监听端口 80 上的恳求。
  • AGE: Ingress 资源的创立时刻是 9 秒前。

Ingress Controller的露出方法

当运用K8S中的Ingress资源目标来露出运用时,用户拜访运用的进口是 Ingress Controller 的地址。Ingress Controller 会依据 Ingress 规矩将恳求路由到相应的服务,并将服务的响应返回给客户端。这时候就要把Ingress Controller露出出去,露出方法有以下几种:

  • NodePort:运用 NodePort 服务类型来露出 Ingress Controller,这种方法能够将 Ingress Controller 露出到 Kubernetes 集群的一切节点上,经过节点的 IP 地址和 NodePort 能够拜访到 Ingress Controller。NodePort方法将Ingress Controller的端口映射到节点的一个随机端口上,这种方法的长处是比较简单,易于装备和办理。可是,它的缺陷是需求露出每个节点的端口,这或许会导致端口号不够用,或许在安全方面存在一些危险。

图片

  • HostNetwork(共享宿主机网络):运用 HostNetwork 字段来露出 Ingress Controller,这种方法能够将 Ingress Controller 直接露出到节点的网络命名空间中,然后能够直接运用节点的 IP 地址来拜访 Ingress Controller。HostNetwork方法将Ingress Controller的容器直接绑定到主机的网络上,这种方法的长处是能够直接运用主机的网络资源,功能较好,而且能够防止NodePort方法中的安全危险。缺陷是假如Ingress Controller容器崩溃,它会影响主机上的其他容器。

图片

  • LoadBalancer:运用 LoadBalancer 服务类型来露出 Ingress Controller,这种方法能够将 Ingress Controller 露出到云服务供给商的负载均衡器上,然后能够经过负载均衡器的 IP 地址来拜访 Ingress Controller。能够完成更好的负载均衡和高可用性。这种方法的长处是能够主动创立负载均衡器,能够动态地分配IP地址,易于办理和扩展。可是,它的缺陷是需求依赖云厂商供给的负载均衡器服务,关于一些不支撑负载均衡器服务的云渠道或许本地环境不太适用。
  • ExternalIPs:运用 ExternalIPs 字段来指定外部 IP 地址来露出 Ingress Controller,这种方法需求手动装备外部 IP 地址,而且只适用于具有静态 IP 地址的环境。

接下来的场景,咱们选用NodePort方法来露出Ingress Controller。

  1. 检查ingress controller的Service

从下面的查询成果能够看到,ingress-nginx-controller的Service类型默许是LoadBalancer,该类型能够经过云供给商的负载均衡器(如 AWS ELB、Google Cloud Load Balancer 等)来公开服务。

tantianran@test-b-k8s-master:~$kubectlgetsvc-ningress-nginx
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
ingress-nginx-controllerLoadBalancer10.106.241.48<pending>80:30806/TCP,443:30178/TCP2d6h
ingress-nginx-controller-admissionClusterIP10.109.39.65<none>443/TCP2d6h
tantianran@test-b-k8s-master:~$

我的环境是本地的K8S环境,我仅仅需求在本地 K8S 环境中进行测验和开发罢了,所以能够将其修正为 NodePort 类型,以便将服务公开到集群内的一切节点。NodePort 类型的 Service 能够将服务公开到 K8S 集群中的一切节点的固定端口,这种方法便是适用于本地测验和开发环境。

  1. 修正成NodePort的方法: 在下载回来的ingress-nginx-controller.yaml装备文件里找到ingress-nginx-controller的Service
apiVersion:v1
kind:Service
metadata:
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.6.4
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
nodePort:30080#增加此处
-appProtocol:https
name:https
port:443
protocol:TCP
targetPort:https
nodePort:30443#增加此处
selector:
app.kubernetes.io/component:controller
app.kubernetes.io/instance:ingress-nginx
app.kubernetes.io/name:ingress-nginx
type:NodePort#修正此处

修正完成后干掉原来的再从头创立:

kubectldelete-fingress-nginx-controller.yaml
kubectlcreate-fingress-nginx-controller.yaml
tantianran@test-b-k8s-master:~$kubectlgetsvc-ningress-nginx
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
ingress-nginx-controllerNodePort10.100.117.82<none>80:30080/TCP,443:30443/TCP9s#成功修正为NodePort类型
ingress-nginx-controller-admissionClusterIP10.101.46.195<none>443/TCP9s
tantianran@test-b-k8s-master:~$kubectlgetpod-ningress-nginx-owide
NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATES
ingress-nginx-admission-create-ftntz0/1Completed010m10.244.240.43test-b-k8s-node01<none><none>
ingress-nginx-admission-patch-9xvhv0/1Completed110m10.244.240.49test-b-k8s-node01<none><none>
ingress-nginx-controller-55cbbdbf87-dq5581/1Running010m10.244.240.23test-b-k8s-node01<none><none>
tantianran@test-b-k8s-master:~$
  1. 拜访

ingress-nginx-controller的POD只设置了1个,且当时是运转在 test-b-k8s-node01 节点上,该节点的宿主机IP就能够作为进口了,然后在体系hosts增加域名映射:

192.168.11.14test.noblameops.local

《做一个不背锅运维:一篇搞定K8s Ingress》

Https装备

下面运用cfssl工具给域名test.noblameops.local生成自签名证书,并在k8s中运用nginx ingress以https的方法露出。

  1. 装置cfssl相关工具
curl-Lhttps://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64-ocfssl
curl-Lhttps://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64-ocfssljson
curl-Lhttps://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64-ocfssl-certinfo
chmod+xcfsslcfssljsoncfssl-certinfo
mvcfsslcfssljsoncfssl-certinfo/usr/local/bin/
  1. 创立证书装备文件 创立一个证书装备文件,例如cert.json,包含以下内容:
cat>cert.json<<EOF
{
"hosts":[
"test.noblameops.local"
],
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"ST":"GuangDong",
"L":"GuangZhou",
"O":"Noblameops",
"OU":"Noblameops",
"CN":"test.noblameops.local"
}
]
}
EOF

其间,”hosts”字段指定要包含在证书中的主机名或IP地址,这儿只包含了”test.noblameops.local”;”key”字段指定运用RSA算法和2048位密钥生成证书;”names”字段指定证书中的各种称号和标识,包含安排、部分和通用称号(CN)。

  1. 生成证书和密钥
cfsslgencert-initcacert.json|cfssljson-baretest.noblameops.local

这将生成三个文件:test.noblameops.local.csr、test.noblameops.local-key.pem和test.noblameops.local.pem。其间,test.noblameops.local.pem是证书文件,test.noblameops.local-key.pem是证书私钥文件。

  1. 创立k8s secret目标 将生成的证书和密钥文件打包成一个k8s secret目标。能够运用以下指令创立该目标
kubectlcreatesecrettlstest-noblameops-local-tls--keytest.noblameops.local-key.pem--certtest.noblameops.local.pem
kubectlgetsecret

其间,test-noblameops-local-tls是secret目标的称号,–key参数指定私钥文件的途径,–cert参数指定证书文件的途径。

  1. 创立nginx ingress资源 创立一个nginx ingress资源,将证书装备和TLS装备增加到该资源中
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:test-goweb
spec:
ingressClassName:nginx
tls:
-hosts:
-test.noblameops.local
secretName:test-noblameops-local-tls
rules:
-host:"test.noblameops.local"
http:
paths:
-path:/login
pathType:Prefix
backend:
service:
name:test-goweb
port:
number:80
-path:/home
pathType:Prefix
backend:
service:
name:test-goweb
port:
number:80
-path:/
pathType:Prefix
backend:
service:
name:test-goweb
port:
number:80
  1. https拜访

图片

《做一个不背锅运维:一篇搞定K8s Ingress》

本文转载于WX公众号:不背锅运维(喜爱的盆友重视咱们):mp.weixin.qq.com/s/2pBiTgnLg…