为什么有的域名访问需要添加ingress-nginx-controller的svc暴露的端口
时间: 2024-09-24 07:02:40 浏览: 16
在 Kubernetes 集群中,Ingress 是一种将外部流量路由到集群内部服务的方法。而 Ingress Controller 则是根据 Ingress 资源定义的规则来配置负载均衡器,从而实现流量的分发。
当你需要通过域名访问一个服务时,通常需要添加 Ingress-nginx-controller 的 Service(SVC)暴露的端口,这是因为:
1. **Ingress-nginx-controller 的作用**:Ingress-nginx-controller 是一个实现 Ingress 资源的对象,它负责监听来自外部的流量,并根据 Ingress 规则将这些流量转发到相应的服务上。为了能够接收外部流量,Ingress-nginx-controller 需要在 Kubernetes 中暴露一个或多个端口。
2. **Service 的角色**:在 Kubernetes 中,Service 是定义如何访问一个或多个 Pod 的策略集合。对于 Ingress-nginx-controller 来说,通常会创建一个类型为 LoadBalancer 或 NodePort 的 Service,并将其映射到 Ingress-nginx-controller 的相应端口上。这样,外部流量就可以通过这个 Service 的端口访问到 Ingress-nginx-controller。
3. **域名与端口的关系**:当你使用域名访问一个服务时,DNS 系统会根据域名解析出对应的 IP 地址。但是,仅仅有 IP 地址还不够,因为在同一个 IP 地址上可能运行着多个服务,每个服务监听不同的端口。因此,你还需要在 Ingress 规则中指定目标服务的端口号,以便 Ingress-nginx-controller 能够正确地将流量转发到对应的服务上。
4. **安全性考虑**:默认情况下,Kubernetes 会为每个命名空间下的资源分配一个随机的、不重复的端口范围。如果你直接使用这些随机分配的端口来暴露 Ingress-nginx-controller 的服务,可能会导致安全问题。因此,建议显式地定义一个固定的端口范围,并通过 Service 资源将其映射到 Ingress-nginx-controller 的相应端口上。这样可以提高集群的安全性和可管理性。
5. **示例代码**:
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
spec:
rules:
- host: yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: your-service
port:
number: 80
```
在这个示例中,我们定义了一个 Ingress 资源,它将来自 `yourdomain.com` 的流量转发到名为 `your-service` 的服务上,并使用端口 80。同时,我们还需要一个 Service 资源来暴露 Ingress-nginx-controller 的服务:
```yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
```
请注意,这里的 `nodePort` 是可选的,但如果你想要通过节点 IP 和端口访问 Ingress-nginx-controller,则需要设置它。