如何使用负载均衡器公开 Statefulset?

yat*_*ino 5 load-balancing kubernetes statefulset

我目前正在尝试创建一组 X pod,每个都有一个个人持久卷。为此,我创建了一个StateFulSet带有 X 个副本的副本,并且PersistentVolumeClaimTemplate该部分正在工作。

问题是似乎不可能以与 a 相同的方式使用 LoadBalancer 公开那些 pod deployment(因为 pod 在 statefulset 中的唯一性)。

此刻我试图将它公开,因为一个简单的部署女巫不起作用,我发现的唯一方法是一个一个地公开每个豆荚(我没有测试过,但我在this上看到了它)但它是没有那么可扩展...

我没有在任何云提供商平台上运行 kubernetes,那么请避免使用独占命令行。

Kon*_*tin 8

问题是似乎不可能以与部署相同的方式使用 LoadBalancer 公开那些 pod(因为 pod 在 statefulset 中的唯一性)。

为什么不?这是我的 StatefulSet 和默认的 Nginx

$ 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
Run Code Online (Sandbox Code Playgroud)

这是我的服务类型 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
Run Code Online (Sandbox Code Playgroud)

让我们用 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
Run Code Online (Sandbox Code Playgroud)

让我们查看 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"
Run Code Online (Sandbox Code Playgroud)

172.17.0.7 - 是我的卷曲豆荚:

NAME                     READY     STATUS    RESTARTS   AGE       IP           NODE
tools-654cfc5cdc-8zttt   1/1       Running   1          5d        172.17.0.7   minikube
Run Code Online (Sandbox Code Playgroud)

实际上,在 StatefulSet 的 pod 之间进行负载平衡的情况下,ClusterIP 是完全足够的,因为您有一个端点列表

$ k -n test get endpoints
NAME      ENDPOINTS                     AGE
nginx     172.17.0.5:80,172.17.0.6:80   5d
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    name: web
  selector:
    app: nginx
Run Code Online (Sandbox Code Playgroud)

  • 好吧,哇,我在想必须在服务中将“clusterIp”值设置为“None”。但看来你的伎俩很管用!谢谢 ! (2认同)