一、说明

  • 本文使用的ingress-nginx v1.0 最新版本,v1.0 适用于 Kubernetes 版本 >= v1.19 小于这个版本的k8s集群,请降级ingress-nginx。

1、ingress-nginx github地址
2、官网

二、部署

部署ingress-nginx 比较简单,直接下载github上的 deploy.yaml 部署即可,如果需要优化请看步骤三。
由于网络问题镜像如果拉取失败,可以使用下面我提交到hub.docker 上的镜像:

所需镜像

# 对应官方k8s.gcr.io/ingress-nginx/controller:1.0


docker pull koala2020/ingress-nginx-controller:v1

#对应官方k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0

docker pull koala2020/ingress-nginx-kube-webhook-certgen:v1

1、下载 ingres-nginx 的 deploy.yaml 文件
由于github 上目录比较多,涵盖了几乎所有平台,所以需要根据自己情况选择,文章是centos 举例:
下载 github 上 /deploy/static/provider/baremetal/ 目录下的deploy.yaml

wget  https://github.com/kubernetes/ingress-nginx/blob/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml -O deploy.yaml 

2、部署
默认不做任何修改即可运行

kubectl apply -f  deploy.yaml

#删除请使用:

kubectl delete -f  deploy.yaml

3、查看运行状态
显示Completed 状态的是两个已经完成任务Job 不用管。

[root@k8s-master01 baremetal]# kubectl get pods -n ingress-nginx 

NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-gsllw       0/1     Completed   0          94m
ingress-nginx-admission-patch-7bvsd        0/1     Completed   0          94m
ingress-nginx-controller-f54b4c9bd-tk7fn   1/1     Running     0          94m


#查看 service

[root@k8s-master01 baremetal]# kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.0.0.112   <none>        80:30220/TCP,443:32164/TCP   102m
ingress-nginx-controller-admission   ClusterIP   10.0.0.129   <none>        443/TCP                      102m

到此 ingress-nginx 就可以正常运行,如果集群中有ingres 项目,那么使用 项目域名:30220 端口号就可以访问了,这个端口号是上面ingress-nginx-controller service nodePort随机的。

三、优化

在步骤二里运行ingress-nginx 是不是感觉有问题,例如:
1、每次部署ingres-nginx 都随机一个nodePort 是不是很不方便;
2、使用域名:端口 对外提供服务不人性化;
3、所有的访问都集中在一个 ingres-nginx 上 pod,没有起到负载均衡的作用(默认ingress-nginx v1.0 启用一个副本);
所有综上所诉我们还需要简单的调整参数
4、由于新版本特性,需要ingress-nginx 需要增加 ingressClass,如果老项目没有 ingressClass 怎么办?

  • 负载均衡问题
    把配置文件里的 Deployment 换成 DaemonSet 模式,这样保每一台node上都启用 ingress-nginx-controller pod副本。

部分参数如下:

# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
#kind: Deployment   //注释掉
kind: DaemonSet     //改为此模式
metadata:
  labels:
    helm.sh/chart: ingress-nginx-4.0.1
...
...

  • 端口问题
    默认ingress-nginx 随机提供node port 端口,体验不好,因此需开启hostNetwork 启用80、443端口,配置如下:
    依然是修改 Deployment 下面的 spec
    spec:
      hostNetwork: true   //增加
      dnsPolicy: ClusterFirst
      containers:
        - name: controller
          image: koala2020/ingress-nginx-controller:v1 // 镜像地址换成自己私有仓库地址
          imagePullPolicy: IfNotPresent
          lifecycle:

  • ingressClass 问题
    如果不关心 ingressClass,或者很多没有 ingressClass 配置的 ingress 对象,需要添加参数 ingress-controller --watch-ingress-without-class=true。
args:
  - /nginx-ingress-controller
  - --publish-service=$(POD_NAMESPACE)/ingress-nginx-dev-v1-test-controller
  - --election-id=ingress-controller-leader
  - --controller-class=k8s.io/ingress-nginx
  - --configmap=$(POD_NAMESPACE)/ingress-nginx-dev-v1-test-controller
  - --validating-webhook=:8443
  - --validating-webhook-certificate=/usr/local/certificates/cert
  - --validating-webhook-key=/usr/local/certificates/key
  - --watch-ingress-without-class=true  //新增
...
...

添加参数 - --watch-ingress-without-class=true 以后的ingres 会在 ADDRESS 绑定了后端的宿主机ip
而CLASS 为空是因为没有写jenkins的ingressClass,如果启用- --watch-ingress-without-class=true 就不用在关心ingressClass 问题;


[root@k8s-master01 k8s]# kubectl  get ing -A
NAMESPACE   NAME      CLASS    HOSTS                 ADDRESS                                           PORTS     AGE
default     jenkins   <none>   jenkins.example.com   192.168.100.170,192.168.100.171,192.168.100.172   80, 443   3d8h

四、使用
1、老版本
后端两个域名1.test.com 和2.test.com。kubernetes.io/ingress.class: "nginx"注释自动发现所ingress。ingress 资源应放置在与后端资源相同的命名空间内。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"  //必须配置
spec:
  rules:
  - host: 1.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myservicea
            port:
              number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"  //必须配置
spec:
  rules:
  - host: 2.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myserviceb
            port:
              number: 80

2、新版本
k8s 集群 >= 1.19,上面的 Ingress 资源将不起作用。您需要部署以下内容以使其与新的 api 版本匹配。这将需要对 Ingress 对象进行如下更改,以及类型为“kind: IngressClass”的新对象

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
spec:
  rules:
  - host: 1.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myservicea
            port: 
              number: 80
  ingressClassName: nginx #新增特性
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
spec:
  rules:
  - host: 2.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myserviceb
            port: 
              number: 80
  ingressClassName: nginx #新增特性
---
# 新版本新增 IngressClass
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx