背景简介
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 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
浏览器访问:
以上便是本文的全部内容,感谢您的阅读,如遇到任何问题,欢迎在评论区留言,我会通过邮件回复。