【云原生】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=

相关推荐
麦兜*1 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
程序员爱钓鱼3 小时前
Go语言实战案例-读取用户输入并打印
后端·google·go
Livingbody7 小时前
基于【ERNIE-4.5-VL-28B-A3B】模型的图片内容分析系统
后端
你的人类朋友8 小时前
🍃Kubernetes(k8s)核心概念一览
前端·后端·自动化运维
追逐时光者9 小时前
面试第一步,先准备一份简洁、优雅的简历模板!
后端·面试
慕木兮人可9 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
发粪的屎壳郎9 小时前
ASP.NET Core 8 轻松配置Serilog日志
后端·asp.net·serilog
倔强青铜三10 小时前
苦练Python第4天:Python变量与数据类型入门
前端·后端·python
倔强青铜三11 小时前
苦练Python第3天:Hello, World! + input()
前端·后端·python
倔强青铜三11 小时前
苦练Python第2天:安装 Python 与设置环境
前端·后端·python