Kubernetes服务可以从节点访问,但不能从我的机器访问

时间:2019-06-03 14:59:54

标签: kubernetes

我的网站托管在DigitalOcean提供的Kubernetes集群上,我遇到超时问题。

u@macbook$ curl -L fork.example.com
curl: (7) Failed to connect to fork.example.com port 80: Operation timed out

我已经尝试了Debug Services页上列出的所有内容。我使用名为df-stats-site的k8s服务。

u@pod$ nslookup df-stats-site
Server:     10.245.0.10
Address:    10.245.0.10#53

Name:   df-stats-site.deepfork.svc.cluster.local
Address: 10.245.16.96

当我从节点执行此操作时,它会提供相同的输出:

u@node$ nslookup df-stats-site.deepfork.svc.cluster.local 10.245.0.10
Server:     10.245.0.10
Address:    10.245.0.10#53

Name:   df-stats-site.deepfork.svc.cluster.local
Address: 10.245.16.96

在页面的 服务是否通过IP工作吗? 的帮助下,我尝试了以下命令并获得了预期的输出。

u@node$ curl 10.245.16.96
*correct response*

这应该意味着DNS和服务一切正常。我确认kube-proxy正在使用以下命令运行:

u@node$ ps auxw | grep kube-proxy
root  4194  0.4  0.1 101864 17696 ?    Sl Jul04  13:56 /hyperkube proxy  --config=...

但是我对iptables规则有误:

u@node$ iptables-save | grep df-stats-site
(unfortunately, I was not able to copy the output from node, see the screenshot below)

screenshot

建议在kube-proxy标志设置为4的情况下重新启动-v,但我不知道如何使用DigitalOcean提供的群集来完成它。

这是我使用的配置:

apiVersion: v1
kind: Service
metadata:
  name: df-stats-site
spec:
  ports:
  - port: 80
    targetPort: 8002
  selector:
    app: df-stats-site

---

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: df-stats-site
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - fork.example.com
    secretName: letsencrypt-prod
  rules:
  - host: fork.example.com
    http:
      paths:
      - backend:
          serviceName: df-stats-site
          servicePort: 80

此外,我在this answer的帮助下设置了NGINX入口控制器。

我必须注意,它之前运行良好。我不确定是什么原因造成的,但是重新启动群集会很好,尽管我不知道如何删除所有资源。

2 个答案:

答案 0 :(得分:0)

ClusterIP服务只能从群集内访问。如果要从群集外部访问它,则需要将其配置为NodePort or LoadBalancer

如果只是尝试在本地进行测试,则可以使用kubectl port-forward将本地计算机上的端口转发到远程群集上的ClusterIP服务。这是一个从映像创建部署的示例,将其作为ClusterIP服务公开,然后通过kubectl port-forward访问它:

$ kubectl run --image=rancher/hello-world hello-world --replicas 2
$ kubectl expose deployment hello-world --type=ClusterIP --port=8080 --target-port=80
$ kubectl port-forward svc/hello-world 8080:8080

现在可以从我的本地计算机通过http://127.0.0.1:8080

访问此服务。

答案 1 :(得分:0)

对我来说,解决方案是在防火墙中添加HTTP和HTTPS入站规则(默认情况下,这些规则会丢失)。

对于DigitalOcean提供的Kubernetes集群,可以在https://cloud.digitalocean.com/networking/firewalls/上打开它。

更新:确保创建新的防火墙记录,而不是编辑现有的记录。否则,由于DigitalOcean k8s将规则集保留在防火墙中,因此您的规则将在几个小时/天之内自动删除。