# master执行:
$ kubectl run test-nginx --image=nginx:alpine
$ kubectl get po -o wide
# 能正常运行
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-nginx-5bd8859b98-qvks5 1/1 Running 0 29s 172.17.0.2 k8s-slave2 <none> <none>
$ curl 172.17.0.2
curl: (7) Failed connect to 172.17.0.2:80; Connection refused
# 但是k8s-slave2节点,$ curl 172.17.0.2是能通的,但是在master和别的节点上就curl不通。
[root@k8s-slave2 ~]# curl 192.169.165.181:30960
curl: (7) Failed connect to 192.169.165.181:30960; Connection refused
[root@k8s-slave2 ~]#
[root@k8s-slave2 ~]# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
Thank you for using nginx.
[root@k8s-master ~]# curl 172.17.0.2
curl: (7) Failed connect to 172.17.0.2:80; Connection refused
[root@k8s-master ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.037 ms
[root@k8s-slave1 ~]# curl 172.17.0.2
curl: (7) Failed connect to 172.17.0.2:80; No route to host
# 三台机器的防火墙都是ACCEPT,没有问题:
iptables -L -n
Chain FORWARD (policy ACCEPT)
# 网络也是好的:
[root@k8s-master ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.165.2 0.0.0.0 UG 0 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.165.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
# 所有节点都是ready状态,镜像都已经安装了
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 10h v1.16.2
k8s-slave1 Ready <none> 10h v1.16.2
k8s-slave2 Ready <none> 10h v1.16.2
[root@k8s-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-58cc8c89f4-29t99 1/1 Running 1 10h
coredns-58cc8c89f4-nkbqf 1/1 Running 1 10h
etcd-k8s-master 1/1 Running 1 10h
kube-apiserver-k8s-master 1/1 Running 1 10h
kube-controller-manager-k8s-master 1/1 Running 1 10h
kube-proxy-6dvpv 1/1 Running 2 10h
kube-proxy-6mbrd 1/1 Running 1 10h
kube-proxy-9cwrv 1/1 Running 1 10h
kube-scheduler-k8s-master 1/1 Running 1 10h
$ kubectl run test-nginx --image=nginx:alpine
$ kubectl expose deployment test-nginx --port=80 --type=NodePort
[root@k8s-master ~]# kubectl get pods,service
NAME READY STATUS RESTARTS AGE
pod/test-nginx-5bd8859b98-m85f6 1/1 Running 2 11h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11h
service/test-nginx NodePort 10.103.115.54 <none> 80:30960/TCP 3h4m
master的IP:http://192.168.165.181/
三个节点:master,两个slave,
这个nginx被分配到slave2上执行了
curl http://k8s-slave2:30960/ 三台机器执行都是是通的
curl http://k8s-master:30960/ 三台机器执行都不通
curl: (7) Failed connect to k8s-master:30960; Connection refused
我想交流学习k8s
可以加我微信:wqm701,也可以把我拉到运维群里,一起学习
根据提供的信息,应该是 Kubernetes 集群中的节点之间网络不通导致的,以下是排查思路:
1.确认节点间网络是否正常,可以尝试使用 ping 命令。
2.确认 pod 是否正常运行,可以使用 kubectl get pods 命令查看。
3.确认 service 是否正常运行,可以使用 kubectl get services 命令查看。
4.确认端口是否正确,可以使用 kubectl describe service 命令查看 service 对应的 NodePort 端口。
5.确认访问的地址是否正确,对于 NodePort 类型的 service,应该使用集群中任意一个节点的 IP 地址和 NodePort 端口进行访问。
根据提供的信息,pod 已经能够正常运行,service 也已经正确暴露了 NodePort 端口,但是访问时出现 Connection refused 错误,同时 curl 也只在一个节点上可以成功访问。这提示我们存在节点间网络不通的问题。
首先,我们可以在节点上使用 ping 命令确认节点间的网络是否正常。根据提供的信息,可以看到:
从 k8s-master 节点上可以 ping 通 172.17.0.2;
从 k8s-slave2 节点上可以 curl 通 172.17.0.2;
从 k8s-slave1 节点上 curl 时出现 "No route to host" 错误。
从以上情况来看,k8s-master 节点和 k8s-slave2 节点的网络是正常的,但是 k8s-slave1 节点的网络存在问题。考虑到 k8s-slave1 节点上的 iptables 配置与其他节点有所不同,推测问题可能出现在 iptables 配置上。建议在 k8s-slave1 节点上使用 iptables -L -n 命令查看 iptables 配置,确认是否存在阻塞节点间网络通信的规则。
端口号你加了吗?
该回答引用ChatGPT
您好,我觉得可能是服务端口配置的问题。您可以检查一下以下几个方面:
检查 Kubernetes 中的服务是否正常运行。您可以使用 kubectl get svc
命令获取服务的状态,确保服务处于运行状态。
检查 Nginx 容器中的端口配置是否正确。您可以检查 Nginx 配置文件中监听的端口是否与容器中开放的端口一致。
检查应用程序容器中的端口配置是否正确。您可以检查应用程序容器中监听的端口是否与 Nginx 容器中使用的端口一致。
如果您已经排除了上述问题,并且您的 K8S nginx 服务在其他机器上能够访问,那么问题可能是防火墙造成的。您可以尝试关闭防火墙并再次测试访问,如果可以正常访问,则需要配置防火墙规则来允许对应端口的访问。
根据你提供的信息,这个问题可能是由于没有在容器内部暴露端口而导致的。在Kubernetes中,当容器映像被运行时,它可以在容器内部运行,但必须将其端口公开到集群中的其他Pod才能访问它。
在这种情况下,您运行的Nginx容器需要将其80端口公开到集群中的其他Pod才能使用curl命令访问它。您可以使用kubectl expose命令创建一个服务对象,该对象将容器端口暴露到集群中其他Pod的IP地址和端口。在您的情况下,您可以运行以下命令:
css
Copy code
$ kubectl expose deployment test-nginx --port=80 --type=NodePort
这会创建一个类型为NodePort的服务对象,该服务对象将容器端口暴露到集群中的其他Pod的IP地址和随机端口。使用此服务对象的ClusterIP和NodePort,您应该能够使用curl命令从集群中任何节点访问Nginx容器。例如:
php
Copy code
$ curl http://:
请确保将替换为Kubernetes节点的IP地址,替换为上面创建的服务对象的NodePort。
如果您想了解有关Kubernetes服务和暴露类型的更多信息,请参阅Kubernetes文档中的以下页面:
https://kubernetes.io/docs/concepts/services-networking/service/
https://kubernetes.io/docs/concepts/services-networking/service-types/
该回答引用于gpt与OKX安生共同编写:
根据您提供的信息,可以初步判断该问题可能是因为NodePort端口没有正确打开。在Kubernetes集群中,NodePort是暴露服务到外部网络的方式之一。当您创建一个NodePort类型的服务时,Kubernetes将会在每个节点上打开一个随机的高端口(通常是30000-32767),并将该端口映射到服务的默认端口上。
在您的情况下,您已经成功地创建了一个NodePort类型的服务,它将容器的80端口映射到30960端口,但是无法通过curl命令从其他节点或主机访问该端口。这表明该端口可能没有正确地打开。
解决此问题的步骤如下:
确认防火墙规则是否正确
您已经检查了所有节点的防火墙规则,并确认它们都是ACCEPT。但是,在某些情况下,可能还需要在TCP/IP堆栈层面禁用防火墙才能确保服务能够正常运行。可以尝试在每个节点上运行以下命令来禁用防火墙:
systemctl stop firewalld
systemctl disable firewalld
确认Kubernetes集群是否正确配置
确认Kubernetes集群是否正确配置也很重要。可以尝试在每个节点上使用以下命令来检查Kubernetes集群的状态:
kubectl cluster-info
如果Kubernetes集群没有正确配置,则可能导致NodePort端口无法打开或访问。
确认curl命令是否使用了正确的IP地址
在您的情况下,可以从k8s-slave2节点上运行curl命令成功访问服务,但是在其他节点和主机上却无法访问。这表明该问题可能与网络设置有关。
您需要确认您使用的是正确的IP地址。可以尝试使用kubectl get nodes命令获取每个节点的IP地址,并进行相应的更改。同时,请确保节点之间的通信正常运行。
希望以上方法能够帮助您解决问题,如有疑问,请随时问我。
检查服务的状态和端口映射是否正确。可以通过运行kubectl get service -o yaml命令来获取服务的详细信息,并确认端口映射是否正确。
检查网络设置是否正确。如果您的Kubernetes集群使用的是自定义的网络插件,例如Calico或Flannel等,则需要确认网络插件是否正确配置。可以尝试在每个节点上运行ip addr show命令来检查节点的网络接口和IP地址是否正确。
检查kube-proxy是否正常工作。kube-proxy是Kubernetes集群中负责NodePort端口映射的组件之一。可以尝试在每个节点上运行以下命令来检查kube-proxy的状态:
systemctl status kube-proxy
检查Pod和容器的日志。如果以上步骤都没有解决问题,可以尝试检查Pod和容器的日志,以确定是否存在其他错误或异常情况。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题可能是由于容器内部只监听了127.0.0.1而不是外部IP地址所致。可以通过修改Nginx配置文件来解决。以下是一些解决方法:
在nginx.conf中
listen 0.0.0.0:80;
然后重新构建发布部署。
kubectl port-forward service/test-nginx 8080:80
然后在本地使用curl http://localhost:8080访问服务。
kubectl expose deployment test-nginx --port=80 --type=LoadBalancer
这会创建一个外部访问点,并将Nginx服务公开到公共IP。可以通过kubectl get svc test-nginx查看IP地址。
如果我的回答解决了您的问题,请采纳!
这种情况下,你需要使用节点 IP 地址,而不是容器 IP 地址,因为节点 IP 地址将路由到容器 IP 地址。在这里,172.17.0.2 是容器的 IP 地址,而主机的 IP 地址可能不同,因此需要在主机上使用 curl 命令而不是在容器中使用它。
使用 kubectl get svc 命令来查看服务的 NodePort 端口,然后使用主机 IP 地址和此端口来测试服务,如下所示:
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test-nginx NodePort 10.0.144.121 <none> 80:32674/TCP 1m
$ curl http://<node_ip>:<node_port>
请确保 <node_ip> 是节点的 IP 地址,<node_port> 是 test-nginx 服务的 NodePort 端口。
不知道你这个问题是否已经解决, 如果还没有解决的话:
访问其中一个静态文件:
不行。
master:端口没法 curl通,只能具体工作节点:端口,才能curl通
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 2d5h
test-nginx NodePort 10.103.115.54 80:30960/TCP 45h
[root@k8s-master ~]# curl k8s-master:30960
curl: (7) Failed connect to k8s-master:30960; Connection refused
[root@k8s-master ~]# curl k8s-slave2:30960