一、为什么要安装Ingress
官方文档:https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
1、这个问题,我们就需要深刻理解最高级的k8s的网络部署架构(非必须):
转化为实际工作中,我们使用的部署架构,大概如下:
这里面涉及到3层负载均衡,可以抵抗超大的网络压力:
-
第一层:第4层网络负载均衡器(可能是F5硬件)——直接IP负载;
-
第二层:Ingress-nginx负载均衡(第7层网络负载均衡)——能够解析协议,根据请求头/路由等制定负载策略;
-
第三层:Service负载均衡(K8s的Service)——对指定标签的Pods进行负载;使用ClusterIp模式,不要用NodePort模式,减少主机端口的消耗,更安全!
总结:如果我们使用了上面的架构,最终暴露在公网的,只有第一层负载均衡器!
2、我们需要安装Ingress Controller的时候,有两个选择,分别为:
-
nginx ingress:Nginx官方出品,有专业版(收费)和开源版选择
-
ingress nginx:K8s官方出品,开源,好用,更新及时,性能高!——我们正常都是选择这个
二、Ingress-Controller的安装
官方有这么一段话:
你必须具有 Ingress 控制器 才能满足 Ingress 的要求。 仅创建 Ingress 资源本身没有任何效果。
你可能需要部署 Ingress 控制器,例如 ingress-nginx
我们在裸金属上安装Ingress Controller:https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal
1、Yaml文件的优化配置:
借助K8s进行安装,安装的yaml文件特别长,如下:
我们要将此文件拉到本地,做一些优化配置:
修改ingress-nginx-controller镜像为 registry.cn-hangzhou.aliyuncs.com/jgqk8s/ingress-nginx-controller:v0.46.0;
修改Deployment为DaemonSet比较好,因为DaemonSet可以自动为每一台需要安装的机器都安装一份(使用标签控制);
修改Container使用主机网络,直接在主机上开辟 80,443端口,无需中间解析,速度更快;
Container使用主机网络,对应的dnsPolicy策略也需要改为主机网络的;
修改Service为ClusterIP,无需NodePort模式了;
修改DaemonSet的nodeSelector: ingress-node=true 。这样只需要给node节点打上 node-role=ingress 标签,即可快速的加入/剔除 ingress-controller的数量;——妙
修改后的yaml文件有600多行,就不贴在这里了:
https://jiguiquan.oss-cn-shanghai.aliyuncs.com/ingress-controller.yaml
所有我们在master节点准备好这个部署yaml文件
2、检查每台机器的80、443端口是否被占用:
[root@k8s-02 ~]# netstat -nlpt|grep 80 [root@k8s-02 ~]# netstat -nlpt|grep 443
3、使用kubectl apply部署对应的yaml文件:
[root@k8s1 ~]# kubectl apply -f ingress-controller.yaml namespace/ingress-nginx created serviceaccount/ingress-nginx created configmap/ingress-nginx-controller created clusterrole.rbac.authorization.k8s.io/ingress-nginx created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created role.rbac.authorization.k8s.io/ingress-nginx created rolebinding.rbac.authorization.k8s.io/ingress-nginx created service/ingress-nginx-controller-admission created service/ingress-nginx-controller created daemonset.apps/ingress-nginx-controller created validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created serviceaccount/ingress-nginx-admission created clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created role.rbac.authorization.k8s.io/ingress-nginx-admission created rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created job.batch/ingress-nginx-admission-create created job.batch/ingress-nginx-admission-patch created
4、给需要的node节点上部署ingress-controller:
因为我们使用的是DaemonSet模式,所以理论上会为所有的节点都安装,但是由于我们的selector使用了筛选标签:node-role=ingress ,所以此时所有的node节点都没有被执行安装;
[root@k8s1 ~]# kubectl get ds -n ingress-nginx NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE ingress-nginx-controller 0 0 0 0 0 node-role=ingress 5m9s
当我们需要为所有的node节点安装ingress-controller的时候,只需要为对应的节点打上标签:node-role=ingress
[root@k8s1 ~]# kubectl label node k8s-02 node-role=ingress node/k8s-02 labeled [root@k8s1 ~]# kubectl label node k8s-03 node-role=ingress node/k8s-03 labeled [root@k8s1 ~]# kubectl get ds -n ingress-nginx NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE ingress-nginx-controller 2 2 2 2 2 node-role=ingress 14m ## 查看ingress-nginx名称空间下的pods,发现k8s-02和k8s-03节点下,都被安装了ingress-nginx-controller服务 [root@k8s1 ~]# kubectl get pods -n ingress-nginx -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ingress-nginx-admission-create-9zrwc 0/1 Completed 0 15m 10.244.179.11 k8s-02 <none> <none> ingress-nginx-admission-patch-zmcml 0/1 Completed 3 15m 10.244.179.10 k8s-02 <none> <none> ingress-nginx-controller-jxvqz 1/1 Running 0 3m24s 192.168.56.22 k8s-03 <none> <none> ingress-nginx-controller-p6bn2 1/1 Running 0 3m48s 192.168.56.21 k8s-02 <none> <none> ## k8s-02和k8s-03节点的80/443端口,也被监听了 [root@k8s-02 ~]# netstat -nlpt|grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26585/nginx: master [root@k8s-02 ~]# netstat -nlpt|grep 443 tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 26585/nginx: master tcp6 0 0 :::8443 :::* LISTEN 26500/nginx-ingress
至此,我们所有的工作节点上的 ingress-nginx-controller 服务就被安装好了!
三、