【云原生】Kubernetes Service之Ingress Service

什么是 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

访问prometues

http://localhost/prometheus/targets?search=

相关推荐
2401_857622666 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589366 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没7 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch7 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
杨哥带你写代码9 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries9 小时前
读《show your work》的一点感悟
后端
A尘埃9 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23079 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code9 小时前
(Django)初步使用
后端·python·django
代码之光_19809 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端