kubernetes 集装箱港口吊舱与集装箱港口服务

z0qdvdin  于 2023-03-12  发布在  Kubernetes
关注(0)|答案(4)|浏览(146)

我想了解服务端口和Pod容器端口之间的Map。
我是否需要将容器端口定义为我的pod的一部分,也定义为我的服务的一部分?或者只将其公开为服务的一部分就可以了?

iszxjhcz

iszxjhcz1#

作为pod定义的一部分,containerPort仅供参考,如果您希望将其作为集群或节点中的服务公开,则最终必须创建一个服务。
回答你的问题,是的,只要把它作为Kubernetes服务的一部分公开就足够了。作为pod定义的一部分提及它是一个很好的做法,这样当有人查看定义时就可以理解容器服务运行的端口。
这是非常好的解释here
Kubernetes官方参考文档

gwo2fgha

gwo2fgha2#

容器公开的端口和服务的端口在Kubernetes中是不同的概念。
如果你想为你的应用创建一个服务,你的pod必须有一个端口。例如,这是一个pod yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 8080

containerPort设置应用将公开的端口。
要通过服务访问此应用程序,您必须使用以下yaml创建服务对象:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    run: my-nginx

在这个yaml中,关键字port设置了服务的端口,targetPort是你的应用的端口,所以服务的端口是不同的。
以下是官方文档中的一个很好的定义:
Kubernetes服务是一种抽象,它定义了一组逻辑Pod以及访问它们的策略(有时称为微服务)。服务所针对的Pod集(通常)由标签选择器确定(请参阅下文,了解您可能希望服务没有选择器的原因)。

igsr9ssn

igsr9ssn3#

让我们举一个例子,并试图理解的帮助下,图。考虑一个集群有2个节点和一个服务。每个节点有2个pod和每个pod有2个容器,即应用容器和网络容器。
NodePort:30001(每个节点的群集级公开端口)
端口:80(服务端口)
targetPort:8080(应在Docker expose中提及相同的应用程序容器端口)
targetPort:80(应在Docker expose中提及相同的Web容器端口)
下面的图表应该能帮助我们更好地理解它。

有关参考和更多详细信息,请参阅以下链接https://theithollow.com/2019/02/05/kubernetes-service-publishing/

kxkpmulp

kxkpmulp4#

实际上,在我看来,有一种情况是pod.spec.ports[].containerPort被“使用”了。
我同意所有的,主要是它的信息,只有,考虑到设计的所有端口都可从吊舱。
但是,如果定义了ports[*].name。这将为端口提供一个Map,该端口可以通过服务进行外部寻址。这有助于简化端口Map。

$kubectl expose pod mypod --port=300 --target-port=MostfamousPort

端口由“名称”寻址,而不是实际端口ID

ports:
- containerPort: 80
  name: MostfamousPort

相关问题