无法访问通过 NodePort 公开的 Kubernetes 服务
Can't Access Kubernetes Service Exposed via NodePort
我正在使用 minikube 在最新的 MacOS 上测试 kubernetes。
这是我的相关 YAML:
namespace.yml
apiVersion: v1
kind: Namespace
metadata:
name: micro
labels:
name: micro
deployment.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: adderservice
spec:
replicas: 1
template:
metadata:
labels:
run: adderservice
spec:
containers:
- name: adderservice
image: jeromesoung/adderservice:0.0.1
ports:
- containerPort: 8080
service.yml
apiVersion: v1
kind: Service
metadata:
name: adderservice
labels:
run: adderservice
spec:
ports:
- port: 8080
name: main
protocol: TCP
targetPort: 8080
selector:
run: adderservice
type: NodePort
经过运行minikube start
,我部署的步骤如下:
kubectl create -f namespace.yml
创建命名空间
kubectl config set-context minikube --namespace=micro
kubectl create -f deployment.yml
kubectl create -f service.yml
然后,我使用以下命令获取 NodeIP 和 NodePort:
kubectl get services
获取 NodePort
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
adderservice NodePort 10.99.155.255 <none> 8080:30981/TCP 21h
minikube ip
获取节点IP
$ minikube ip
192.168.99.103
但是当我卷曲时,我总是 Connection Refused 像这样:
$ curl http://192.168.99.103:30981/add/1/2
curl: (7) Failed to connect to 192.168.99.103 port 30981: Connection refused
所以我检查了节点、pod、部署和端点如下:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 23h v1.13.3
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
adderservice-5b567df95f-9rrln 1/1 Running 0 23h
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
adderservice 1 1 1 1 23h
$ kubectl get endpoints
NAME ENDPOINTS AGE
adderservice 172.17.0.5:8080 21h
我还检查了来自 minikube 的服务列表:
$ minikube service -n micro adderservice --url
http://192.168.99.103:30981
我读过很多关于通过 NodePorts 访问 k8s 服务的帖子。据我所知,我应该能够毫无问题地访问该应用程序。我唯一怀疑的是我使用的是自定义名称空间。这会导致访问问题吗?
我知道命名空间会更改 DNS,因此,为了完整起见,我还 运行 下面的命令:
$ kubectl exec -ti adderservice-5b567df95f-9rrln -- nslookup kubernetes.default
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: kubernetes.default.svc.cluster.local
Address: 10.96.0.1
$ kubectl exec -ti adderservice-5b567df95f-9rrln -- nslookup kubernetes.micro
Server: 10.96.0.10
Address: 10.96.0.10#53
Non-authoritative answer:
Name: kubernetes.micro
Address: 198.105.244.130
Name: kubernetes.micro
Address: 104.239.207.44
有人能帮帮我吗?谢谢。
检查服务是否真的在监听 8080。
在容器内尝试 telnet。
telnet 127.0.0.1 8080
.
.
.
telnet 172.17.0.5 8080
错误Connection Refused
主要表示容器内的应用程序不接受目标接口上的请求或未通过预期端口映射。
您需要注意的事项:
- 确保您的应用程序绑定到
0.0.0.0
,以便它可以像在 public 外部或通过其他容器接收来自容器外部的请求。
- 确保您的应用程序确实如预期的那样监听
containerPort
和 targetPort
在您的情况下,您必须确保 ADDERSERVICE_SERVICE_HOST
等于 0.0.0.0
并且 ADDERSERVICE_SERVICE_PORT
等于 8080
,这应该与 [=13= 的值相同] 在 service.yml
和 containerPort
在 deployment.yml
没有回答问题,但如果有人像我一样用谷歌搜索来这里遇到同样的问题。这是我对同样问题的解决方案。
我的Mac系统IP和minikube IP不一样
所以 localhost:port 没有用,而是尝试获取 IP
minikube ip
稍后,使用 IP:Port 访问该应用程序,它就可以运行了。
我正在使用 minikube 在最新的 MacOS 上测试 kubernetes。
这是我的相关 YAML:
namespace.yml
apiVersion: v1
kind: Namespace
metadata:
name: micro
labels:
name: micro
deployment.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: adderservice
spec:
replicas: 1
template:
metadata:
labels:
run: adderservice
spec:
containers:
- name: adderservice
image: jeromesoung/adderservice:0.0.1
ports:
- containerPort: 8080
service.yml
apiVersion: v1
kind: Service
metadata:
name: adderservice
labels:
run: adderservice
spec:
ports:
- port: 8080
name: main
protocol: TCP
targetPort: 8080
selector:
run: adderservice
type: NodePort
经过运行minikube start
,我部署的步骤如下:
kubectl create -f namespace.yml
创建命名空间kubectl config set-context minikube --namespace=micro
kubectl create -f deployment.yml
kubectl create -f service.yml
然后,我使用以下命令获取 NodeIP 和 NodePort:
kubectl get services
获取 NodePort
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
adderservice NodePort 10.99.155.255 <none> 8080:30981/TCP 21h
minikube ip
获取节点IP
$ minikube ip
192.168.99.103
但是当我卷曲时,我总是 Connection Refused 像这样:
$ curl http://192.168.99.103:30981/add/1/2
curl: (7) Failed to connect to 192.168.99.103 port 30981: Connection refused
所以我检查了节点、pod、部署和端点如下:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 23h v1.13.3
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
adderservice-5b567df95f-9rrln 1/1 Running 0 23h
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
adderservice 1 1 1 1 23h
$ kubectl get endpoints
NAME ENDPOINTS AGE
adderservice 172.17.0.5:8080 21h
我还检查了来自 minikube 的服务列表:
$ minikube service -n micro adderservice --url
http://192.168.99.103:30981
我读过很多关于通过 NodePorts 访问 k8s 服务的帖子。据我所知,我应该能够毫无问题地访问该应用程序。我唯一怀疑的是我使用的是自定义名称空间。这会导致访问问题吗?
我知道命名空间会更改 DNS,因此,为了完整起见,我还 运行 下面的命令:
$ kubectl exec -ti adderservice-5b567df95f-9rrln -- nslookup kubernetes.default
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: kubernetes.default.svc.cluster.local
Address: 10.96.0.1
$ kubectl exec -ti adderservice-5b567df95f-9rrln -- nslookup kubernetes.micro
Server: 10.96.0.10
Address: 10.96.0.10#53
Non-authoritative answer:
Name: kubernetes.micro
Address: 198.105.244.130
Name: kubernetes.micro
Address: 104.239.207.44
有人能帮帮我吗?谢谢。
检查服务是否真的在监听 8080。
在容器内尝试 telnet。
telnet 127.0.0.1 8080
.
.
.
telnet 172.17.0.5 8080
错误Connection Refused
主要表示容器内的应用程序不接受目标接口上的请求或未通过预期端口映射。
您需要注意的事项:
- 确保您的应用程序绑定到
0.0.0.0
,以便它可以像在 public 外部或通过其他容器接收来自容器外部的请求。 - 确保您的应用程序确实如预期的那样监听
containerPort
和targetPort
在您的情况下,您必须确保 ADDERSERVICE_SERVICE_HOST
等于 0.0.0.0
并且 ADDERSERVICE_SERVICE_PORT
等于 8080
,这应该与 [=13= 的值相同] 在 service.yml
和 containerPort
在 deployment.yml
没有回答问题,但如果有人像我一样用谷歌搜索来这里遇到同样的问题。这是我对同样问题的解决方案。
我的Mac系统IP和minikube IP不一样
所以 localhost:port 没有用,而是尝试获取 IP
minikube ip
稍后,使用 IP:Port 访问该应用程序,它就可以运行了。