【问题标题】:Kubernetes Service not able to get External IPKubernetes 服务无法获取外部 IP
【发布时间】:2021-10-10 20:30:54
【问题描述】:

服务是外部IP,无法与外部端口绑定。我已运行命令尝试查找端口。

minikube 服务 mongodb-express-service

终端上没有显示错误。但是浏览器说它无法连接到那个 url。

环境

  • Minikube
  • Oracle 虚拟机
  • Ubuntu 20.04

mongo-express.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-express
  labels:
    app: mongo-express
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo-express
  template:
    metadata:
      labels:
        app: mongo-express
    spec:
      containers:
        - name: mongo-express
          image: mongo-express
          ports:
            - containerPort: 8081
          env:
            - name: ME_CONFIG_MONGODB_ADMINUSERNAME
              valueFrom:
                secretKeyRef:
                  name: mongodb-secret
                  key: username
            - name: ME_CONFIG_MONGODB_ADMINPASSWORD
              valueFrom:
                secretKeyRef:
                  name: mongodb-secret
                  key: password
            - name: ME_CONFIG_MONGODB_SERVER
              valueFrom:
                configMapKeyRef:
                  name: mongodb-config-map
                  key: database_url
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-express-service
spec:
  selector:
    app: mongodb-express-service
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 8081
      nodePort: 30001

更新 Kubectl 获取服务输出

NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes                ClusterIP      10.96.0.1        <none>        443/TCP          14d
mongodb-express-service   LoadBalancer   10.106.190.5     <pending>     8081:30001/TCP   2d3h
mongodb-service           ClusterIP      10.110.241.194   <none>        27017/TCP        3d23h

Kubectl 获取 pod 输出

mongo-express-85bdd6688f-mhv2x        1/1     Running   2          2d3h
mongodb-deployment-7f79c5f88f-h9dvf   1/1     Running   2          2d3h

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    发布此答案以提供有关 2 个主题的更多参考:

    • Kubernetes 服务无法获取外部 IP
    • 此问题中存在的问题

    Kubernetes 服务无法获取外部 IP

    Service 类型为LoadBalancer

    使用云提供商的负载平衡器向外部公开服务。 NodePortClusterIP 自动创建外部负载均衡器路由到的服务。

    在像 minikube 这样的 Kubernetes 解决方案中,您不会立即使用与 LoadBalancer 类型的 Service 关联的 External IP。您不需要External IP 连接到您的Services。您可以通过任一连接到您的Services

    • 使用NodePort$ minikube service xyz 正在使用它)
    • 使用$ minikube tunnel(这将“分配”External IP's)
    • Virtualbox 具体:

    此问题中存在的问题

    问题中存在的问题与 Service .spec.selectorDeployment .spec.selector.matchLabels 之间的不匹配有关。

    检查您的selector 是否配置正确(除了查看YAML 清单)的最简单方法是:

    • $ kubectl get endpoints
    NAME         ENDPOINTS                AGE
    kubernetes   A.B.C.D:443              28m
    nginx    --> 10.32.0.13:80 <--        5s 
    

    免责声明!

    endpoint 将在Pod 处于Running 状态和Ready 时出现。

    如果nginxService 名称)endpoints 为空,则可能意味着选择器不匹配或PodCrashLoopBackOffPending 等)存在问题。

    您也可以通过以下方式检查:

    • $ kubectl describe svc SERVICE_NAME Endpoints 字段
    • $ kubectl describe endpoints SERVICE_NAME Subsets.addresses 字段

    其他资源:

    【讨论】:

      【解决方案2】:

      您的应用程序中缺少一些资源。如果您已经创建了它,请与我的验证。否则创建它。

      1:创建Configmap资源

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: mongodb-config-map
      data:
        database_url: mongodb-service
      

      2:创建 Secret 资源

      apiVersion: v1
      kind: Secret
      metadata:
        name: mongodb-secret
      type: Opaque
      data:
        username: dXNlcm5hbWU=
        password: cGFzc3dvcmQ=
      

      3:在终端上

      minikube service mongodb-express-service
      

      以下是我的终端的输出,您可能会有所不同。

      |-----------|-------------------------|-------------|---------------------------|
      | NAMESPACE |          NAME           | TARGET PORT |            URL            |
      |-----------|-------------------------|-------------|---------------------------|
      | default   | mongodb-express-service |        8081 | http://192.168.49.2:30001 |
      |-----------|-------------------------|-------------|---------------------------|
      ?  Starting tunnel for service mongodb-express-service.
      |-----------|-------------------------|-------------|------------------------|
      | NAMESPACE |          NAME           | TARGET PORT |          URL           |
      |-----------|-------------------------|-------------|------------------------|
      | default   | mongodb-express-service |             | http://127.0.0.1:53898 |
      |-----------|-------------------------|-------------|------------------------|
      ?  Opening service default/mongodb-express-service in default browser...
      

      编辑更新:

      我已验证您的清单并注意到 Service selectorDeployment selector 不匹配。将Service: spec.selector 更改为app: mongo-express 而不是:app: mongodb-express-service

      【讨论】:

        【解决方案3】:

        您没有将 LoadBalancer 连接到您的 mongo-express 部署。将选择器 -> 应用程序更改为 mongo-express

        ###... previous config here
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: mongodb-express-service
        spec:
          selector:
            app: mongo-express
          type: LoadBalancer
          ports:
            - protocol: TCP
              port: 8081
              targetPort: 8081
              nodePort: 30001
        

        【讨论】:

          猜你喜欢
          • 2018-08-27
          • 1970-01-01
          • 2017-10-21
          • 1970-01-01
          • 2021-11-21
          • 1970-01-01
          • 1970-01-01
          • 2018-06-06
          相关资源
          最近更新 更多