重定向Kubernetes中的有状态Pod

时间:2019-05-08 07:20:06

标签: kubernetes

我在kubernetes中使用有状态。 我编写了一个具有领导者和关注者的应用程序(使用Go) 领导者是写作和阅读者。 追随者仅用于阅读。

在应用程序代码中,我使用了“ http.Redirect(w,r,url,307)”功能将撰写内容从关注者重定向到领导者。

如果我使用跳转窗格来测试应用程序(尝试访问应用程序以进行读写),则我的应用程序可以正常运行,关注者可以重定向到领导者

kubectl run -i -t --rm jumpod --restart=Never --image=quay.io/mhausenblas/jump:0.2 -- sh

但是当我部署服务(从外部访问)时。

apiVersion: v1
kind: Service
metadata:
  name: service-name
spec:
  selector:
    app: app-name
  ports:
  - port: 80
    targetPort: 9876

并通过此链接访问应用程序:

curl -L -XPUT -T /tmp/put-name localhost:8001/api/v1/namespaces/default/services/service-name/proxy/

因为每次访问应用程序时,服务都会随机选择一个窗格。当它访问领导者时,它运行良好(没有问题),但是,如果它访问跟随者,则跟随者将需要重定向到领导者,我遇到了这个错误:

curl: (6) Could not resolve host: pod-name.svc-name.default.svc.cluster.local

我测试了什么

  • 使用跳豆时我可以使用此链接访问

  • 我访问了每个Pod,查找DNS。我可以通过“ nslookup”命令找到DNS名称

  • 我试图在代码中修复领导者的IP。在我的代码中,关注者将重定向到IP(而不是上面的域)。但是它仍然遇到此错误:

    curl: (7) Failed to connect to 10.244.1.71 port 9876: No route to host
    

任何人都知道这个问题。谢谢!

2 个答案:

答案 0 :(得分:0)

要使Pod DNS工作,您必须创建无头服务:

apiVersion: v1
kind: Service
metadata:
  name: svc-name-headless
spec:
  clusterIP: None
  selector:
    app: app-name
  ports:
  - port: 80
    targetPort: 9876

然后在StatefulSet规范中,您必须引用此服务:

spec:
  serviceName: svc-name-headless

在此处了解更多信息:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-network-id

或者,您可以这样指定服务将选择的特定窗格:

apiVersion: v1
kind: Service
metadata:
  name: svc-name
spec:
  selector:
    statefulset.kubernetes.io/pod-name: pod-name-0
  ports:
  - port: 80
    targetPort: 9876

答案 1 :(得分:0)

从外部访问群集服务时,客户端(例如Web浏览器)无法识别通常保留供内部群集使用的DNS名称(例如pod-name.svc-name.default.svc.cluster.local)。

上下文
您正在尝试公开对POD的访问,该访问由StatefullSet控制,并具有ClusterIP类型的服务

解决方案
将ClusterIP(未指定时默认为默认)更改为NodePort或LoadBalancer