簡體   English   中英

Kubernetes - Ingress / Service / LB.

[英]Kubernetes - Ingress / Service / LB

我是K8s的新手,這是我第一次嘗試掌握它。 我正在嘗試使用此deployment.yml設置基本的Nodejs Express API:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - image: registry.gitlab.com/<project>/<app>:<TAG>
        imagePullPolicy: Always
        name: api
        env:
        - name: PORT
          value: "8080"
        ports:
          - containerPort: 8080
            hostPort: 80
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 30
          timeoutSeconds: 1
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 30
          timeoutSeconds: 1
      imagePullSecrets:
        - name: registry.gitlab.com

這是通過gitlab-ci部署的。 這是有效的,我已經設置了一個服務來公開它:

apiVersion: v1
kind: Service
metadata:
  name: api-svc
  labels:
    app: api-svc
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: api
  type: LoadBalancer

但我一直在尋找入口,可能有多個服務的單一入口點。 我一直在閱讀Kubernetes指南,我通讀了這個Kubernetes Ingress示例 ,這是我創建的ingress.yml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  backend:
    serviceName: api-svc
    servicePort: 80

但是當我訪問從入口生成的外部IP地址時,這不起作用,我只有502個錯誤頁面。

任何人都可以指出我正確的方向,我做錯了什么或我錯過了什么? 我看到在上面的示例鏈接中有一個nginx-rc.yml,我在部署時完全像在示例中那樣創建但是仍然沒有從端點獲得任何內容。 API可從服務外部IP訪問,但..

非常感謝

我再次調查它,並認為我弄清楚了。

為了使Ingress能夠在GCE上工作,您需要將NodePort后端服務定義為ClusterIP或LoadBalancer。

此外,您需要確保http運行狀況檢查/工作(您將看到Google L7 Loadbalancer在該網址上大量點擊您的服務)然后它可用。

以為我會發布我的工作部署/服務/入口

因此,經過努力才能實現這一目標,以下是我以前的工作方式:

部署

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: backend-api-v2
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: backend-api-v2
    spec:
      containers:
      - image: registry.gitlab.com/<project>/<app>:<TAG>
        imagePullPolicy: Always
        name: backend-api-v2
        env:
        - name: PORT
          value: "8080"
        ports:
          - containerPort: 8080
        livenessProbe:
          httpGet:
            # Path to probe; should be cheap, but representative of typical behavior
            path: /healthz
            port: 8080
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 30
          timeoutSeconds: 5
      imagePullSecrets:
        - name: registry.gitlab.com

服務

apiVersion: v1
kind: Service
metadata:
  name: api-svc-v2
  labels:
    app: api-svc-v2
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 31810
    protocol: TCP
    name: http
  selector:
    app: backend-api-v2

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
  - host: api.foo.com
    http:
      paths:
      - path: /v1/*
        backend:
          serviceName: api-svc
          servicePort: 80
      - path: /v2/*
        backend:
          serviceName: api-svc-v2
          servicePort: 80

要注意的重要事項是@Tigraine指出的是服務使用type: NodePort而不是LoadBalancer ,我還定義了一個nodePort,但我相信如果你把它留出來它會創建一個。

對於與規則不匹配的任何路由,它將使用default-http-backend這是GKE在kube-system命名空間中運行的默認容器。 因此,如果我訪問了http://api.foo.com/bob我會收到default backend - 404的默認響應default backend - 404

希望這可以幫助

看起來您將服務暴露給端口80但您的容器暴露8080因此對服務的任何請求都將失敗。

另外,看一下示例入口資源( https://github.com/nginxinc/kubernetes-ingress/blob/master/examples/complete-example/cafe-ingress.yaml ),您還需要定義哪些主機/命中入口控制器時路徑路由。 (即example.foo.com - > api-svc)

暫無
暫無

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

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