我有一个带两个副本的statefulSet。 它的无头服务名称是“ gov-svc” 是->
在运行statefulSet之前
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-99b9bb8bd-qdnsb 1/1 Running 0 4h
kube-system etcd-minikube 1/1 Running 0 4h
kube-system kube-addon-manager-minikube 1/1 Running 0 4h
kube-system kube-apiserver-minikube 1/1 Running 0 4h
kube-system kube-controller-manager-minikube 1/1 Running 1 4h
kube-system kube-proxy-b9np6 1/1 Running 0 4h
kube-system kube-scheduler-minikube 1/1 Running 0 4h
kube-system kubernetes-dashboard-7db4dc666b-bsk8k 1/1 Running 0 4h
kube-system storage-provisioner
在运行此statefulSet的两个Pod之后,从Pod sts-0
中获得ping
的结果:
$ ping sts-0.gov-svc.default.svc.cluster.local
PING sts-0.gov-svc.default.svc.cluster.local (172.17.0.11): 56 data bytes
64 bytes from 172.17.0.11: seq=0 ttl=64 time=0.051 ms
64 bytes from 172.17.0.11: seq=1 ttl=64 time=0.444 ms
^C
--- redis-cluster-exp-0-0.redis-cluster-exp.default.svc.cluster.local ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.051/0.247/0.444 ms
但是当我尝试从ping sts-1
sts-0
时,它说:
$ ping sts-1.gov-svc.default.svc.cluster.local
ping: bad address 'sts-1.gov-svc.default.svc.cluster.local'
我需要按主机名成功ping其他Pod。我该怎么办?
答案 0 :(得分:2)
您需要创建headless service
以便能够在StatefulSet
内彼此ping通副本。像这样:
apiVersion: v1
kind: Service
metadata:
name: gov-svc-headless
labels:
your_label: your_value
spec:
selector:
your_label: your_value
ports:
- port: your_port
name: transport
protocol: TCP
clusterIP: None <---
注意:
使用选择器对于定义选择器的无头服务, 端点控制器在API中创建端点记录,并且 修改DNS配置以返回以下内容的A记录(地址): 直接指向支持该服务的Pod。
注意:
或没有定义选择器的无头服务(端点) 控制器不会创建端点记录。但是,DNS系统 查找并配置:
ExternalName类型服务的CNAME记录。任何记录 对于所有其他类型,与服务共享名称的端点。
更多信息:https://kubernetes.io/docs/concepts/services-networking/service/#headless-services