运行 具有 hostNetwork 的 Ingress 控制器:true

Running an Ingress controller with hostNetwork: true

在研究一个 Stack Overflow 的解决方案时,我 运行 陷入了一个单独的困惑点。我不确定如何搜索这个问题的答案,因为有太多我不理解的潜在部分。

情况

我想 运行 hostNetwork 上的 Ingress 控制器(用于开发目的)。到目前为止我学到的是我可以用这样的配置文件创建一个 Ingress 控制器:

apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: / 
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: web 
          servicePort: 8080

web 是什么并不重要,只是它是我集群中的一项服务 运行。

在我上面链接的问题中,我被指示“安装 nginx 入口控制器并在 deployment.yaml 中使用 hostNetwork: true”。

我还没有为这个项目创建 deployment.yaml,但我的理解是它用于定义 Pods,以及我希望那些 pods 如何随副本集扩展.

问题

部署是否仅用于定义 Pods(正如我目前的理解),还是我也可以在其中包含我的 service/ingress?无论哪种情况,我应该在哪里定义 hostNetwork: true 指令? (注意:所有这些的目的是打开端口 80 并将其指向我的 Ingress 控制器,所以我只想在 Pods 上设置 hostNetwork: true 似乎不正确他们自己。)

安装 nginx 入口控制器后,命名空间 ingress-nginx 中应该有一个部署 ingress-nginx-controller。您需要修改部署。您可以使用

对其进行编辑
kubectl edit deploy ingress-nginx-controller -n ingress-nginx

并在 pod 规范部分添加 hostNetwork: true

...
spec:
  hostNetwork: true
  containers:
    - name: controller
      image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.33.0
...

这并不明显。 Ingress 资源控制器使用 .yaml 部署(例如 https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml

这个 yaml 中有很多东西 - 一个资源是部署。如果像我一样,您要部署到裸机专用 LAN 环境中,则可以将 hostNetwork 设置为 true。所以 - wget 它(wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml),并修改它以设置 Deployment 规范的模板规范,以便 hostNetwork: true - 类似于(向下滚动到末尾):

# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    helm.sh/chart: ingress-nginx-4.0.6
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.0.4
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/instance: ingress-nginx
      app.kubernetes.io/component: controller
  revisionHistoryLimit: 10
  minReadySeconds: 0
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/component: controller
    spec:
      dnsPolicy: ClusterFirst
      containers:
        - name: controller
          image: k8s.gcr.io/ingress-nginx/controller:v1.0.4@sha256:545cff00370f28363dad31e3b59a94ba377854d3a11f18988f5f9e56841ef9ef
          imagePullPolicy: IfNotPresent
          lifecycle:
            preStop:
              exec:
                command:
                  - /wait-shutdown
          args:
            - /nginx-ingress-controller
            - --election-id=ingress-controller-leader
            - --controller-class=k8s.io/ingress-nginx
            - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
            - --validating-webhook=:8443
            - --validating-webhook-certificate=/usr/local/certificates/cert
            - --validating-webhook-key=/usr/local/certificates/key
          securityContext:
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            runAsUser: 101
            allowPrivilegeEscalation: true
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: LD_PRELOAD
              value: /usr/local/lib/libmimalloc.so
          livenessProbe:
            failureThreshold: 5
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
            - name: https
              containerPort: 443
              protocol: TCP
            - name: webhook
              containerPort: 8443
              protocol: TCP
          volumeMounts:
            - name: webhook-cert
              mountPath: /usr/local/certificates/
              readOnly: true
          resources:
            requests:
              cpu: 100m
              memory: 90Mi
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: ingress-nginx
      terminationGracePeriodSeconds: 300
      hostNetwork: true
      volumes:
        - name: webhook-cert
          secret:
            secretName: ingress-nginx-admission

部署它,然后设置您的入口 资源 以找到您的控制器。

类似于:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-api-ingress
  annotations:
    kubernetes.io/ingress.class: nginx

您的关键测试是:

  • 我的入口在我的裸机实现中是否有专用节点?
  • 如果我在入口节点上访问端口 80,是否会得到与访问 NodePort 相同的结果? (假设 NodePort 是 31207 - 我在入口节点上访问端口 80 是否与在任何节点上访问端口 31207 得到相同的结果?)

最后说明:Ingress 在过去几年发生了很大变化,教程经常提供未通过验证的示例 - 如果此答案已过时,请随时对此答案发表评论。

另外,有些引用会随便说“只是更新部署!” - 他们所指的部署是 Ingress Controller 的部署,而不是您的 pod 部署或类似的部署。