在 pod minikube kubernetes 中从容器中公开端口



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

kubectl apply -f deployment.yaml

和这个部署.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(也许是有状态集?

无论如何,我想从容器站点主页中的容器站点网络公开端口 80。 在官方文档中,我看到了部署:

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

但我不能使用例如:

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

知道吗?

但我不能使用例如:

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

当然可以,但是通过LoadBalancerService公开单个Pod没有多大意义。如果你有一个Deployment,它通常管理一组可以平衡实际负载的PodsLoadBalancer就可以完成它的工作。但是,您仍然可以将其仅用于公开单个Pod

请注意,您的容器公开端口80,而不是8080(container规范中containerPort: 80(,因此您需要在Service中将其指定为target-port。您的kubectl 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 服务,因为它无法为您提供真正的负载均衡器。因此,您的应用程序将在范围30000-32767中随机选择的端口上的节点(您的 Minikube VM 的(IP 地址上可用(在我的示例中它是端口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内(。请记住:我们公开的是Pod,而不是通过Servicecontainers

我更改了 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 exposedSee'kubectl expose -h'寻求帮助 和例子。

这里的关键点是:the pod has no labels and cannot be exposed

看起来您的Pod没有定义任何必需的labels,以便Service可以从群集中的其他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 中,无法创建真正的负载均衡器,而是将创建LoadBalancerNodePort类型。命令kubectl get svc将告诉您应用程序在哪个端口(在30000-32767范围内(可用。

和 'kubectl 暴露 pod site-web --type=LoadBalancer --port=8080 返回:来自服务器 (NotFound( 的错误:找不到 pod "site-web"。site-home 是 pod,site-web 是带有端口的容器 暴露了,有什么问题?

如果您没有带有名称"site-web"Pod,则可以收到此类消息。在这里,您只是试图公开不存在的Pod

如果我从容器中公开了一个端口,该端口也会自动为 pod 公开

是的,您具有容器定义中定义的端口。您的Pods会自动公开其中Containers公开的所有端口。

最新更新