我是 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
当然可以,但是通过LoadBalancer
Service
公开单个Pod
没有多大意义。如果你有一个Deployment
,它通常管理一组可以平衡实际负载的Pods
,LoadBalancer
就可以完成它的工作。但是,您仍然可以将其仅用于公开单个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-web
。site-web
是其中一个容器的名称(在您的site-home
Pod
内(。请记住:我们公开的是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
See'kubectl expose -h'
寻求帮助 和例子。
这里的关键点是:the pod has no labels and cannot be exposed
看起来您的Pod
没有定义任何必需的labels
,以便Service
可以从群集中的其他Pods
中选择此特定Pod
(或一组具有相同标签的类似Pods
(。Pod
定义中至少需要一个标签。在Pod
的metadata
部分下添加简单的标签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
范围内(可用。
和 'kubectl 暴露 pod site-web --type=LoadBalancer --port=8080 返回:来自服务器 (NotFound( 的错误:找不到 pod "site-web"。site-home 是 pod,site-web 是带有端口的容器 暴露了,有什么问题?
如果您没有带有名称"site-web"
的Pod
,则可以收到此类消息。在这里,您只是试图公开不存在的Pod
。
如果我从容器中公开了一个端口,该端口也会自动为 pod 公开
?
是的,您具有容器定义中定义的端口。您的Pods
会自动公开其中Containers
公开的所有端口。