为K8s集群安装Ingress-nginx

一、为什么要安装Ingress

官方文档:https://kubernetes.io/zh/docs/concepts/services-networking/ingress/

1、这个问题,我们就需要深刻理解最高级的k8s的网络部署架构(非必须):

image.png

转化为实际工作中,我们使用的部署架构,大概如下:

image.png

这里面涉及到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文件特别长,如下:

https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.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 服务就被安装好了!


三、

jiguiquan@163.com

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