实施目标
将在kubernetes上运行的实例公开到互联网上。
(底部提供的配置和版本信息)
实施尝试
我目前在ubuntu 14.04上运行了一个由docker容器支持的docker集群。我正在运行一个裸金属k8s集群,我正在尝试将一个动物园管理员服务暴露在互联网上。考虑到我的集群不是在云提供商上运行,我设置了metallb,以便为我的动物园管理员服务提供一个网络负载平衡器实现。
在启动时,一切看起来都很好,分配了一个外部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暴露在互联网上。我曾经尝试过运行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=4apiVersion: 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迷你车:v1.13.1
码头工人:18.06.3-ce
发布于 2020-09-23 19:56:33
你可以用minikube来做,但是minikube的想法只是在你的本地环境中测试一些东西。因此,默认情况下,它没有正确的IPTable权限,是的,您可以调整它,但是如果您的目标只是使用而没有任何响亮的提供程序,我将强烈建议您使用kubeadm (https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)。
该工具将为您提供一个非常可定制的集群配置,您将能够设置您的网络问题,而不令人头痛。
https://stackoverflow.com/questions/64031984
复制相似问题