我是 Kubernetes 新手,正在将 Docker 容器部署到 Minikube 服务器。
我已经在 Docker 上安装了 Minikube,该 Docker 运行在具有本地 IP 地址
10.0.0.92
的 Linux 服务器上。当我检查 Minikube 的 IP 时,它返回 192.168.49.2
。
我正在遵循 Docker 网站上的“部署到 Kubernetes”指南。
这是我的部署和服务配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-name
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: app-name
template:
metadata:
labels:
app: app-name
spec:
containers:
- name: app-name
image: docker-hub-username/app-name:latest
ports:
- containerPort: 9600
---
apiVersion: v1
kind: Service
metadata:
name: app-name
namespace: default
spec:
type: NodePort
selector:
app: app-name
ports:
- port: 9600
targetPort: 9600
nodePort: 30001
应用部署文件后,我注意到 pod 正在不同的 IP 上运行,具体来说
10.244.0.18
。
我检查了 pod 的日志,以下是我发现的内容:
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when the container is destroyed. For more information, visit https://aka.ms/aspnet/dataprotectionwarning
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {0078a8d7-d992-4dfd-bd00-f5b1a8595f49} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://[::]:8080
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
但是,当我检查服务器上的服务信息时,我看到了:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
app-name NodePort 10.103.221.235 <none> 9600:30001/TCP 3h5m
当我运行命令
kubectl describe svc app-name
时,这是输出:
Name: app-name
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=app-name
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.103.221.235
IPs: 10.103.221.235
Port: <unset> 9600/TCP
TargetPort: 9600/TCP
NodePort: <unset> 30001/TCP
Endpoints: 10.244.0.18:9600
Session Affinity: None
External Traffic Policy: Cluster
Internal Traffic Policy: Cluster
Events: <none>
最后,当我运行命令
minikube service api-intranet-gateway --url
时,它返回http://192.168.49.2:30001
根据“部署到 Kubernetes”指南,我被指示通过
http://localhost:30001
访问我的应用程序。但是,我无法从本地主机或通过服务 URL http://192.168.49.2:30001
访问它。
您能指导我如何解决这个问题吗?另外,您能否向我展示如何设置端口转发,以便它侦听我的本地主机上的端口 9600 (
10.0.0.92
)?我非常感谢您的帮助。
https://docs.docker.com/ 上的说明主要适用于 Docker 专有桌面产品中嵌入的 Kubernetes。 如果您使用其他开发者 Kubernetes 设置(Minikube、Kind、k3d),那么您访问 NodePort 服务等内容所需的 URL 将会有所不同。
一般来说,在 Kubernetes 中,NodePort 类型的服务可以通过集群中每个节点上的相同 TCP 端口号进行访问。 可能有数十个或数百个节点,并且它们没有在kubectl describe
输出中具体列出。访问您需要的服务
官方方法是使用
minikube service api-intranet-gateway --url
您可以看到 URL 由 minikube ip
地址(可从主机访问的节点地址)和
kubectl describe service
分配的 NodePort 端口号组成。 该路径也在文档中提到过。 Minikube 通常运行在容器或虚拟机中。 因此,Minikube 服务几乎永远无法以
localhost
的方式访问。