如何使用负载均衡器公开 Statefulset?
How can I expose a Statefulset with a load balancer?
我目前正在尝试创建 X pods 的集群,每个集群都有一个个人持久卷。为此,我创建了一个带有 X 个副本的 StateFulSet
和一个 PersistentVolumeClaimTemplate
这部分工作正常。
问题是似乎不可能以与 deployment
相同的方式使用 LoadBalancer 公开这些 pods(因为 pods 在状态集)。
此刻我试图公开它作为一个简单的部署 不起作用,我发现的唯一方法是一个一个地公开每个 pods(我'我没有测试过它,但我在 this) 上看到了它,但它的可扩展性不强...
我不是任何云提供商平台上的 运行 kubernetes,因此请避免使用独占命令行。
The problem is that it's seem's to be impossible to expose thoses pods with a LoadBalancer in the same way as a deployment (because of the uniqueness of a pods in a statefulset).
为什么不呢?这是我的带有默认 Nginx
的 StatefulSet
$ k -n test get statefulset
NAME DESIRED CURRENT AGE
web 2 2 5d
$ k -n test get pods
web-0 1/1 Running 0 5d
web-1 1/1 Running 0 5d
这是我的服务类型 LoadBalancer,在 Minikube 的情况下是 NodePort(实际上)
$ k -n test get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 10.110.22.74 <pending> 80:32710/TCP 5d
让我们 运行 一些带有 curl 的 pod 并对 ClusterIP 做一些请求:
$ kubectl -n test run -i --tty tools --image=ellerbrock/alpine-bash-curl-ssl -- bash
bash-4.4$ curl 10.110.22.74 &> /dev/null
bash-4.4$ curl 10.110.22.74 &> /dev/null
bash-4.4$ curl 10.110.22.74 &> /dev/null
bash-4.4$ curl 10.110.22.74 &> /dev/null
让我们检查一下 Nginx 日志:
$ k -n test logs web-0
172.17.0.7 - - [18/Apr/2019:23:35:04 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.0"
172.17.0.7 - - [18/Apr/2019:23:35:05 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.0"
172.17.0.7 - - [18/Apr/2019:23:35:17 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.0"
$ k -n test logs web-1
172.17.0.7 - - [18/Apr/2019:23:35:15 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.0"
172.17.0.7 - 是我的卷曲吊舱:
NAME READY STATUS RESTARTS AGE IP NODE
tools-654cfc5cdc-8zttt 1/1 Running 1 5d 172.17.0.7 minikube
实际上,在 StatefulSet pods 之间的负载平衡情况下,ClusterIP 完全足够了,因为您有一个 Endpoints 列表
$ k -n test get endpoints
NAME ENDPOINTS AGE
nginx 172.17.0.5:80,172.17.0.6:80 5d
YAML:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port: 80
name: web
selector:
app: nginx
我目前正在尝试创建 X pods 的集群,每个集群都有一个个人持久卷。为此,我创建了一个带有 X 个副本的 StateFulSet
和一个 PersistentVolumeClaimTemplate
这部分工作正常。
问题是似乎不可能以与 deployment
相同的方式使用 LoadBalancer 公开这些 pods(因为 pods 在状态集)。
此刻我试图公开它作为一个简单的部署 不起作用,我发现的唯一方法是一个一个地公开每个 pods(我'我没有测试过它,但我在 this) 上看到了它,但它的可扩展性不强...
我不是任何云提供商平台上的 运行 kubernetes,因此请避免使用独占命令行。
The problem is that it's seem's to be impossible to expose thoses pods with a LoadBalancer in the same way as a deployment (because of the uniqueness of a pods in a statefulset).
为什么不呢?这是我的带有默认 Nginx
的 StatefulSet$ k -n test get statefulset
NAME DESIRED CURRENT AGE
web 2 2 5d
$ k -n test get pods
web-0 1/1 Running 0 5d
web-1 1/1 Running 0 5d
这是我的服务类型 LoadBalancer,在 Minikube 的情况下是 NodePort(实际上)
$ k -n test get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 10.110.22.74 <pending> 80:32710/TCP 5d
让我们 运行 一些带有 curl 的 pod 并对 ClusterIP 做一些请求:
$ kubectl -n test run -i --tty tools --image=ellerbrock/alpine-bash-curl-ssl -- bash
bash-4.4$ curl 10.110.22.74 &> /dev/null
bash-4.4$ curl 10.110.22.74 &> /dev/null
bash-4.4$ curl 10.110.22.74 &> /dev/null
bash-4.4$ curl 10.110.22.74 &> /dev/null
让我们检查一下 Nginx 日志:
$ k -n test logs web-0
172.17.0.7 - - [18/Apr/2019:23:35:04 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.0"
172.17.0.7 - - [18/Apr/2019:23:35:05 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.0"
172.17.0.7 - - [18/Apr/2019:23:35:17 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.0"
$ k -n test logs web-1
172.17.0.7 - - [18/Apr/2019:23:35:15 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.0"
172.17.0.7 - 是我的卷曲吊舱:
NAME READY STATUS RESTARTS AGE IP NODE
tools-654cfc5cdc-8zttt 1/1 Running 1 5d 172.17.0.7 minikube
实际上,在 StatefulSet pods 之间的负载平衡情况下,ClusterIP 完全足够了,因为您有一个 Endpoints 列表
$ k -n test get endpoints
NAME ENDPOINTS AGE
nginx 172.17.0.5:80,172.17.0.6:80 5d
YAML:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port: 80
name: web
selector:
app: nginx