一个计算机技术爱好者与学习者

0%

好好学K8S:K8S中安装使用Ingress

1. Ingress简介

ingress是k8s中的一个七层的负载均衡,可以把流量路由到service。
如果没有ingress,我们可以通过外部的nginx、haproxy等也可以实现七层负载均衡,但是配置nginx比较麻烦,因为想要配置nginx的upstream必须先查询service的ip,那如果使用service的name,还要维护一个dns;如果想要换成haproxy,成本也比较高。而有了ingress,实际上就是把nginx等七层负载均衡集成到了k8s中,配置就更加简单也更加通用。

它的工作原理是ingress服务作为流量的入口,收到请求后,根据host、path等规则,匹配到对应的service和端口,然后把流量转发到service的端口,service再转发流量给pod。

参考文档:

2. 安装Ingress Controller

本节中,我们使用helm在K8S集群中安装Ingress NGINX Controller。

参考文档:

官方推荐一键安装:

1
2
3
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace

因为郝同学喜欢安装指定版本,并且对配置做一些了解,因此本节使用稍微麻烦一点的方式。

1、添加chart仓库

1
2
3
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm repo list

2、下载chart(chart4.1.4 对应 app1.2.1)

1
2
3
4
helm search repo ingress-nginx/ingress-nginx -l
helm fetch ingress-nginx/ingress-nginx --version 4.1.4
tar -xzvf ingress-nginx-4.1.4.tgz
vim ingress-nginx/values.yaml

3、修改 values.yaml 配置

  • controller.image.registry:改为k8s.dockerproxy.com
  • controller.image.tag:保持不变v1.2.1
  • controller.image.digest:注释掉
  • controller.image.digestChroot:注释掉
  • controller.admissionWebhooks.enabled:保持 true,避免创建的错误 Ingress 等资源对象影响控制器重新加载
  • defaultBackend.enabled:按需修改

4、安装ingress nginx controller

1
2
helm install ingress-nginx ingress-nginx -n ingress-nginx --create-namespace --dry-run --debug
helm install ingress-nginx ingress-nginx -n ingress-nginx --create-namespace

5、查看安装

1
2
kubectl get all -n ingress-nginx
kubectl get ingressclass

注意:新版本的ingress,会创建ingressclass,但是一些旧版本的ingress,并没有ingressclass这种资源。
在 Kubernetes 1.18 之前,通常是在 Ingress 资源上通过 kubernetes.io/ingress.class 注解来指定使用的 Ingress Controller。虽然这个注解从未被正式定义过,但却是被各个 Ingress Controller 所广泛支持的,注解的值可以在Ingress Controller启动时指定。
Kubernetes 1.18 起提供了 IngressClass 资源,IngressClass指定关联spec.controller,Ingress指定关联spec.ingressClassName,就实现了Ingress指定Ingress Controller。
详情参考文档K8s Ingress、Ingress Controller 和 Ingress Class

3. KS中的Ingress Controller

如果k8s集群中安装了kubesphere,那么可以直接启用kubesphere的网关,本质也是ingress nginx controller。
开启办法:admin用户登录控制台,集群设置,网关设置,启用网关。

参考文档:

4. 配置Ingress

参考文档:

4.1. Ingress Controller配置

可以认为Ingress Controller就是一个K8S内部的Nginx。
查看 Ingress Controller 的 service 配置,找到80和433端口对应的NodePort,用于访问Nginx。
假设一个节点IP为192.168.56.102,service的80端口对应30490,443端口对应30499。

4.2. 创建测试服务

1、创建测试服务(Nginx)

1
2
3
4
kubectl create deployment test --image=nginx --dry-run=client -oyaml > deployment.yaml
kubectl create service clusterip test --tcp=80:80 --tcp=443:443 --dry-run=client -oyaml > service.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

2、查看测试服务

1
2
kubectl get pods
kubectl get svc

4.3. 创建Ingress

