无法连接到 Kubernetes NodePort 服务
Cannot connect to Kubernetes NodePort Service
我有一个 运行ning pod 是使用以下内容创建的 pod-definition.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: microservice-one-pod-name
labels:
app: microservice-one-app-label
type: front-end
spec:
containers:
- name: microservice-one
image: vismarkjuarez1994/microserviceone
ports:
- containerPort: 2019
然后我使用以下 service-definition.yaml
创建了一个服务:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 30008
targetPort: 2019
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
然后我 运行 kubectl describe node minikube
找到我应该连接到的节点 IP -- 结果:
Addresses:
InternalIP: 192.168.49.2
Hostname: minikube
但是当我 运行 以下 curl 命令时,我没有得到任何响应:
curl 192.168.49.2:30008
当我尝试从浏览器访问 192.168.49.2:30008
时请求也超时。
pod 日志显示容器已启动并且 运行ning。为什么我无法访问我的服务?
问题是您正试图通过 port
参数访问您的服务,该参数是服务将公开的内部端口,即使使用 NodePort
类型也是如此。
您正在搜索的参数称为 nodePort
,可以选择与 port
和 targetPort
一起指定。引用 documentation:
By default and for convenience, the Kubernetes control plane will
allocate a port from a range (default: 30000-32767
)
由于您没有指定 nodePort
,系统会自动选取范围内的一个。您可以通过以下方式查看是哪一个:
kubectl get svc -owide
然后在该端口从外部访问您的服务。
作为替代方案,您可以将服务定义更改为:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 30008
targetPort: 2019
nodePort: 30008
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
但请记住,您可能需要删除您的服务并重新创建它以更改分配的 nodePort
。
我认为您错过了服务中的端口:
apiVersion: v1
kind: Pod
metadata:
name: microservice-one-pod-name
labels:
app: microservice-one-app-label
type: front-end
spec:
containers:
- name: microservice-one
image: vismarkjuarez1994/microserviceone
ports:
- containerPort: 2019
你的服务应该是这样的:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 2019
targetPort: 2019
nodePort: 30008
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
如果您想使用 Minikube 尝试 Ingress,您可以在启用 Minikube ingress 后访问您的应用程序。
minikube addons enable ingress
我有一个 运行ning pod 是使用以下内容创建的 pod-definition.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: microservice-one-pod-name
labels:
app: microservice-one-app-label
type: front-end
spec:
containers:
- name: microservice-one
image: vismarkjuarez1994/microserviceone
ports:
- containerPort: 2019
然后我使用以下 service-definition.yaml
创建了一个服务:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 30008
targetPort: 2019
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
然后我 运行 kubectl describe node minikube
找到我应该连接到的节点 IP -- 结果:
Addresses:
InternalIP: 192.168.49.2
Hostname: minikube
但是当我 运行 以下 curl 命令时,我没有得到任何响应:
curl 192.168.49.2:30008
当我尝试从浏览器访问 192.168.49.2:30008
时请求也超时。
pod 日志显示容器已启动并且 运行ning。为什么我无法访问我的服务?
问题是您正试图通过 port
参数访问您的服务,该参数是服务将公开的内部端口,即使使用 NodePort
类型也是如此。
您正在搜索的参数称为 nodePort
,可以选择与 port
和 targetPort
一起指定。引用 documentation:
By default and for convenience, the Kubernetes control plane will allocate a port from a range (default:
30000-32767
)
由于您没有指定 nodePort
,系统会自动选取范围内的一个。您可以通过以下方式查看是哪一个:
kubectl get svc -owide
然后在该端口从外部访问您的服务。
作为替代方案,您可以将服务定义更改为:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 30008
targetPort: 2019
nodePort: 30008
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
但请记住,您可能需要删除您的服务并重新创建它以更改分配的 nodePort
。
我认为您错过了服务中的端口:
apiVersion: v1
kind: Pod
metadata:
name: microservice-one-pod-name
labels:
app: microservice-one-app-label
type: front-end
spec:
containers:
- name: microservice-one
image: vismarkjuarez1994/microserviceone
ports:
- containerPort: 2019
你的服务应该是这样的:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 2019
targetPort: 2019
nodePort: 30008
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
如果您想使用 Minikube 尝试 Ingress,您可以在启用 Minikube ingress 后访问您的应用程序。
minikube addons enable ingress