Kubernetes 中的容器端口映射与流量转发

概述

在 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

在上面的示例中,容器将会暴露在 Podexample-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-serviceService,在这个 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 中的容器端口映射与流量转发的相关内容,包括如何在容器内部进行端口映射,以及如何使用 ServiceIngress 进行流量的路由和负载均衡。希望本文能够对您有所帮助,并且让 Kubernetes 的使用更加得心应手。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a0f1c4add4f0e0ff91e8a4


纠错反馈