背景简介
Ingress 是 Kubernetes 中用于管理外部到集群内部服务之间的访问的 API 对象。它定义了从外部到集群服务的规则,这些规则通常是基于 HTTP 。
环境信息
- Kubernetes v1.29.1。【Kubernetes - 安装】
- 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 ingressclassNAME 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
浏览器访问:

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