Henry
发布于 2025-02-26 / 7 阅读
0
0

Kubernetes - 通过 Ingress 访问 Service

背景简介

Ingress 是 Kubernetes 中用于管理外部到集群内部服务之间的访问的 API 对象。它定义了从外部到集群服务的规则,这些规则通常是基于 HTTP 。

环境信息

  1. Kubernetes v1.29.1。【Kubernetes - 安装
  2. ingress-nginx。【Kubernetes - Ingress 配置

详细步骤

第一步: 创建一个名为 tomcat-deployment.yaml 的文件,启动 2 个 Tomcat 容器服务。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:9.0.100
        ports:
        - containerPort: 8080

启动 tomcat 容器服务。

$ kubectl apply -f tomcat-deployment.yaml -n test-tomcat
deployment.apps/tomcat-deployment created

第二步: 创建一个名为 tomcat-service.yaml 的文件,启动一个基于 Tomcat 容器服务的 ClusterIP Service,配置 Sticky Session。

apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  selector:
    app: tomcat
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP
  sessionAffinity: ClientIP
  • sessionAffinity: ClientIP:sessionAffinity 指定了会话亲和性(粘性会话)的类型。ClientIP 表示 Service 将尝试将来自同一客户端 IP 的请求路由到同一个后端 Pod。这是实现粘性会话的一种方式。

启动 tomcat-service 。

$ kubectl apply -f tomcat-service.yaml -n test-tomcat
service/tomcat-service created

第三步: 创建一个名为 tomcat-ingress.yaml,基于已经部署好的 ingress-nginx,添加配置使外部能够访问 tomcat。


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tomcat-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:

  ingressClassName: nginx
  rules:
  - host: tomcat-example-com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat-service
            port:
              number: 80
  • apiVersion  指定了配置文件使用的 Kubernetes API 版本。在这个例子中,使用的是 networking.k8s.io/v1,这是 Kubernetes 中用于网络资源的 API 版本。
  • kind 指定了资源的类型。在这里,资源类型是 Ingress,它用于管理外部访问集群内部服务的规则。
  • metadata.name  这里定义了 Ingress 资源的名称为 tomcat-ingress。
  • annotations 是一个可选字段,用于为资源添加元数据。
  • metadata.annotations.nginx.ingress.kubernetes.io/rewrite-target: / 是一个特定的 nginx Ingress 控制器注解,用于重写请求的目标路径。这里它将所有请求重写为根路径 /。
  • spec.ingressClassName 指定要使用的 Ingress 控制器的类名。使用不同的 ingressClassName 可以帮助你在不同的 Ingress 控制器之间分离配置,这样每个控制器都可以根据其配置和功能来处理特定的流量。
  • spec.rules.host: tomcat-example-com 指定了这个规则应该匹配的主机名。这里配置的是 tomcat-example-com。
  • spec.rules.http.paths.path: / 指定了匹配的路径。这里配置的是根路径 /。
  • spec.rules.http.paths.pathType: Prefix 指定了路径匹配的类型。Prefix 表示路径前缀匹配,即任何以配置路径开头的请求都会匹配这个规则。
  • spec.rules.http.paths.backend.service.name: tomcat-service 指定了后端服务的名称。这里配置的是名为 tomcat-service 的服务。
  • spec.rules.http.paths.backend.service.port.number: 80 指定了后端服务的端口。这里配置的是 80 端口

如 ingressClassName 参数不确定可通过指令获取

$ kubectl get ingressclass
NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       4h56m

 

启动 ingress 服务

$ kubectl apply -f tomcat-ingress.yaml -n test-tomcat

第四步: 查看完整配置

$ kubectl get pod,svc,ingress -n test-tomcat
NAME                                    READY   STATUS    RESTARTS   AGE
pod/tomcat-deployment-7547575f4-bwvgv   1/1     Running   0          58m
pod/tomcat-deployment-7547575f4-l44vz   1/1     Running   0          58m

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/tomcat-service   ClusterIP   10.107.106.124   <none>        80/TCP    27m

NAME                                       CLASS   HOSTS                ADDRESS   PORTS   AGE
ingress.networking.k8s.io/tomcat-ingress   nginx   tomcat-example-com             80      9s

第五步: 查看 ingress-nginx 的端口号并通过浏览器访问

$ kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.103.197.217   <none>        80:31272/TCP,443:31881/TCP   4m5s
ingress-nginx-controller-admission   ClusterIP   10.109.19.22     <none>        443/TCP                      4m5s

浏览器访问:


以上便是本文的全部内容,感谢您的阅读,如遇到任何问题,欢迎在评论区留言,我会通过邮件回复。



评论