1

实施目标

将运行在 kubernetes 上的 Zookeeper 实例暴露给 Internet。

(底部提供配置和版本信息)

实施尝试

我目前有一个minikube集群在运行ubuntu 14.04,由docker容器支持。我正在运行一个裸机 k8s 集群,并且正在尝试将 zookeeper 服务公开到互联网。看到我的集群没有在云提供商上运行,我设置了metallb,以便为我的 zookeeper 服务提供网络负载均衡器实现。

启动时一切看起来都很好,分配了一个外部 IP,我可以通过 curl 命令从同一主机访问它。

$ kubectl get pods -n metallb-system
NAME                          READY   STATUS    RESTARTS   AGE
controller-5c9894b5cd-9gh8m   1/1     Running   0          5h59m
speaker-j2z8q                 1/1     Running   0          5h59m


$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                         AGE
kubernetes   ClusterIP      10.xxx.xxx.xxx  <none>          443/TCP                         6d19h
zk-cs        LoadBalancer   10.xxx.xxx.xxx  172.1.1.x       2181:30035/TCP                  56m
zk-hs        LoadBalancer   10.xxx.xxx.xxx  172.1.1.x       2888:30664/TCP,3888:31113/TCP   6m15s

当我卷曲上述外部 IP 时,我得到一个有效的响应

$ curl -D- "http://172.1.1.x:2181"
curl: (52) Empty reply from server

到目前为止,一切看起来都不错,我可以从集群外部毫无问题地访问 LB,但这就是我缺乏 Kubernetes/网络知识的地方。我发现无法将此 LB 公开到 Internet。我曾尝试过minikube tunnel我寄予厚望的跑步,结果却深感失望。

从另一个节点运行 curl 命令,而 minikube 隧道正在运行,只会看到请求超时。

$ curl -D- "http://172.1.1.x:2181"
curl: (28) Failed to connect to 172.1.1.x port 2181: Timed out

在这一点上,正如我之前提到的,我被卡住了。AWS有没有什么方法可以让我在不把我的灵魂献给或的情况下让这项服务暴露在互联网上GCP

任何帮助将不胜感激。

服务配置

apiVersion: v1
kind: Service
metadata:
  name: zk-hs
  labels:
    app: zk
spec:
  selector:
    app: zk
  ports:
    - port: 2888
      targetPort: 2888
      name: server
      protocol: TCP
    - port: 3888
      targetPort: 3888
      name: leader-election
      protocol: TCP
  clusterIP: ""
  type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:
  name: zk-cs
  labels:
    app: zk
spec:
  selector:
    app: zk
  ports:
    - name: client
      protocol: TCP
      port: 2181
      targetPort: 2181
  type: LoadBalancer
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  selector:
    matchLabels:
      app: zk
  maxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zk
spec:
  selector:
    matchLabels:
      app: zk
  serviceName: zk-hs
  replicas: 1
  updateStrategy:
    type: RollingUpdate
  podManagementPolicy: OrderedReady
  template:
    metadata:
      labels:
        app: zk
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - zk
              topologyKey: "kubernetes.io/hostname"
      containers:
        - name: zookeeper
          imagePullPolicy: Always
          image: "library/zookeeper:3.6"
          resources:
            requests:
              memory: "1Gi"
              cpu: "0.5"
          ports:
            - containerPort: 2181
              name: client
            - containerPort: 2888
              name: server
            - containerPort: 3888
              name: leader-election
          volumeMounts:
            - name: datadir
              mountPath: /var/lib/zookeeper
            - name: zoo-config
              mountPath: /conf
      volumes:
        - name: zoo-config
          configMap:
            name: zoo-config
      securityContext:
        fsGroup: 2000
        runAsUser: 1000
        runAsNonRoot: true
  volumeClaimTemplates:
    - metadata:
        name: datadir
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 10Gi
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: zoo-config
  namespace: default
data:
  zoo.cfg: |
    tickTime=10000
    dataDir=/var/lib/zookeeper
    clientPort=2181
    initLimit=10
    syncLimit=4
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.1.1.1-172.1.1.10

minikube:v1.13.1
码头工人:18.06.3-ce

4

1 回答 1

2

你可以用 minikube 来做,但 minikube 的想法只是在你的本地环境中测试东西。所以,默认情况下,它没有正确的 IPTable 权限,是的,你可以调整它,但如果你的目标只是在没有任何响亮的提供者的情况下使用,我强烈建议你使用kubeadmhttps://kubernetes.io /docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)。

该工具将为您提供非常可定制的集群配置,您将能够轻松设置网络问题。

于 2020-09-23T19:56:33.747 回答