Kubernetes 从容器中暴露端口(在吊舱中)
我是K8s新手,我将使用以下命令尝试minikube,其中2个容器在吊舱中运行: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
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