如何在 AKS NginX Ingress 中公开服务

How to expose service in AKS NginX Ingress

我有一个服务在“开发”名称中公开了一个“hello world”网络部署space。

服务 YAML

kind: Service
apiVersion: v1
metadata:
  name: hello-v1-svc
spec:
  selector:
    app: hello-v1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

为了测试页面是否正常工作,我 运行 “kubectl port-forward” 页面使用 public IP 成功显示。

编辑: 然后部署了 Ingress 但页面只显示在 vnet 地址 space

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  labels:
    app: app
    version:  1.0.0
  name: dev-ingress
  namespace:  develop
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: hello-v1-svc
              servicePort: 80
            path: /

入口规则

Rules:
  Host        Path  Backends
  ----        ----  --------
  *
              /   hello-v1-svc:80 (10.1.1.13:8080,10.1.1.21:8080,10.1.1.49:8080)

我要跳过哪一步才能显示页面?

首先回答您的意见:

Maybe it is related to this annotation: "service.beta.kubernetes.io/azure-load-balancer-internal". Controller is set to "True"

service.beta.kubernetes.io/azure-load-balancer-internal: "true" 注解通常在您为内部虚拟网络创建入口控制器时使用。在此注解的情况下,入口控制器配置在内部私有虚拟网络和 IP 地址上。不允许外部访问。 您可以在 Create an ingress controller to an internal virtual network in Azure Kubernetes Service (AKS) 文章中找到更多信息。

复制了您的案例,创建了 AKS 集群并在 yamls 下应用。它按预期工作,所以请使用

apiVersion: v1
kind: Namespace
metadata:
  name: develop
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-deployment
  namespace: develop
  labels:
    app: hello-v1
spec:
  selector:
    matchLabels:
      app: hello-v1
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-v1
    spec:
      containers:
      - name: hello-v1
        image: paulbouwer/hello-kubernetes:1.8
        ports:
        - containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
  name: hello-v1-svc
spec:
  type: ClusterIP
  selector:
    app: hello-v1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dev-ingress
  namespace: develop
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: hello-v1-svc
              servicePort: 80
            path: /

我的服务列表

vitalii@Azure:~$ kubectl get svc -A
NAMESPACE       NAME                             TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE
default         hello-v1-svc                     ClusterIP      10.0.20.206    <none>         80/TCP                       19m
default         kubernetes                       ClusterIP      10.0.0.1       <none>         443/TCP                      83m
ingress-basic   nginx-ingress-controller         LoadBalancer   10.0.222.156   *.*.*.*   80:32068/TCP,443:30907/TCP   53m
ingress-basic   nginx-ingress-default-backend    ClusterIP      10.0.193.198   <none>         80/TCP                       53m
kube-system     dashboard-metrics-scraper        ClusterIP      10.0.178.224   <none>         8000/TCP                     83m
kube-system     healthmodel-replicaset-service   ClusterIP      10.0.199.235   <none>         25227/TCP                    83m
kube-system     kube-dns                         ClusterIP      10.0.0.10      <none>         53/UDP,53/TCP                83m
kube-system     kubernetes-dashboard             ClusterIP      10.0.115.184   <none>         443/TCP                      83m
kube-system     metrics-server                   ClusterIP      10.0.199.200   <none>         443/TCP                      83m

当然,出于安全原因,我隐藏了 EXTERNAL-IP 个 nginx-ingress-controller。那是您应该用来访问页面的 IP。

您可以在 Create an ingress controller in Azure Kubernetes Service (AKS) 文章中找到更多信息和示例