Skip to content

安装 Ingress Controller

概述

  Kubernetes 集群默认没有部署 Ingress Controller,因此 Ingress 资源将无法正常工作。此时需要我们根据项目情况选择相关 Ingress Controller 的实现部署到集群中。

  Ingress Controller 有多种开源实现,包括 HAProxy、Treafik、Kubernetes 官方维护的 Nginx Controller、Nginx 官方维护的开源版和商业版的 Nginx Controller。一般情况下,我们选择使用 Kubernetes 官方维护的 Nginx Controller 即可。

  更多关于 Ingress 的信息,可以查看 Kubernetes in Action 系列文章的网络服务 Ingress 章节[链接]。

操作步骤

为节点打标签

  Ingress Controller 的 Pod 会被调度到在带有 cluster.k8s/ingress=enabled 标签的节点上,因此我们需要提前在指定的节点上打上该标签。

bash
# 为节点打上 cluster.k8s/ingress=enabled 标签,让 Kubernetes 将 Ingress Controller 调度到这个节点
$ kubectl label node node1.cluster.k8s cluster.k8s/ingress=enabled
node/node1.cluster.k8s labeled

# 如果要做高可用,最少要在 2 个节点打上 cluster.k8s/ingress=enabled 标签
$ kubectl label node node2.cluster.k8s cluster.k8s/ingress=enabled
node/node2.cluster.k8s labeled

提示

  cluster.k8s/ingress=enabled 标签是运维规约[链接]中的内容,更多信息可以查看该文档的内容。

  注意 Ingress Controller 前面应该还有一层负载均衡器 loadbalancer.cluster.k8s。一般情况下不要直接将 Ingress Controller 暴露给客户端。

部署 Ingress-Nginx

  我们通过 helm 部署 Ingress-Nginx 到 ingress-nginx 命名空间里。

bash
# 安装 Ingress Nginx Controller
$ helm install ingress-nginx mirror/ingress-nginx -n ingress-nginx --create-namespace
NAME: ingress-nginx
LAST DEPLOYED: Thu Jul 27 04:43:30 2023
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller'

An example Ingress that makes use of the controller:
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: example
    namespace: foo
  spec:
    ingressClassName: nginx
    rules:
      - host: www.example.com
        http:
          paths:
            - pathType: Prefix
              backend:
                service:
                  name: exampleService
                  port:
                    number: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
      - hosts:
        - www.example.com
        secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

查看部署状态

  完成以上步骤,Ingress Nginx Controller 就基本部署完了。我们可以通过以下命令去查看 Ingress Controller 的运行情况。

bash
# 获取 Ingress Controller 的 Pod 工作状态
# 由于我们给两个节点打上了 cluster.k8s/ingress=enabled 标签,因此这两个节点都会被调度
# 后续就可以通过这些节点的 IP 来访问 Ingress 了
$ kubectl get po -o wide -n ingress-nginx
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE                NOMINATED NODE   READINESS GATES
ingress-nginx-controller-5bvq5   1/1     Running   0          52s   10.10.20.22   node2.cluster.k8s   <none>           <none>
ingress-nginx-controller-jw59l   1/1     Running   0          52s   10.10.20.21   node1.cluster.k8s   <none>           <none>

Released under the MIT license.