概述
在 Kubernetes 中,容器是需要被托管的最小单元,它们从镜像创建而来,在 Kubernetes 集群中运行。而容器中可能会存在需要暴露给外界的服务,例如网页服务,API 服务等。这时候就需要在容器内部进行端口映射,将外部请求映射到容器内部对应的端口上。
本文将会讨论 Kubernetes 中的容器端口映射与流量转发的相关内容,包括 Kubernetes 中的 Service 以及 Ingress 等相关组件的使用。
容器端口映射
在 Kubernetes 中,容器的端口映射可以通过在 Pod Spec 中的 containers.ports
属性来进行配置。示例如下:
apiVersion: v1 kind: Pod metadata: name: example spec: containers: - name: example-container image: my-image ports: - containerPort: 80
在上面的示例中,容器将会暴露在 Pod
的 example-container
容器中的80端口中。需要注意的是,这里指定的端口是容器内部使用的端口,Kubernetes 会自动进行端口映射,将外部请求的流量转发到容器中指定的端口。
Service
在 Kubernetes 中,Service
是一种逻辑上的概念,它代表了一组部署在 Kubernetes 集群内的 Pod,可以提供统一的服务入口,并进行负载均衡。
下面是 Service
的一个示例:
apiVersion: v1 kind: Service metadata: name: example-service spec: selector: app: example-app ports: - name: http port: 80 targetPort: 8080 type: ClusterIP
在该示例中,定义了一个名为 example-service
的 Service
,在这个 Service
中,使用 selector
来指定需要暴露的 Pod,ports
用来定义该服务的端口映射,targetPort
指定了需要转发到 Pod 中对应的端口。
Service
还可以通过不同的 type
属性来指定不同的服务类型:
- ClusterIP:仅在集群内部可访问的虚拟 IP,可以被其他服务进行访问。
- NodePort:将 Kubernetes 集群中的一个端口映射到
Service
中的某个端口上,所以可以通过访问每个节点的对应端口来访问该Service
。 - LoadBalancer:支持使用外部负载均衡器来将请求流量转发给
Service
。
Ingress
虽然 Service
可以方便的进行容器间通信,但是 Service
的访问控制和路由并不够灵活,不能满足更加复杂的应用场景,例如:
- 根据请求头或者其它 http 协议特征来路由请求
- 多个服务通过端口共享一个 IP 地址,需要使用不同的路径来进行访问
为了解决上述问题,Kubernetes 提供了 Ingress
的概念。Ingress
是一个负责把外部流量转发到 Kubernetes 服务内的对象。
下面是 Ingress
的一个示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: /example pathType: Prefix backend: service: name: example-service port: name: http
在上述示例中,使用 Ingress
将外界流量转发到了 example-service
对应的服务上,这里通过 rules
定义了路由规则,host
指定了请求的 host 名称,path
指定了请求的路径,使用了 pathType
属性来指定路由路径匹配类型,backend
指定了需要转发对应的后台服务。
需要注意的是,Ingress
并不会自动创建 Kubernetes 管理的负载均衡器(例如 kube-proxy
),需要在部署时配置相应的负载均衡器或者使用已有的负载均衡器。
总结
在本文中,我们详细的讨论了 Kubernetes 中的容器端口映射与流量转发的相关内容,包括如何在容器内部进行端口映射,以及如何使用 Service
和 Ingress
进行流量的路由和负载均衡。希望本文能够对您有所帮助,并且让 Kubernetes 的使用更加得心应手。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a0f1c4add4f0e0ff91e8a4