我在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
任何人都知道这个问题。谢谢!
答案 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