在pod中从容器中暴露端口minikube kubernetes

wsxa1bj1  于 2023-06-21  发布在  Kubernetes
关注(0)|答案(1)|浏览(201)

我是K8s的新手,我将使用以下命令在pod中运行2个容器的minikube:

kubectl apply -f deployment.yaml

这个deployment.yml:

apiVersion: v1
kind: Pod
metadata:
  name: site-home
spec:

  restartPolicy: Never

  volumes:
  - name: v-site-home
    emptyDir: {}

  containers:


  - name: site-web
    image: site-home:1.0.0
    ports:
    - containerPort: 80
    volumeMounts:
    - name: v-site-home
      mountPath: /usr/share/nginx/html/assets/quotaLago
  
  - name: site-cron
    image: site-home-cron:1.0.0
    volumeMounts:
    - name: v-site-home
      mountPath: /app/quotaLago

我有一个共享卷,所以如果我明白我不能使用部署,而只能使用pod(也许是有状态集?))
在任何情况下,我都想在pod site-home中从container site-web暴露端口80。在官方文档中,我看到了以下部署:

kubectl expose deployment hello-node --type=LoadBalancer --port=8080

但我不能使用例如:

kubectl expose pod site-web --type=LoadBalancer --port=8080

知道吗?

ssm49v7z

ssm49v7z1#

但我不能使用例如:

kubectl expose pod site-web --type=LoadBalancer --port=8080

当然可以,但是通过LoadBalancer``Service暴露单个Pod没有多大意义。如果您有一个Deployment,它通常管理一组Pods,在这些Pods之间可以平衡实际负载,那么LoadBalancer就可以完成它的任务。但是,您仍然可以使用它来暴露单个Pod
请注意,您的容器暴露的是端口80,而不是8080container规范中的containerPort: 80),因此您需要在Service中将其指定为target-portkubectl expose命令可能如下所示:

kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80

如果您只为kubectl expose命令提供--port=8080标志,则它假定target-port的值与--port的值相同。您可以通过查看您刚刚创建的服务来轻松检查它:

kubectl get svc site-web -o yaml

你会在spec.ports部分看到这样的内容:

- nodePort: 32576
    port: 8080
    protocol: TCP
    targetPort: 8080

在正确暴露您的Pod(或Deployment)之后,即使用:

kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80

你会看到类似的东西:

- nodePort: 31181
    port: 8080
    protocol: TCP
    targetPort: 80

发出kubectl get services后,你应该会看到类似的输出:

NAME                            TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)          AGE
site-web                              ClusterIP      <Cluster IP>   <External IP>           8080:31188/TCP         4m42s

如果你在浏览器中转到http://<External IP>:8080或者运行curl http://<External IP>:8080,你应该会看到你网站的前端。
请记住,这个解决方案是有意义的,并且将在云环境中完全发挥作用,它能够为您提供真正的负载均衡器。请注意,如果你在Minikube中声明这样的Service类型,实际上它会创建NodePort服务,因为它无法为你提供真正的负载均衡器。因此,您的应用程序将在您的Node(您的Minikube VM)的IP地址上在范围30000-32767(在我的示例中是端口31181)中随机选择的端口上可用。
关于你对卷的问题:
我有一个共享卷,所以如果我明白我不能使用部署,而只能使用pod(也许是有状态集?))
是的,如果你想使用特定的EmptyDir卷,它不能在不同的Pods之间共享(即使它们被调度在同一节点上),它只能在同一Pod内的容器之间共享。如果你想使用Deployment,你需要考虑另一种存储解决方案,比如PersistentVolume

编辑

在第一时间我没有注意到你的命令中的错误:

kubectl expose pod site-web --type=LoadBalancer --port=8080

您试图公开不存在的Pod,因为您的Pod的名称是site-home,而不是site-website-web是一个容器的名称(在site-homePod中)。记住:我们是通过Service暴露Pod,而不是通过Service暴露containers
我改变了80-> 8080,但我总是来error:kubectl expose pod site-home --type=LoadBalancer --port=8080 return:error: couldn't retrieve selectors via --selector flag or introspection: the pod has no labels and cannot be exposed查看'kubectl expose -h'的帮助和示例。
这里的关键点是:the pod has no labels and cannot be exposed
看起来您的Pod没有定义任何labelsService可以从集群中的其他Pods中选择这个特定的Pod(或一组具有相同标签的类似Pods)。在Pod定义中至少需要一个标签。在Podmetadata部分下添加简单的标签name: site-web应该会有所帮助。在您的Pod定义中,它可能看起来像这样:

apiVersion: v1
kind: Pod
metadata:
  name: site-home
  labels:
    name: site-web
spec:
...

现在你甚至可以在你的服务中提供这个标签作为选择器,但是如果你省略了--selector标志,它应该会被自动处理:

kubectl expose pod site-home --type=LoadBalancer --port=8080 --target-port=80 --selector=name=site-web
    • 请注意:**Minikube中无法创建真正的负载均衡器,而会创建LoadBalancer类型的NodePort。命令kubectl get svc将告诉您应用程序在哪个端口(在30000-32767范围内)可用。

and kubectl expose pod site-web--type = LoadBalancer--port = 8080 return:来自服务器的错误(NotFound):pod "site-web"未找到。site-home是pod,site-web是暴露了端口的容器,有什么问题吗? 如果你没有一个名为"site-web"Pod,你可以期待这样的消息。在这里,您只是试图公开不存在的Pod。 如果我从容器中暴露了一个端口,那么该端口也会自动暴露给pod? 是的,您在容器定义中定义了端口。您的Pods会自动暴露Containers`在其中暴露的所有端口。

相关问题