簡體   English   中英

Kubernetes Nginx NodePort 上的入口 Controller

[英]Kubernetes Nginx Ingress Controller on NodePort

我正在由 RKE 管理的 Kubernetes 集群上部署基於 nginx 的入口 controller。 (我也直接嘗試過沒有 RKE)。

在這兩種情況下,它都嘗試使用/綁定到主機上的Ports 80443 ,但它失敗了,因為在所有服務帳戶的 pod security policy中我不允許主機端口。

事實上,我不需要直接在主機上訪問入口,但我想從外部LoadBalancer訪問ingress controller作為NodePort上的Service

有沒有辦法部署Nginx ingress controller不使用任何主機端口。

通過禁用 hostNetwork 來完成,並刪除不必要的權限和功能:

C02W84XMHTD5:Downloads iahmad$ kubectl get deployments -n ingress-nginx -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
  kind: Deployment
  metadata:
    annotations:
      deployment.kubernetes.io/revision: "1"

    labels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
    name: nginx-ingress-controller
    namespace: ingress-nginx
    resourceVersion: "68427"
    selfLink: /apis/extensions/v1beta1/namespaces/ingress-nginx/deployments/nginx-ingress-controller
    uid: 0b92b556-12fa-11ea-9d82-08002762a3c5
  spec:
    progressDeadlineSeconds: 600
    replicas: 1
    revisionHistoryLimit: 10
    selector:
      matchLabels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    strategy:
      rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 25%
      type: RollingUpdate
    template:
      metadata:
        annotations:
          prometheus.io/port: "10254"
          prometheus.io/scrape: "true"
        creationTimestamp: null
        labels:
          app.kubernetes.io/name: ingress-nginx
          app.kubernetes.io/part-of: ingress-nginx
      spec:
        containers:
        - args:
          - /nginx-ingress-controller
          - --configmap=$(POD_NAMESPACE)/nginx-configuration
          - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
          - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
          - --publish-service=$(POD_NAMESPACE)/ingress-nginx
          - --annotations-prefix=nginx.ingress.kubernetes.io
          env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                apiVersion: v1
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                apiVersion: v1
                fieldPath: metadata.namespace
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
          imagePullPolicy: IfNotPresent
          lifecycle:
            preStop:
              exec:
                command:
                - /wait-shutdown
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          name: nginx-ingress-controller
          ports:
          - containerPort: 80
            name: http
            protocol: TCP
          - containerPort: 443
            name: https
            protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          resources: {}
          securityContext:
            runAsUser: 33
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
        dnsPolicy: ClusterFirst
        restartPolicy: Always
        schedulerName: default-scheduler
        securityContext: {}
        serviceAccount: nginx-ingress-serviceaccount
        serviceAccountName: nginx-ingress-serviceaccount
        terminationGracePeriodSeconds: 300
  status:
    availableReplicas: 1
    conditions:
    - lastTransitionTime: 2019-11-29T22:46:59Z
      lastUpdateTime: 2019-11-29T22:46:59Z
      message: Deployment has minimum availability.
      reason: MinimumReplicasAvailable
      status: "True"
      type: Available
    - lastTransitionTime: 2019-11-29T22:46:13Z
      lastUpdateTime: 2019-11-29T22:46:59Z
      message: ReplicaSet "nginx-ingress-controller-84758fb96c" has successfully progressed.
      reason: NewReplicaSetAvailable
      status: "True"
      type: Progressing
    observedGeneration: 1
    readyReplicas: 1
    replicas: 1
    updatedReplicas: 1
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

然后創建指向入口 controller 端口的節點端口服務:

C02W84XMHTD5:Downloads iahmad$ kubectl get svc -n ingress-nginx -o yaml
apiVersion: v1
items:
- apiVersion: v1
  kind: Service
  metadata:

    labels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
    name: ingress-nginx
    namespace: ingress-nginx
    resourceVersion: "68063"
    selfLink: /api/v1/namespaces/ingress-nginx/services/ingress-nginx
    uid: 7aa425a4-12f9-11ea-9d82-08002762a3c5
  spec:
    clusterIP: 10.97.110.93
    externalTrafficPolicy: Cluster
    ports:
    - name: http
      nodePort: 30864
      port: 80
      protocol: TCP
      targetPort: 80
    - name: https
      nodePort: 30716
      port: 443
      protocol: TCP
      targetPort: 443
    selector:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
    sessionAffinity: None
    type: NodePort
  status:
    loadBalancer: {}
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""
C02W84XMHTD5:Downloads iahmad$ 

在有關NodePort的文檔中,您可以發現該類型可以分配范圍為 30000-32767 的端口。 但是,有一種解決方法。 如果您將添加一個帶有請求范圍的特殊標志--service-node-port-range ,則准許 controller 允許您使用端口 80 和 443 創建 NodePort。

您將需要 go 到/etc/kubernetes/manifests/ ,使用 sudo 編輯kube-apiserver.yaml並添加條目- --service-node-port-range=1-32767 之后,您需要保存它。

現在您需要創建service 為此,您需要編輯此 yaml並在端口中將node port添加到spec.ports

前:

 ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP

后:

  ports:
  - name: http
    nodePort: 80
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    nodePort: 443
    port: 443
    protocol: TCP
    targetPort: 443

在這些更改之后,您可以在/etc/kubernetes/manifests/中再次編輯kube-apiserver.yaml並在- --service-node-port-range的同一行中使用#對其進行注釋。

然后就可以curl這個NodePort地址和Node地址。

編輯:澄清后

Ingress 可以通過兩種方式部署。 第一個是將Nginx部署為Deamonset ,這需要配置文件中的hostPort 但是還有另一種選擇,您可以將Nginx部署為Deployment

NodeIP 和已知端口:DaemonSet 中的 Pod 可以使用 hostPort,以便通過節點 IP 訪問 Pod。 客戶端以某種方式知道節點 IP 列表,並且按照慣例知道端口。

但是在頁面底部,您可以找到:

DaemonSet 與 Deployment 類似,它們都創建 Pod,並且這些 Pod 具有預期不會終止的進程(例如 web 服務器、存儲服務器)。

將 Deployment 用於無狀態服務,例如前端,其中擴展和縮減副本數量和推出更新比准確控制 Pod 運行在哪個主機上更重要。 當一個 Pod 的副本總是在所有或某些主機上運行很重要,並且當它需要在其他 Pod 之前啟動時,使用 DaemonSet。

您需要將Ingress部署為Deployment不是Deamonset

Nginx 部署示例可在此處找到。 由於部署不需要hostPort ,您將能夠在沒有此參數的情況下創建 pod。

暫無
暫無

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

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