文章

ingress-nginx的安装使用

开源的 Ingress Controller 的实现使用量最大的莫过于 Ingress Nginx 了,可作为反向代理将外部流量导入集群内部,将 Kubernetes 内部的 Service 暴露给外部,在 Ingress 对象中通过域名匹配 Service,这样就可以直接通过域名访问到集群内部的服务了。

实际 Ingress Nginx 有两种实现:

  1. https://github.com/kubernetes/ingress-nginx

  2. https://github.com/nginxinc/kubernetes-ingress

第一种是 Kubernetes 开源社区的实现,第二种是 Nginx 官方的实现,我们通常用的是 Kubernetes 社区的实现,这也是本文所关注的重点。

安装

我们这里通过Helm来简化 nginx-ingress 的安装,所以确保 Helm 能够正常使用。由于部署ingress-nginx 所在的节点需要能够访问外网,这样域名可以解析到这些节点上直接使用,需要让 nginx-ingress 绑定节点的 80 和 443 端口。

如果你的K8S集群是自己部署的,可以选择能够外网访问的边缘节点,ingress-nginx通过 DasemonSet 和 hostPort 来进行部署,并通过 nodeSelector 来筛选有外网 IP 的边缘节点

如果你的K8S集群是在云厂商购买的,可以直接部署,ingress-controller可以通过LoadBalancer提供外网访问服务。

这里我采用的云厂商的K8S集群,部署ingress-nginx的详细文档可以参考:https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx

1)添加Helm Repo:

 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
 helm repo update

2)安装ingress-nginx chart:

 kubectl create namespace ingress
 helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress --version 3.9.0

3)你也可以新建custom.yaml文件来覆盖 nginx-ingress Chart 包的一些默认参数:

 controller:
   image:
     repository: docker.io/amuguelove/ingress-nginx
     tag: "v0.41.0"
     digest:
     pullPolicy: IfNotPresent
 ​
   extraArgs:
     enable-ssl-passthrough: "true"
   
   config:
     server-tokens: "false"    

这时你可以使用如何命令:

 helm update --install -f custom.yaml ingress-nginx ingress-nginx/ingress-nginx -n ingress --version 3.9.0

4)安装完成后可以通过下面的命令查看 ingress-ingress 的 Pod 使用运行成功:

 $ helm list -n ingress
 NAME          NAMESPACE REVISION  UPDATED                               STATUS    CHART               APP VERSION
 ingress-nginx ingress   7         2020-12-31 18:13:13.216027 +0800 CST  deployed  ingress-nginx-3.9.0 0.41.0
 ​
 $ kubectl get pods -n ingress
 NAME                                        READY   STATUS    RESTARTS   AGE
 ingress-nginx-controller-565bcc4954-nls96   1/1     Running   0          141m

安装过程中需要用到k8s.gcr.io/ingress-nginx/controller的镜像,大家可以先本地翻墙pull 下来后重新打上 tag,推送到Dockerhub。也可以使用我打包的,镜像地址如下:docker.io/amuguelove/ingress-nginx

使用

上面的 ingress-ingress 安装成功后,添加 kubernetes.io/ingress.class: nginx 注解到 Ingress资源。

 apiVersion: extensions/v1beta1
 kind: Ingress
 metadata:
   name: my-nginx
   annotations:
     kubernetes.io/ingress.class: nginx # 重点
 spec:
   rules:
     - host: nginx.qcloud.com
       http:
         paths:
           - backend:
               serviceName: my-nginx
               servicePort: 80
             path: /

注意我们在 Ingress 资源对象中添加了一个 annotations:kubernetes.io/ingress.class: "nginx",这就是指定让这个 Ingress 通过 ingress-nginx 来处理。

若域名是自己随便定义的,可以在本地/etc/hosts中添加对应的隐射也可以,然后就可以通过域名进行访问了。

除此之外,我们还可以利用cert-manager来进行 HTTPS 自动化,可以参考之前写的文章。


参考资料

  1. Ingress Nginx Chart: https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx

  2. Ingress Nginx Github: https://github.com/kubernetes/ingress-nginx

License:  CC BY 4.0