1、准备 minimal-ingress.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80

其中,ingressClassName可以省略,省略后会使用默认的ingressClass。
因为配置了rewrite-target,所以请求到达service时,/testpath会被替换为/

2、创建ingress

1
2
kubectl apply -f minimal-ingress.yaml
kubectl get ingress

3、通过ingress controller访问测试服务

1
curl 192.168.56.102:30490/testpath

访问链路为:ip+port(ingress) -> nginx service

5. 多个Ingress Controller

怎样在k8s集群中配置多个Ingress Controller?
答:多个Ingress Controller的启动命令中,--controller-class--ingress-class参数设置成不同的值。

如果k8s集群中存在多个Ingress Controller,哪个会生效呢?
答:在Ingress的spec中指定ingressClassName,或者在Ingress的annotations中指定kubernetes.io/ingress.class(即将废弃)。
如果不指定,那么将会使用默认的ingressClass,默认的ingressClass中会包含一个annotations:

1
2
annotations:
ingressclass.kubernetes.io/is-default-class: "true"

Ingress NGINX Controller的--controller-class默认值为k8s.io/ingress-nginx--ingress-class的默认值为nginx

参考文档:

6. Ingress常用配置

参考文档《Ingress常用配置》

7. 查看最终的nginx配置

我们编写的ingress,实际上最终会生成nginx.conf,可以在ingress-nginx-controller中查看是否符合预期。

1
2
3
kubectl exec -it ingress-nginx-controller-xxx -- /bin/bash
cd /etc/nginx
cat nginx.conf

8. Ingress推荐链路

8.1. LB -> Ingress

1
Domain -> LB -> Ingress -> Service -> Pod

这种链路,适用于云厂商提供的k8s集群。

创建方法:
1)在创建ingress-controller的Service时,直接创建LoadBanlancer类型的Service。
2)或者单独创建LB,后端配置Ingress的Node Port。

这种链路最大的优点是链路短,速度快。
通过云厂商提供的LB,可以配置四层或者七层负载均衡到Ingress,还可以在LB层加一些安全防护产品。
如果使用的是七层负载均衡,还可以统一配置泛域名证书。

8.2. Nginx -> Ingress

1
Domain -> Nginx -> Ingress -> Service -> Pod

这种链路,适用于所有k8s集群。
通过Nginx,可以配置四层或者七层负载均衡到Ingress。
如果使用的是七层负载均衡,还可以统一配置泛域名证书。

8.3. 开发/测试/生产环境链路

  1. 外网访问K8S生产集群中的服务:域名 -> 云厂商Prod CLB(80/443) -> Ingress(Node Port) -> Service
  2. 外网访问K8S测试集群中的服务:域名 -> 云厂商Test CLB(80/443) -> Ingress(Node Port) -> Service
  3. 外网访问K8S开发集群中的服务:域名 -> 云厂商Nginx(裸机版,80/443) -> Ingress(Node Port) -> Service
  4. 内网访问K8S开发集群中的服务:域名 -> 自建机房Nginx1(80/443) -> Ingress(Node Port)-> Service
  5. 外网访问云厂商非K8S集群中的服务:域名 -> 云厂商混用 CLB(80/443) -> 云厂商Nginx(Docker版,1080/1443) -> Service
  6. 外网访问自建机房非K8S集群中的服务:域名 -> 云厂商混用 CLB(80/443) -> 云厂商Nginx(Docker版,1080/1443) ->Service
  7. 内网访问自建机房非K8S集群中的服务:域名 -> 自建机房Nginx2(80/443) -> Service
  8. 外网访问云厂商需要四层转发的服务:云厂商混用CLB(自行选择端口) -> 四层Service
  9. 外网访问自建机房需要四层转发的服务:云厂商混用CLB(自行选择端口) -> 云厂商Nginx(裸机版,自行选择端口) -> 四层Service
  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-k8s-ingress/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~