Kubernetes 是一款流行的容器编排工具,它可以帮助我们管理和部署容器化应用。除了内部服务,Kubernetes 还支持外部服务。本文将介绍 Kubernetes 外部服务的实现方式,包括 NodePort、LoadBalancer 和 ExternalName。
NodePort
NodePort 是 Kubernetes 中最简单的方式,它将容器端口映射到节点的端口上。这意味着所有节点的该端口上将暴露相同的服务。可以通过以下 YAML 文件来创建 NodePort 服务:
apiVersion: v1 kind: Service metadata: name: my-nodeport spec: type: NodePort selector: app: my-app ports: - protocol: TCP port: 8080 targetPort: 80
这个 YAML 文件定义了一个名为 my-nodeport
的服务,它将容器的 80 号端口映射到节点的 30000~32767 之间的任意一个端口上。这里的 selector
字段指定了要暴露的 Pod,它使用了标签选择器来筛选出名为 my-app
的 Pod。
LoadBalancer
LoadBalancer 服务类型是在 NodePort 基础之上实现的,用于管理云平台上的负载均衡器。如果使用 LoadBalancer 服务类型,则需要运行在云平台上的 Kubernetes 集群。可以通过以下 YAML 文件来创建 LoadBalancer 服务:
apiVersion: v1 kind: Service metadata: name: my-loadbalancer annotations: service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: 'true' spec: type: LoadBalancer selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080
这个 YAML 文件同样定义了一个名为 my-loadbalancer
的服务,它将容器的 8080 号端口映射到负载均衡器上的 80 号端口。在云平台上,LoadBalancer 定义了一个公网 IP 地址,用于外部服务的访问。
另外,在 DigitalOcean 的 Kubernetes 集群上,需要使用 service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol
注解来启用 Proxy Protocol,以确保 TCP 连接的追踪和记录。
ExternalName
ExternalName 是 Kubernetes 1.3 版本中引入的方式,它允许将服务名称映射到外部的 CNAME 记录。可以通过以下 YAML 文件来创建 ExternalName 服务:
apiVersion: v1 kind: Service metadata: name: my-externalname spec: type: ExternalName externalName: myapp.server.com
这个 YAML 文件定义了一个名为 my-externalname
的服务,它将同名的 DNS 记录 my-externalname
映射到 myapp.server.com
这个外部服务上。
总结
Kubernetes 提供了多种方式来实现外部服务,其中 NodePort 是最简单、最基础的方式。LoadBalancer 则适用于在云平台上运行的 Kubernetes 集群,并可以提供公网 IP 地址。ExternalName 则是映射到 CNAME 记录上的方式,适用于需要与外部服务进行互操作的场景。
通过这些方式,我们可以更灵活、高效地对容器化应用进行管理和部署。
参考代码:https://github.com/kubernetes/examples
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a4aa8aadd4f0e0ffcfb9ed