Reputation: 31
Following a tutorial on Kubernetes and got stuck after the logs look fine, but the port exposed doesn't work : "Connection Refused" using Chrome / curl.
Used a yaml file to power up the service via NodePort / ClusterIP.
posts-srv.yaml - Updated
apiVersion: v1
kind: Service
metadata:
name: posts-srv
spec:
type: NodePort
selector:
app: posts
ports:
- name: posts
protocol: TCP
port: 4000
targetPort: 4000
nodePort: 32140
posts-depl.yaml - Updated
apiVersion: apps/v1
kind: Deployment
metadata:
name: posts-depl
spec:
replicas: 1
selector:
matchLabels:
app: posts
template:
metadata:
labels:
app: posts
spec:
containers:
- name: posts
image: suraniadi/posts
ports:
- containerPort: 4000
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
posts-depl 1/1 1 1 27m
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 27h
posts-srv NodePort 10.111.64.122 <none> 4000:32140/TCP 21m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
posts-depl-79b6889f89-rxdv2 1/1 Running 0 26m
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-13T13:23:52Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-13T13:15:20Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Upvotes: 3
Views: 4842
Reputation: 90
In case you are using minikube, you should try this to get the ip
minikube ip
after that try with the port from your yaml file:
curl http://<id_above>:<port>
It should work.
Upvotes: 0
Reputation: 8471
In addition to @Hajed answer(upvoted without any doubts) I would like to again mention Type NodePort Documentation, especially next part:
Note that this Service is visible as
<NodeIP>:spec.ports[*].nodePort
and.spec.clusterIP:spec.ports[*].port
IN order your nodePort
service works as expected, please do not forget to use spec.ports[*].nodePort
Your service should be
apiVersion: v1
kind: Service
metadata:
name: posts-srv
spec:
type: NodePort
selector:
app: posts
ports:
- port: 4000
targetPort: 4000
nodePort: 32140 #you can use here 30000-32767 range. Just not forget to open firewall rule for this exact port further
protocol: TCP
Answered few days ago similar nodePort question - check it also, maybe will be helpful in future.
Upvotes: 1
Reputation: 458
For structural reasons, it's better to specify the nodePort in your service yaml configuration file or kubernetes will allocate it randomly from the k8s port range (30000-32767). In the ports section it's a list of ports no need, in your case, to specify a name check the nodePort_docs for more infos. This should work for you :
apiVersion: v1
kind: Service
metadata:
name: posts-srv
spec:
type: NodePort
selector:
app: posts
ports:
- port: 4000
targetPort: 4000
nodePort: 32140
protocol: TCP
To connect to the nodePort service verify if any firewall service is up then verify that this port is enabled in your VMs : (centos example)
sudo firewall-cmd --permanent --add-port=32140/tcp
Finally connect to this service using any node IP address (not the CLusterIP, this IP is an INTERNAL-IP not accessible outside the cluster) and the nodePort : <node_pubilc_IP>:<nodePort:32140>
Upvotes: 2