无法通过互联网访问我的本地 kubernetes 服务

Can't access my local kubernetes service over the internet

实施目标

将 kubernetes 上的 Zookeeper 实例 运行 公开到互联网。

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

实施尝试

我目前在 ubuntu 14.04 上有一个 minikube 集群 运行,由 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

当我 curl 上面提到的外部 IP 时,我得到了一个有效的响应

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

到目前为止,一切看起来都很好,我可以从集群外部访问 LB,没有任何问题,但这正是我缺乏 Kubernetes/Networking 知识的地方 me.I 发现不可能将此 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

在这一点上,正如我之前提到的,我被卡住了。 有什么方法可以让我将这项服务暴露在互联网上,而无需将我的灵魂献给 AWSGCP?

任何帮助将不胜感激。

服务配置

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
docker: 18.06.3-ce

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

此工具将为您提供高度可定制的集群配置,您将能够毫不费力地设置您的网络问题。