从远程主机访问 Kubernetes

accessing Kubernetes from remote hosts

我很确定我配置错误或遗漏了一些东西。

我的家庭网络是 10.11.0.0/16

我使用

设置了一个 kubernetes 实例
sudo kubeadm init --pod-network-cidr=10.166.0.0/16

然后我用

安装了 calico
CALICO_IPV4POOL_CIDR=10.166.32.0/20

然后我使用

设置 MetalLB
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.100.1-192.168.100.254

我使用 https://kubernetes.io/docs/tasks/access-application-cluster/service-access-application-cluster/ 上的教程使用 NodePort,它在 kubernetes 机器上运行良好:

kubectl describe services example-service
Name:                     example-service
Namespace:                default
Labels:                   app.kubernetes.io/name=load-balancer-example
Annotations:              <none>
Selector:                 app.kubernetes.io/name=load-balancer-example
Type:                     NodePort
IP:                       10.110.245.152
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30140/TCP
Endpoints:                10.166.32.243:8080,10.166.32.244:8080,10.166.32.245:8080 + 2 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

我可以使用

访问 kubernetes 机器上的 pod
curl http://10.110.245.152:8080
Hello Kubernetes!

如何让我家庭网络中的其他机器可以访问?当我在其他机器上尝试这个时,它只是挂起...

curl http://10.110.245.152:8080

如果您使用的是 NodePort 服务,不应该是 curl <kubernetes machine IP >:30140 吗?

上面的答案确实解决了问题,但应用程序仍然在 non-common,kubernetes 分配的端口上运行。我想这个想法是让 kubernetes 集群在单个 IP 和标准端口上可见。

MetalLb设置可以提供bare-metal负载均衡器,或者'LoadBalancer'服务类型,kubernetes默认不提供。 您上面的示例使用 'NodePort' 类型,并且在您的服务配置中,您应该能够将 'NodePort' 替换为 'LoadBalancer' 类型。如果配置正确,kubectl get service example-service 应该显示来自内部 kube 网络的地址和来自您配置的 MetalLb 范围的外部 IP 地址。类似于下面的示例:

kube-server:~$ kubectl get service keycloak-db -n keycloak-db 
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
keycloak-db   LoadBalancer   10.109.91.158   192.168.1.243   8080:32434/TCP   33d

我在您的示例中注意到的另一件事是 MetalLb 配置中分配的地址范围 (192.168.100.0/24) 与您的家庭网络 (10.11.0.0/16) 不匹配。如果你没有一些路由,最好在家庭网络中保留一些IP并在MetalLb中使用它们。