从远程主机访问 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中使用它们。
我很确定我配置错误或遗漏了一些东西。
我的家庭网络是 10.11.0.0/16
我使用
设置了一个 kubernetes 实例sudo kubeadm init --pod-network-cidr=10.166.0.0/16
然后我用
安装了 calicoCALICO_IPV4POOL_CIDR=10.166.32.0/20
然后我使用
设置 MetalLBapiVersion: 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 机器上的 podcurl 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中使用它们。