首页 > 解决方案 > 无法通过 Web 浏览器通过外部 IP 连接到 Kubernetes 服务

问题描述

我将 minikube 用于 Kubernetes、Docker 和 VirtualBox 用于我的应用程序。

我为 MySQL 数据库和 phpmyadmin 创建了几个服务+部署。它们都是绿色的,表示没有问题:

但是,当我单击 phpmyadmin-service 的外部端点时,我的浏览器拒绝连接:

这是我的 metallb 配置和minikube ip输出,以防万一:

我的服务和部署的 yaml 清单文件确实包含正确的端口:

apiVersion: v1
kind: Service
metadata:
  name: phpmyadmin-service
  labels:
    app: phpmyadmin
  annotations:
    metallb.universe.tf/allow-shared-ip: shared
spec:
  type: LoadBalancer
  ports:
  - port: 5000
    targetPort: 5000
  selector:
    app: phpmyadmin
---
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: phpmyadmin-deployment
  labels:
    app: phpmyadmin
spec:
  selector:
    matchLabels:
      app: phpmyadmin
  replicas: 1
  template:
    metadata:
      labels:
        app: phpmyadmin
    spec:
      restartPolicy: Always
      containers:
      - name: phpmyadmin
        image: phpmyadmin
        imagePullPolicy: Never
        ports:
        - containerPort: 5000

知道有什么问题吗?

UPD:输出kubectl get svc

c1r10s2% kubectl get svc
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
kubernetes           ClusterIP      10.96.0.1       <none>           443/TCP          2m54s
mysql-service        ClusterIP      10.109.243.20   <none>           3306/TCP         73s
phpmyadmin-service   LoadBalancer   10.103.233.51   192.168.99.100   5000:30348/TCP   73s

输出kubect describe svc

c1r10s2% kubectl describe svc
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Families:       <none>
IP:                10.96.0.1
IPs:               10.96.0.1
Port:              https  443/TCP
TargetPort:        8443/TCP
Endpoints:         192.168.99.100:8443
Session Affinity:  None
Events:            <none>


Name:              mysql-service
Namespace:         default
Labels:            app=mysql
Annotations:       <none>
Selector:          app=mysql
Type:              ClusterIP
IP Families:       <none>
IP:                10.109.243.20
IPs:               10.109.243.20
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         172.17.0.8:3306
Session Affinity:  None
Events:            <none>


Name:                     phpmyadmin-service
Namespace:                default
Labels:                   app=phpmyadmin
Annotations:              metallb.universe.tf/allow-shared-ip: shared
Selector:                 app=phpmyadmin
Type:                     LoadBalancer
IP Families:              <none>
IP:                       10.103.233.51
IPs:                      10.103.233.51
LoadBalancer Ingress:     192.168.99.100
Port:                     <unset>  5000/TCP
TargetPort:               5000/TCP
NodePort:                 <unset>  30348/TCP
Endpoints:                172.17.0.2:5000
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason        Age   From                Message
  ----    ------        ----  ----                -------
  Normal  IPAllocated   2m1s  metallb-controller  Assigned IP "192.168.99.100"
  Normal  nodeAssigned  119s  metallb-speaker     announcing from node "minikube"

标签: web-serviceskubernetesminikube

解决方案


我看到你正在使用 MetalLB。问题是,可能没有规则来管理与负载均衡器端点的连接。您可以检查的一些事项:

  • 您的集群是否启用了内部路由?通过在 BGP 中使用 MetalLB,您将需要重新分配路由(一个 BGP 网关,以便可以学习 10.130.xx 网络和 192.168.xx 网络之间的路由)
  • 如果您在第 2 层运行,则需要在您的 kubelet 服务中启用 StrictARP(如果您使用 Calico 进行集群网络,也希望在 BGP 模式下启用。原因很复杂,但您可以调查)
  • 使用 IPVS 而不是 Iptables。MetalLB 需要 IPVS
  • PhpMyadmin 还需要环境变量才能访问 mysql。因此,您需要在部署中传递 PMA_HOST 和 PMA_PORT 以及密码环境。类似于以下内容:
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: phpmyadmin-deployment
  labels:
    app: phpmyadmin
spec:
  selector:
    matchLabels:
      app: phpmyadmin
  replicas: 1
  template:
    metadata:
      labels:
        app: phpmyadmin
    spec:
      restartPolicy: Always
      containers:
      - name: phpmyadmin
        image: phpmyadmin
        imagePullPolicy: Never
        ports:
        - containerPort: 5000
        env:                             
        - name: PMA_HOST               
          value: mysql-service # this is a reference to the mysql service                
        - name: PMA_PORT               
          value: "3306"                
        - name: MYSQL_ROOT_PASSWORD    
          valueFrom:                   
            secretKeyRef:              
              name: mysql-secret # This is your mysql secret from the file example below             
              key: mysql-root-password 

您需要先前在您的 mysql 部署的机密文件中启用机密,您可以在其中提供加密凭据。

 apiVersion: v1        
 kind: Secret          
 metadata:             
   name: mysql-secret         
   namespace: namespace      
   labels:             
     app: mysql-service # the label of your mysql deployment        
 type: Opaque          
 data:                        
   mysql-root-password:   # base64 encoded passwords here              
   mysql-password:  

推荐阅读