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

相关推荐
程序猿麦小七6 分钟前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区
蓝田~14 分钟前
SpringBoot-自定义注解,拦截器
java·spring boot·后端
theLuckyLong15 分钟前
SpringBoot后端解决跨域问题
spring boot·后端·python
.生产的驴16 分钟前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
小扳20 分钟前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
v'sir30 分钟前
POI word转pdf乱码问题处理
java·spring boot·后端·pdf·word
李少兄34 分钟前
解决Spring Boot整合Redis时的连接问题
spring boot·redis·后端
码上一元5 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
枫叶_v7 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
杜杜的man8 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang