无法通过互联网访问我的本地 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
在这一点上,正如我之前提到的,我被卡住了。
有什么方法可以让我将这项服务暴露在互联网上,而无需将我的灵魂献给 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
docker: 18.06.3-ce
你可以用 minikube 来做,但 minikube 的想法只是在你的本地环境中测试东西。所以,默认情况下,它没有正确的 IPTable 权限,是的,你可以调整它,但如果你的目标只是在没有任何大声供应商的情况下使用,我强烈建议你使用 kubeadm
(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/).
此工具将为您提供高度可定制的集群配置,您将能够毫不费力地设置您的网络问题。
实施目标
将 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
在这一点上,正如我之前提到的,我被卡住了。
有什么方法可以让我将这项服务暴露在互联网上,而无需将我的灵魂献给 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
docker: 18.06.3-ce
你可以用 minikube 来做,但 minikube 的想法只是在你的本地环境中测试东西。所以,默认情况下,它没有正确的 IPTable 权限,是的,你可以调整它,但如果你的目标只是在没有任何大声供应商的情况下使用,我强烈建议你使用 kubeadm
(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/).
此工具将为您提供高度可定制的集群配置,您将能够毫不费力地设置您的网络问题。