这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
服务网络
Kubernetes 服务网络
https://kubernetes.io/zh-cn/docs/concepts/services-networking/
Kubernetes 网络模型
Kubernetes 强制要求所有网络设施都满足以下基本要求(从而排除了有意隔离网络的策略):
- Pod 能够与所有其他节点上的 Pod 通信, 且不需要网络地址转译(NAT)
- 节点上的代理(比如:系统守护进程、kubelet)可以和节点上的所有 Pod 通信
Kubernetes 的 IP 地址存在于 Pod
范围内 —— 容器共享它们的网络命名空间 —— 包括它们的 IP 地址和 MAC 地址。
Kubernetes 网络解决四方面的问题:
1 - Service
Kubernetes Service
https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/
Service 是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
动机
- Pod 是非永久性资源
- 每个 Pod 都有自己的 IP 地址
- 在 Deployment 中,在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。
Service 资源
Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod 和一种可以访问它们的策略
定义 Service
定义 service 需要最基本的两个元素:
- service selector / 服务选择算符
- service port
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
小知识:Pod 中的端口定义是有名字的,可以在 Service 的 targetPort
属性中引用这些名称。这样可以只修改pod定义,service 这边就自动改过来了。
没有选择算符的 Service
服务没有选择算符时,不会自动创建相应的 EndpointSlice(和旧版 Endpoint)对象。 可以通过手动添加 EndpointSlice 对象,将服务手动映射到运行该服务的网络地址和端口
发布服务(服务类型)
Kubernetes ServiceTypes
允许指定你所需要的 Service 类型。
Type
的取值以及行为如下:
ClusterIP
:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是你没有为服务显式指定 type
时使用的默认值。
NodePort
:通过每个节点上的 IP 和静态端口(NodePort
)暴露服务。 为了让节点端口可用,Kubernetes 设置了集群 IP 地址,这等同于你请求 type: ClusterIP
的服务。
LoadBalancer
:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort
服务和 ClusterIP
服务上。
ExternalName
:通过返回 CNAME
记录和对应值,可以将服务映射到 externalName
字段的内容(例如,foo.bar.example.com
)。 无需创建任何类型代理。
特别注意: type
字段被设计为嵌套功能 - 每个级别都添加到前一个级别。
也可以使用 Ingress 来暴露自己的服务。
NodePort 类型
如果你将 type
字段设置为 NodePort
,则 Kubernetes 控制平面将在 --service-node-port-range
标志指定的范围内分配端口(默认值:30000-32767)。
选择你自己的端口
如果需要特定的端口号,你可以在 nodePort
字段中指定一个值。
- 需要自己注意可能发生的端口冲突
- 必须使用有效的端口号,该端口号在配置用于 NodePort 的范围内。
2 - Ingress
Kubernetes Ingress
https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
Ingress 是对集群中服务的外部访问进行管理的 API 对象
术语
- 节点(Node): Kubernetes 集群中的一台工作机器,是集群的一部分。
- 集群(Cluster): 一组运行由 Kubernetes 管理的容器化应用程序的节点。 在此示例和在大多数常见的 Kubernetes 部署环境中,集群中的节点都不在公共网络中。
- 边缘路由器(Edge Router): 在集群中强制执行防火墙策略的路由器。可以是由云提供商管理的网关,也可以是物理硬件。
- 集群网络(Cluster Network): 一组逻辑的或物理的连接,根据 Kubernetes 网络模型在集群内实现通信。
- 服务(Service):Kubernetes 服务(Service), 使用标签选择器(selectors)辨认一组 Pod。 除非另有说明,否则假定服务只具有在集群网络中可路由的虚拟 IP。
Ingress 是什么?
Ingress 暴露从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的 Service。