什么是 Ingress?
Ingress将 HTTP 和 HTTPS 路由从集群外部公开到 集群内的 服务。流量路由由入口资源上定义的规则控制。
Ingress 可以配置为提供服务外部可访问的 URL、负载平衡流量、终止 SSL/TLS 以及提供基于名称的虚拟托管。 Ingress 控制器负责实现 Ingress,通常使用负载均衡器,但它也可能配置边缘路由器或其他前端来帮助处理流量。
这是一个简单的示例,其中 Ingress 将其所有流量发送到一个服务:
注意: 您必须有一个Ingress 控制器才能满足 Ingress。仅创建 Ingress 资源是没有效果的。您可能需要部署 Ingress 控制器,例如ingress-nginx。您可以从多个Ingress 控制器中进行选择。
部署Ingress
- 需要注意的是,Kind集群一方面我们给该节点设置ingress-ready=true的标签信息;另一方面,对80、443端口设置映射, 便于后续通过宿主机访问K8s节点
arduino
kubectl get node -o wide -L ingress-ready
ruby
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
-
清单包含特定类型的补丁,用于将主机端口转发到入口控制器、设置污点容忍并将其安排到自定义标记的节点。
-
现在 Ingress 已全部设置完毕。等到准备好处理正在运行的请求:
scss
kubectl wait --namespace ingress-nginx \ --for=condition=ready pod \ --selector=app.kubernetes.io/component=controller \ --timeout=90s
使用 Ingress
- 以下示例创建简单的 http-echo 服务和一个用于路由到这些服务的 Ingress 对象。
yaml
kind: Pod
apiVersion: v1
metadata:
name: foo-app
labels:
app: foo
spec:
containers:
- command:
- /agnhost
- netexec
- --http-port
- "8080"
image: registry.k8s.io/e2e-test-images/agnhost:2.39
name: foo-app
---
kind: Service
apiVersion: v1
metadata:
name: foo-service
spec:
selector:
app: foo
ports:
# Default port used by the image
- port: 8080
---
kind: Pod
apiVersion: v1
metadata:
name: bar-app
labels:
app: bar
spec:
containers:
- command:
- /agnhost
- netexec
- --http-port
- "8080"
image: registry.k8s.io/e2e-test-images/agnhost:2.39
name: bar-app
---
kind: Service
apiVersion: v1
metadata:
name: bar-service
spec:
selector:
app: bar
ports:
# Default port used by the image
- port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /foo(/|$)(.*)
backend:
service:
name: foo-service
port:
number: 8080
- pathType: Prefix
path: /bar(/|$)(.*)
backend:
service:
name: bar-service
port:
number: 8080
---
-
Pod:有两个Pod,分别命名为foo-app和bar-app,它们使用相同的容器镜像registry.k8s.io/e2e-test-images/agnhost:2.39。
-
Service:有两个Service,名为foo-service和bar-service。它们分别与foo-app和bar-app相关联。foo-service监听端口8080,并将流量转发到foo-app。bar-service也监听端口8080,并将流量转发到bar-app。
-
Ingress:有一个Ingress对象,名为example-ingress。它使用了nginx-ingress控制器的注解,允许URL重写功能。对于以/foo开头的路径,请求将转发到foo-service。对于以/bar开头的路径,请求将转发到bar-service。
-
最后,为了后续能够让我们成功创建相应的Ingress资源,我们还需要删除ingress-nginx-admission。具体命令如下所示
csharp
# 查看 webhook
kubectl get validatingwebhookconfigurations
# 删除 ingress-nginx-admission
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
- 完成之后,我们开始部署应用
bash
kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/usage.yaml
- 现在验证入口是否正常工作
arduino
# should output "foo-app"
curl localhost/foo/hostname
# should output "bar-app"
curl localhost/bar/hostname
Ingress Service 访问KubeSphere的Prometheus
- KubeSphere 内置了告警模块,有时候需要访问其页面。但是在Kind中需要使用proxy-forward,及其不方便。所以使用ingress暴露端口
ingress_prometheus.yaml
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometues
namespace: kubesphere-monitoring-system
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /prometheus(/|$)(.*)
backend:
service:
name: prometheus-k8s
port:
number: 9090
kubectl applu -f ingress_prometheus.yaml
在KubeSphere中的应用路由可以查看到我们刚刚创建的ingress
或者使用命令
sql
kubectl get ingress --all-namespaces
kubectl describe ingress/prometues -n kubesphere-monitoring-system