簡體   English   中英

使用 nginx-ingress 公開服務

[英]Expose service using nginx-ingress

我所有的 pod 都在服務器上工作。

NAMESPACE       NAME                                              READY   STATUS    RESTARTS   AGE
default         user-api-66fc4fc9d-igqnj                          3/3     Running   0          25s
ingress-nginx   nginx-ingress-controller-5556bd698f-qgw8r         1/1     Running   0          12h
kube-system     coredns-6955765f44-4xnhh                          1/1     Running   1          40h
kube-system     coredns-6955765f44-6tb8p                          1/1     Running   1          40h
kube-system     etcd-izbp1dyjigsfwmw0dtl85gz                      1/1     Running   1          40h
kube-system     kube-apiserver-izbp1dyjigsfwmw0dtl85gz            1/1     Running   1          40h
kube-system     kube-controller-manager-izbp1dyjigsfwmw0dtl85gz   1/1     Running   1          40h
kube-system     kube-flannel-ds-amd64-8b5pc                       1/1     Running   0          40h
kube-system     kube-flannel-ds-amd64-jq4kl                       1/1     Running   1          40h
kube-system     kube-proxy-9zx7c                                  1/1     Running   1          40h
kube-system     kube-proxy-lh55j                                  1/1     Running   0          40h
kube-system     kube-scheduler-izbp1dyjigsfwmw0dtl85gz            1/1     Running   1          40h

我創建的入口。

NAME          HOSTS                ADDRESS   PORTS   AGE
app-ingress   example.com                    80      5h16m

我為我的單一部署創建了 ClusterIP 服務,並使用帶有資源文件的 loadBalance ingress-nginx 控制器來公開內部服務。 相關代碼如下所示。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: user-api
  strategy: {}
  template:
    metadata:
      labels:
        app: user-api
    spec:
      dnsPolicy: ClusterFirstWithHostNet
      hostNetwork: true
      containers:
      - name: user-api
        image: doumeyi/user-api-amd64:1.0
        ports:
        - name: user-api
          containerPort: 3000
        resources: {}
---
apiVersion: v1
kind: Service
metadata:
  name: user-api
spec:
  selector:
    app: user-api
  ports:
  - name: user-api
    port: 3000
    targetPort: 3000
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: example.com
      http:
        paths:
        - path: /user-api
          backend:
            serviceName: user-api
            servicePort: 3000

ingress-nginx 服務似乎有任何問題,外部 ip 總是掛起。

NAMESPACE       NAME            TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                        AGE
ingress-nginx   ingress-nginx   LoadBalancer   10.104.176.152   <pending>     80:31612/TCP,443:30097/TCP                     13h

請參考: 外部訪問kubernetes服務

您可以使用以下方法公開:

  • 節點端口服務類型

  • LoadBalancer 服務類型(如果您托管在雲上)

您在 ingress 中指定的端口 80 是 kubernetes 服務端口。 不會有進程在該端口上偵聽。 應該有一個進程監聽 pod 規范中指定的容器端口。 那將在部署 pod 的節點中。 此外,對於您在部署 nginx 入口控制器本身時指定的端口 80 和 443,應該有 nginx 進程偵聽,但您需要在部署 nginx 控制器 pod 的節點中進行檢查。

請更改服務定義並指定正確的端口:

apiVersion: v1
kind: Service
metadata:
  name: user-api
spec:
  selector:
    app: user-api
  ports:
    - name: user-api
    - port: 3000
      targetPort: 80
  type: LoadBalancer

來自外部負載均衡器的流量被定向到后端 Pod。 雲提供商決定如何進行負載平衡。

對於 LoadBalancer 類型的服務,當定義了多個端口時,所有端口必須具有相同的協議,並且協議必須是 TCP、UDP 和 SCTP 之一。

一些雲提供商允許您指定 loadBalancerIP。 在這些情況下,負載平衡器是使用用戶指定的 loadBalancerIP 創建的。 如果未指定 loadBalancerIP 字段,則使用臨時 IP 地址設置 loadBalancer。 如果您指定 loadBalancerIP 但您的雲提供商不支持該功能,則您設置的 loadbalancerIP 字段將被忽略。

此外,如果您使用 nginx 入口控制器,請從部署配置文件中刪除 dnspolicy 和 hostnetwork,然后應用更改( $ kubectl apply -f your-deployment-conf-file.yaml )。

您可以在此處找到更多信息: nginx-troubleshootingnginx-ingress

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM