【问题标题】:Ingress configuration issue in Docker kubernetes clusterDocker kubernetes 集群中的入口配置问题
【发布时间】:2021-11-02 12:25:34
【问题描述】:

我最近刚接触 Kubernetes 和 Docker,但遇到了一些问题。

我正在通过 Docker 运行单个本地 Kubernetes 集群,并使用 skaffold 来控制集群内对象的构建和拆卸。当我运行skaffold dev 时,构建似乎成功,但是当我尝试通过 Postman 向我的集群发出请求时,请求挂起。我正在使用一个 ingress-nginx 控制器,我觉得这个错误就在这里。我的请求处理逻辑很简单,所以我觉得问题不在于路由处理,而在于我的集群配置,特别是入口控制器。我将在我的 skaffold yaml 配置和我的入口 yaml 配置下方发布。

非常感谢任何帮助,因为我已经为这个错误苦苦挣扎了一段时间。

入口 yaml 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
    - host: ticketing.dev
      http:
        paths:
          - path: /api/users/?(.*)
            pathType: Prefix
            backend:
              service:
                name: auth-srv
                port:
                  number: 3000

请注意,我的 /etc/hosts 文件中有一个从 ticketing.dev 重定向到 127.0.0.1

验证服务 yaml 配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: conorl47/auth
---

kind: Service
metadata:
  name: auth-srv
spec:
  selector:
    app: auth
  ports:
    - name: auth
      protocol: TCP
      port: 3000
      targetPort: 3000

skaffold yaml 配置:

apiVersion: skaffold/v2alpha3
kind: Config
deploy:
  kubectl:
    manifests:
      - ./infra/k8s/*
build:
  local:
    push: false
  artifacts:
    - image: conorl47/auth
      context: auth
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: 'src/**/*.ts'
            dest: .

为了安装 ingress nginx 控制器,我按照https://kubernetes.github.io/ingress-nginx/deploy/ 的安装说明进行操作,即 Docker 桌面安装说明。

运行该命令后,我看到以下两个 Docker 容器在 Docker 桌面上运行

在 ingress-nginx 命名空间中创建的两个服务是:

❯ k get services -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.103.6.146   <pending>     80:30036/TCP,443:30465/TCP   22m
ingress-nginx-controller-admission   ClusterIP      10.108.8.26    <none>        443/TCP                      22m

当我 kubectl 描述这两个服务时,我看到以下内容:

❯ kubectl describe service ingress-nginx-controller -n ingress-nginx
Name:                     ingress-nginx-controller
Namespace:                ingress-nginx
Labels:                   app.kubernetes.io/component=controller
                          app.kubernetes.io/instance=ingress-nginx
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=ingress-nginx
                          app.kubernetes.io/version=1.0.0
                          helm.sh/chart=ingress-nginx-4.0.1
Annotations:              <none>
Selector:                 app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.103.6.146
IPs:                      10.103.6.146
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  30036/TCP
Endpoints:                10.1.0.10:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  30465/TCP
Endpoints:                10.1.0.10:443
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     32485
Events:                   <none>

和:

❯ kubectl describe service ingress-nginx-controller-admission -n ingress-nginx
Name:              ingress-nginx-controller-admission
Namespace:         ingress-nginx
Labels:            app.kubernetes.io/component=controller
                   app.kubernetes.io/instance=ingress-nginx
                   app.kubernetes.io/managed-by=Helm
                   app.kubernetes.io/name=ingress-nginx
                   app.kubernetes.io/version=1.0.0
                   helm.sh/chart=ingress-nginx-4.0.1
Annotations:       <none>
Selector:          app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.108.8.26
IPs:               10.108.8.26
Port:              https-webhook  443/TCP
TargetPort:        webhook/TCP
Endpoints:         10.1.0.10:8443
Session Affinity:  None
Events:            <none>

【问题讨论】:

    标签: docker kubernetes postman microservices kubernetes-ingress


    【解决方案1】:

    看起来,您已经创建了 LoadBalancer 类型的入口服务,这通常会从您选择的云提供商那里提供一个外部负载均衡器。这也是为什么它仍然悬而未决的原因。它正在等待负载均衡器准备好,但它永远不会发生。

    如果您希望在集群外部访问该入口服务,则需要使用类型NodePort

    因为他们的文档在这一点上不是很好,而且默认情况下似乎是这样的。您可以下载https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml的内容并在申请前进行修改。或者你使用helm,那么你可能可以配置这个。

    你也可以用这种肮脏的方式来做。

    kubectl apply --dry-run=client -o yaml -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml \
      | sed s/LoadBalancer/NodePort/g \
      | kubectl apply -f -
    

    您也可以就地编辑。

    kubectl edit svc ingress-nginx-controller-admission -n ingress-nginx
    

    【讨论】:

    • 您将服务类型从 LoadBalancer 编辑到 NodePort 的第一个命令运行成功,但问题仍然存在。我会听取您的建议并进一步查看有关配置入口控制器的文档。非常感谢您的所有时间和帮助。
    • 一旦它的类型是NodePort,你必须记住它会分配一个随机的高数字端口,你必须查找它。所以你需要做类似localhost:&lt;highPortNumber&gt;/&lt;yourUrl&gt;的事情。
    • 你会不会碰巧知道谷歌云是否有可能干扰我的入口控制器。我之前曾尝试将我的项目迁移到谷歌云,但最终决定反对。这可以解释为什么入口服务默认使用负载均衡器。我在 Docker Desktop 中的一些容器也有 k8s.gcr 扩展名。我以为我已经完全删除了任何谷歌云配置设置,但这可能是问题
    • 它默认为 Loadbalancer,因为它写在你从 url 获取的 yaml 中:raw.githubusercontent.com/kubernetes/ingress-nginx/…。浏览他们的文档,我找不到替代的 yaml 文件。除了获取 yaml 并自己更改之外,似乎没有其他选择。我打赌他们的掌舵释放,这是可行的。 helm.sh。除此之外,我看不出 GCP 会如何干扰您的本地集群。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2016-08-23
    相关资源
    最近更新 更多