Nginx 入口控制器 - Api 在端口 80 和 443 中响应

问题描述 投票:0回答:1

我需要托管在 AKS 中的 API 在端口 80 和 443 中响应。在端口 80 中,因为我当前的一些客户端正在使用“硬编码”端口 80,并且他们的 HttpClient 不遵循重定向...

我的第一次尝试是:

apiVersion: v1
kind: Service
metadata:
  name: myApp-service
  namespace: myAppe-main
  labels:
    app: myApp-service
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: http
    - port: 443
      targetPort: 443
      protocol: TCP
      name: https
  selector:
    app: myApp-deploy
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myApp-ingress
  namespace: myApp-main
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: H2C
    nginx.ingress.kubernetes.io/secure-backends: 'true'
    nginx.ingress.kubernetes.io/ssl-passthrough: 'true'
spec:
  rules:
    - host: myApp.MyInternalDns.net
      http:
        paths:
          - backend:
              service:
                name: myApp-service
                port:
                    number: 80
            path: /
            pathType: Prefix
      https:
        paths:
          - backend:
              service:
                name: myApp-service
                port:
                    number: 443
            path: /
            pathType: Prefix

虽然 AKS 接受这个 yaml,但它会砍掉其中的

https
部分...

如何让入口打开两个端口并使其在 http 和 https 上运行?

nginx kubernetes-ingress azure-aks nginx-ingress
1个回答
0
投票

要在 AKS 中设置在 HTTP(端口 80)和 HTTPS(端口 443)上响应的 Nginx Ingress 控制器,并将流量正确路由到您的服务,您需要配置 Ingress 资源和关联的服务。您的 YAML 中可能存在错误或配置错误,尤其是 Ingress 规范下的

https
规则,这不是直接位于
rules
下的有效字段。

确保 AKS 集群中安装了 Nginx Ingress Controller。如果尚未安装

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --namespace ingress-basic --create-namespace

配置您的部署和服务

示例(替换为您自己的部署文件)-

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: default
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 2
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginxdemos/hello
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
  namespace: default
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 80
    name: http

enter image description here

现在设置 Ingress 来处理 HTTP 和 HTTPS。 相应地配置您的 Ingress 资源,即您需要定义 TLS 设置以支持 HTTPS。如果您的服务需要直接支持 HTTPS(而不仅仅是在入口处终止),请确保 Pod 内的应用程序配置为 HTTPS 并侦听端口 443。在大多数情况下,您将在入口处终止 SSL 并将流量作为 HTTP 转发到你的 pod。 示例-

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  namespace: default
spec:
  ingressClassName: "nginx"
  tls:
  - hosts:
    - "myapp.example.com"
    secretName: myapp-tls
  rules:
  - host: "myapp.example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80

enter image description here 如果您尚未创建 TLS 密钥并使用自签名证书进行测试,那么

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout myapp.key -out myapp.crt -subj "/CN=myapp.example.com/O=myapp"

kubectl create secret tls myapp-tls --key myapp.key --cert myapp.crt -n default

enter image description here 完毕。您可以按以下方式验证

kubectl get ingress -n default

enter image description here

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.