[k8s不佳实践] k8s只使用nodeport和targetport的情况
通过只配置 `nodePort` 和 `targetPort`,你可以实现从集群外部通过固定端口访问后端 Pods。但这同时意味着你放弃了通过 Service 名称进行集群内部访问的便利。一般来说,推荐同时配置 `port`,以便支持内部和外部的访问方式。
你可以配置一个 Kubernetes Service,只使用 nodePort
和 targetPort
,不配置 port
。
这样做依然可以让外部流量通过 NodePort
访问后端 Pods。下面是一个示例配置:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
targetPort: 8080 # Pods 实际监听的端口
nodePort: 30080 # Service 在节点上的端口,用于集群外部访问
配置说明
- type: NodePort:指定 Service 类型为
NodePort
。 - targetPort: 8080:后端 Pods 实际监听的端口。
- nodePort: 30080:Service 在每个节点上的固定端口,用于集群外部访问。
nodePort
的范围通常在 30000-32767 之间。
访问方式
-
集群内部访问:
- 在这种配置中,没有配置
port
,因此不提供集群内部通过 Service 名称访问的能力。 - 内部访问需要直接访问 Pods IP 和端口(不推荐)或者通过其他方式,如配置
port
或使用 Ingress。
- 在这种配置中,没有配置
-
集群外部访问:
- 通过任意节点的 IP 和
30080
端口访问 Service,例如http://<node-ip>:30080
,Service 会将流量转发到后端 Pods 的8080
端口。
- 通过任意节点的 IP 和
注意事项
- 不配置
port
意味着你放弃了通过 Service 名称在集群内部访问服务的能力,只能通过节点 IP 和nodePort
进行外部访问。 - 确保你使用的
nodePort
在所有节点上是唯一的,避免端口冲突。
这样做的缺点
通过只配置 nodePort
和 targetPort
,你可以实现从集群外部通过固定端口访问后端 Pods。
但这同时意味着你放弃了通过 Service 名称进行集群内部访问的便利。一般来说,推荐同时配置 port
,以便支持内部和外部的访问方式。
使用 NodePort
进行容器之间的访问
如果你决定在集群内部通过 NodePort
进行容器间的访问,可以通过以下步骤实现:
- Service 配置:配置一个
NodePort
类型的 Service。
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
targetPort: 8080 # Pods 实际监听的端口
nodePort: 30080 # Service 在节点上的端口,用于集群外部访问
- 访问方式:集群内部的其他 Pods 通过节点的 IP 和
NodePort
端口来访问这个 Service。
配置示例
假设你的 my-app
Pods 部署在集群中,以下是完整的 Service 配置示例:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
targetPort: 8080
nodePort: 30080
集群内部访问示例
假设你有一个节点 IP 为 192.168.1.10
,其他 Pods 可以通过以下方式访问该 Service:
import requests
# 访问 my-nodeport-service,通过节点的 IP 和 NodePort 端口
response = requests.get('http://192.168.1.10:30080')
注意事项
- 网络开销:使用
NodePort
进行容器间访问会增加不必要的网络跳跃,降低性能。 - 可用性:节点 IP 可能会发生变化,因此需要动态更新服务地址。
- 安全性:暴露
NodePort
可能带来安全风险,尤其是在集群外部使用时。
推荐的访问方式
通常推荐以下方式进行容器间访问:
-
ClusterIP(默认类型):
- 适合集群内部的容器间通信,通过 Service 名称进行访问。
apiVersion: v1 kind: Service metadata: name: my-clusterip-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080
通过
my-clusterip-service:80
访问 Service。 -
Headless Service:
- 适合需要直接访问 Pods 的场景,通过 DNS 解析得到 Pods 的 IP 列表。
apiVersion: v1 kind: Service metadata: name: my-headless-service spec: clusterIP: None selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080
通过
my-headless-service
解析到后端 Pods 的 IP 列表。
结论
虽然可以使用 NodePort
进行容器间的访问,但在集群内部,通常推荐使用 ClusterIP
或 Headless Service
,这样可以更高效地管理网络流量,减少不必要的开销并提高安全性和稳定性。
容器之间可以通过 NodePort
进行访问,但这种方式并不常见,通常是在一些特定场景下使用。一般情况下,
容器之间的访问是通过 ClusterIP
(Service 默认类型)或 Headless Service
来实现的。这些方式更高效并且没有额外的网络开销。
更多推荐
所有评论(0)