繁体   English   中英

Kubernetes nginx-ingress 没有暴露服务

[英]Kubernetes nginx-ingress isnt exposing the services

我正在尝试实现以下目标,我已经在 AWS EC2 上使用 kops 安装了 Kube 集群(版本 1.18)。 它已经启动并正在运行,但现在我想将一些工作负载暴露给互联网,以便通过子域使用,但它没有按预期工作,我为此使用了入口。

更多详情如下:

Client Version: v1.18.3
Server Version: v1.18.3

helm version --short
Client: v2.17.0+ga690bad
Server: v2.17.0+ga690bad

图表如下:

deploy.yaml:
    
        name: custom-smscs
        branch: k8s
        git: git@github.com:REDACTED
        
        image:
          repository: <account_id>.dkr.ecr.eu-west-1.amazonaws.com/custom_smscs
        
        service:
          port: 80
          internalPort: 80
          healthEndpoint: /health

部署.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: "{{ .Chart.Name }}-deployment"
  labels:
    app: {{ .Values.name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.name }}
    spec:
      containers:
      - name: {{ .Values.name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        ports:
        - containerPort: {{ .Values.service.internalPort }}
        env:
        - name: NODE_ENV
          value: {{ .Values.environment }}
        livenessProbe:
          httpGet:
            path: {{ .Values.service.healthEndpoint }}
            port: {{ .Values.service.internalPort }}
          initialDelaySeconds: 15
          timeoutSeconds: 10
          periodSeconds: {{ .Values.service.healthPeriod }}
          successThreshold: 1
          failureThreshold: {{ .Values.service.healthThreshold }}
        resources:
{{ toYaml .Values.resources | indent 12 }}

服务.yaml:

apiVersion: v1
kind: Service
metadata:
  name: "{{ .Values.name }}-service"
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
spec:
  type: {{ .Values.service.type }}
  selector:
          app: "{{ .Values.name }}"
  ports:
  - port: {{ .Values.service.port }}
    targetPort: {{ .Values.service.internalPort }}
    protocol: TCP
    name: http
  {{- if .Values.service.ports }}
  {{- range $name, $port := .Values.service.ports }}
  - port: {{ $port }}
    targetPort: {{ $port }}
    protocol: TCP
    name: {{ $name }}
  {{- end }}
  {{- end }}
  selector:
    app: {{ .Values.name }}

入口.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: {{ .Values.name }}-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: customsmscs.my-domain.com
    http:
      paths:
        - path: /
          backend:
            serviceName: {{ .Values.name }}-service
            servicePort: {{ .Values.service.port }}

值。yaml:

replicaCount: 1
image:
  repository: replaced
  tag: "0.0.1"
  pullPolicy: Always
service:
  type: ClusterIP
  name: replaced
  port: 80
  internalPort: 80
  healthEndpoint: /health
  healthPeriod: 30
  healthThreshold: 3
environment: production
resources:
  limits:
    cpu: 256m
    memory: 256Mi
  requests:
    cpu: 100m
    memory: 128Mi
autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 2
  target: 80

nginx 是使用以下命令安装的:

kc apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/aws/deploy-tls-termination.yaml

正确运行 nginx-ingress 所需的一切:

    kc -n ingress-nginx get po
    NAME                                       READY   STATUS      RESTARTS   AGE
    ingress-nginx-admission-create-qltch       0/1     Completed   0          154m
    ingress-nginx-admission-patch-6ll84        0/1     Completed   0          154m
    ingress-nginx-controller-b4678dfcb-8gn56   1/1     Running     0          154m
    kc get all | grep custom
pod/custom-smscs-deployment-6cd5f58bb8-ht49w   1/1     Running   0          37m
service/custom-smscs-service   ClusterIP   100.70.5.207     <none>        80/TCP            37m
deployment.apps/custom-smscs-deployment   1/1     1            1           37m
replicaset.apps/custom-smscs-deployment-6cd5f58bb8   1         1         1       37m
    kc get ing
    NAME                   CLASS    HOSTS                                   ADDRESS                                                                   PORTS   AGE
   custom-smscs-ingress   <none>   customsmscs.my-domain.com   <ELB>.amazonaws.com   80      38m
    kc get ep
    NAME                   ENDPOINTS                               AGE
    custom-smscs-service   100.101.173.27:80                       40m

但是当我确实描述了入口时,我注意到了一些错误,不确定这是不是一个原因:

nginx 日志:

    I0525 09:47:46.702227       6 controller.go:146] "Configuration changes detected, backend reload required"
    I0525 09:47:46.780938       6 controller.go:163] "Backend successfully reloaded"
    I0525 09:47:46.781209       6 event.go:282] Event(v1.ObjectReference{Kind:"Pod", Namespace:"ingress-nginx", Name:"ingress-nginx-controller-b4678dfcb-8gn56", UID:"d5d9246b-63a8-4eba-8467-fdec0f3f9b3f", APIVersion:"v1", ResourceVersion:"89646", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration
    I0525 09:48:19.528969       6 status.go:284] "updating Ingress status" namespace="default" ingress="custom-smscs-ingress" currentValue=[] newValue=[{IP: Hostname:<ELB>.eu-west-1.elb.amazonaws.com Ports:[]}]
    I0525 09:48:19.533791       6 event.go:282] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"custom-smscs-ingress", UID:"309890dd-1148-4aa8-bc14-62e57bbd969f", APIVersion:"networking.k8s.io/v1beta1", ResourceVersion:"267393", FieldPath:""}): type: 'Normal' reason: 'Sync' Scheduled for sync

<错误:未找到端点“default-http-backend”>

        kc describe ing custom-smscs-ingress
    Name:             custom-smscs-ingress
    Namespace:        default
    Address:          <ELB>.eu-west-1.elb.amazonaws.com
    Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
    Rules:
      Host                                   Path  Backends
      ----                                   ----  --------
      customsmscs.my-domain.com  
                                             /   custom-smscs-service:80 (100.101.173.27:80)
    Annotations:                             kubernetes.io/ingress.class: nginx
    Events:
      Type    Reason  Age                From                      Message
      ----    ------  ----               ----                      -------
      Normal  Sync    43m (x2 over 43m)  nginx-ingress-controller  Scheduled for sync

因此,除了上述错误之外,一切看起来都很好,但是当我尝试在浏览器中打开 app.example.com 时,我得到“嗯……无法访问此页面”。 但是当我在浏览器中打开 ELB DNS 端点 URL 时,我得到“404 not found”,我猜这是正确的响应,因为我称之为默认后端。

我注意到的另一件事是,在 ELB 上,只有两个节点中的一个在服务:

在此处输入图像描述

我实际上已经花了 4 天的时间,但无法使其正常工作。

你知道如何解决/克服它吗?

先感谢您!

好的,解决方案非常简单......我添加了 DNS 一条记录(别名),例如 *.ks8.my-domain.com 指向入口 ELB 并创建了一个 ZEA52C36203C5F99C3CE2442D531B1A2 证书以及 AWS 管理器证书我必须做的更改,在ingress.yaml中 *host: * 参数应更改为custommscs.k8s.my-domain.com而不是custommscs.my-domain.Z4D236D9A2D102C5FE6AD1C1C 然后我删除了部署和所有相关资源(入口、服务等)并重新部署它,现在该应用程序在https://customsmscs.k8s.my-domain.com 可用

感谢@thomas 的建议,你帮了我很多!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM