Kubernetes:仅公开 StatefulSet 的单个 pod
Kubernetes: Expose only single pod of StatefulSet
对于 StateFul 集,我可以通过内部无头服务访问它的 pods。
我认为,有一种简单的方法也可以在外部公开单个 pods 是有道理的(因为 pods 通常有一个状态,因此对它们进行负载平衡是没有意义的)。
到目前为止,我没有找到直接的方法来做到这一点。
即使做 kubectl expose pod pod-1 --type NodePort
也给我提供了一个平衡所有 pods 的服务。
是不是有这样的原因,或者是否有访问单个 pods.
的好方法
我看不到他们将负载分配给单个 pod 的方法。如果您希望客户端与一个 pod 保持此会话,您可以定义服务 sessionAffinity: ClientIP
。这将发送已建立的客户端流量同一个 pod。
您可以在 StatefulSet
中通过匹配 statefulset.kubernetes.io/pod-name
标签向外部公开特定的 Pod
。
例如,如果您的 StatefulSet
被命名为 app
并且您希望将第一个 Pod
的端口 80 公开为 Service
:
apiVersion: v1
kind: Service
metadata:
name: app-0
spec:
type: LoadBalancer
selector:
statefulset.kubernetes.io/pod-name: app-0
ports:
- protocol: TCP
port: 80
targetPort: 80
对于 StateFul 集,我可以通过内部无头服务访问它的 pods。
我认为,有一种简单的方法也可以在外部公开单个 pods 是有道理的(因为 pods 通常有一个状态,因此对它们进行负载平衡是没有意义的)。
到目前为止,我没有找到直接的方法来做到这一点。
即使做 kubectl expose pod pod-1 --type NodePort
也给我提供了一个平衡所有 pods 的服务。
是不是有这样的原因,或者是否有访问单个 pods.
我看不到他们将负载分配给单个 pod 的方法。如果您希望客户端与一个 pod 保持此会话,您可以定义服务 sessionAffinity: ClientIP
。这将发送已建立的客户端流量同一个 pod。
您可以在 StatefulSet
中通过匹配 statefulset.kubernetes.io/pod-name
标签向外部公开特定的 Pod
。
例如,如果您的 StatefulSet
被命名为 app
并且您希望将第一个 Pod
的端口 80 公开为 Service
:
apiVersion: v1
kind: Service
metadata:
name: app-0
spec:
type: LoadBalancer
selector:
statefulset.kubernetes.io/pod-name: app-0
ports:
- protocol: TCP
port: 80
targetPort: 80