Kubernetes 从容器中暴露端口(在吊舱中)

Kubernetes 从容器中暴露端口(在吊舱中),kubernetes,kubectl,minikube,Kubernetes,Kubectl,Minikube,我是K8s新手,我将使用以下命令尝试minikube,其中2个容器在吊舱中运行: kubectl apply -f deployment.yaml 而这个部署.yml: apiVersion:v1 种类:豆荚 元数据: 名称:网站主页 规格: 餐馆政策:永不 卷数: -名称:v-site-home emptyDir:{} 容器: -名称:网站 图片:站点主页:1.0.0 端口: -集装箱港口:80 体积数量: -名称:v-site-home 挂载路径:/usr/share/nginx/htm

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

kubectl apply -f deployment.yaml
而这个部署.yml:

apiVersion:v1 种类:豆荚 元数据: 名称:网站主页 规格: 餐馆政策:永不 卷数: -名称:v-site-home emptyDir:{} 容器: -名称:网站 图片:站点主页:1.0.0 端口: -集装箱港口:80 体积数量: -名称:v-site-home 挂载路径:/usr/share/nginx/html/assets/quotaLago -名称:站点cron 图:站点主页cron:1.0.0 体积数量: -名称:v-site-home 挂载路径:/app/quotaLago 但我不能使用例如:

kubectl expose pod site-web --type=LoadBalancer --port=8080
当然可以,但是通过
负载平衡器
服务
公开单个
Pod
没有多大意义。如果您有一个
部署
,它通常管理一组
吊舱
,在这些吊舱之间可以平衡实际负载,
负载平衡器
完成它的工作。但是,您仍然可以仅将其用于公开单个
Pod

请注意,您的容器公开的是端口
80
,而不是
8080
containerPort:80
在您的
container
规范中),因此您需要在
服务中将其指定为
目标端口。您的
kubectl expose
命令可能如下所示:

kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80
如果只向
kubectl expose
命令提供
--port=8080
标志,则假定
目标端口的值与
--port
的值相同。您可以通过查看刚刚创建的服务轻松检查:

kubectl get svc site-web -o yaml
您将在
spec.ports
部分看到类似的内容:

- nodePort: 32576
    port: 8080
    protocol: TCP
    targetPort: 8080
正确暴露
吊舱
(或
展开
)后,即使用:

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
您试图公开不存在的
Pod
,因为您的
Pod
的名称是
site home
,而不是
site web
site web
是您的一个容器的名称(在您的
site home
Pod
中)。记住:我们是通过
服务
暴露
吊舱
,而不是
容器


我更改80->8080,但我总是出现
错误:kubectl expose pod
站点主页--类型=负载平衡器--端口=8080返回:错误:无法
通过--selector标志或内省检索选择器:pod具有
无标签且无法公开
有关帮助,请参见
'kubectl expose-h'
和例子

这里的关键点是:
pod没有标签,不能暴露

您的
Pod
似乎没有定义任何所需的
标签,以便
服务
可以从集群中的其他
Pod
中选择此特定
Pod
(或具有相同标签的一组类似
Pod
)。您的
Pod
定义中至少需要一个标签。在
Pod
metadata
部分下添加简单标签
name:siteweb
,应该会有所帮助。在您的
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中,无法创建真正的负载平衡器,将创建而不是
负载平衡器
节点端口
类型。命令
kubectl get svc
将告诉您应用程序将在哪个端口(范围
30000-32767
)可用

和'kubectl expose pod site web--type=LoadBalancer --端口=8080返回:服务器错误(未找到):未找到pods“站点web”。站点主页是pod,站点web是带有端口的容器 暴露了,有什么问题吗

如果您没有名为“site web”
Pod
,您可以期待这样的消息。在这里,您只是试图公开不存在的
Pod

如果我从容器中公开了一个端口,那么该端口将自动公开 豆荚也是这样吗


是的,您已经在容器定义中定义了端口。您的
pod
会自动公开其中的
容器所公开的所有端口。

您会遇到什么错误!!使用
kubectl expose pod
命令,给定pod中的容器也共享IP地址和端口空间,可以通过本地主机找到彼此。请参见我对mario回答的评论I change 80->8080,但我总是遇到错误:
kubectl expose pod site home--type=LoadBalancer--port=8080
return:
error:无法通过--selector标志或内省检索选择器:pod没有标签,无法公开请参见'kubectl expose-h'帮助和示例
kubectl expose pod site web--type=LoadBalancer--port=8080
返回:
服务器错误(未找到):pods“site web”未找到
site home是pod,site web是暴露端口的容器,问题是什么?如果我从容器中暴露了一个端口,该端口也会自动暴露在pod中?请参阅我答案的编辑部分。
kubectl expose pod site-home --type=LoadBalancer --port=8080 --target-port=80 --selector=name=site-web