1.部署文件介绍、准备
配置文件位置: https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy
如下图,即为所有部署配置文件,为了防止与我们集群的k8s版本冲突,我们选择稍老一点的版本tag:nginx-0.20.0。我们的部署过程只需要下方的mandatory.yaml文件,因为它是其他yaml文件的集合,集成了所有的配置过程。各配置文件作用在文末会有介绍,先介绍配置方法。
第一步,下载mandatory.yaml。建议使用命令行窗口复制粘贴保存到mandatory.yaml文件,另一种方式通过wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.20.0/deploy/mandatory.yaml直接下载暂时需要。
2.镜像替换
因网络原因,mandatory.yaml中使用到的镜像国内可能不可用,因此需要替换为国内镜像。通过grep image mandatory.yaml命令查看,需要替换以下两个镜像。
原镜像 |
版本 |
国内镜像 |
k8s.gcr.io/defaultbackend-amd64 |
1.5 |
registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64 |
quay.io/kubernetes-ingress-controller/nginx-ingress-controller |
0.20.0 |
registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller |
第二步,在每一个节点(Node)上下载这两个镜像。
docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5 #注意版本号
docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0 #注意版本号
docker images #检查镜像是否下载成功
第三步,替换掉原mandatory.yaml文件中的镜像内容。
sed -i 's#k8s.gcr.io/defaultbackend-amd64#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64#g' mandatory.yaml #替换defaultbackend-amd64镜像地址
sed -i 's#quay.io/kubernetes-ingress-controller/nginx-ingress-controller#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller#g' mandatory.yaml #替换nginx-ingress-controller镜像地址
grep image mandatory.yaml #检查替换结果
3.启用本机网络
我们使用ingress-nginx进行对外服务暴露的时候,是需要使用主机端口对外进行暴露的,目前通用的两种端口暴露方法,一种是通过一个额外的service,通过nodePort方式对ingress-nginx进行映射,但是这种方式的端口号限制在30000-32767,而我们通常希望它能够使用http和https默认的80和443端口进行暴露,这种不符合我们的要求。
另一种是通过在部署nginx-ingress-controller(位于mandatory.yaml中)时,直接启用hostNetwork,这样就可以使用主机的80端口和443端口。
第四步,在mandatory.yaml中进行如下修改,最多需要添加两处配置即可:
修改位置位于mandatory.yaml文件最下方。
如图中所示,第一处修改我们需要添加hostNetwork:true配置,使nginx-ingress-controller启用本机网络。第二处配置需要根据集群目前端口使用情况来改,若本机默认的http(80)、https(443)、status-port(18080)端口未被占用,则无需添加第二处配置。
4.部署nginx-ingress-controller
第五步,执行命令:
kubectl apply -f mandatory.yaml
kubectl get pods -n ingress-nginx #检查pod状态
至此,nginx-ingress-controller便部署完成,平台搭好了,接下来我们开始部署真正的ingress后端服务。
5.准备后端服务
目前200节点有一个web-front服务,此外,我们再另外创建一个tomcat服务作为对比,用来测试多路径下的nginx-ingress-controller转发效果。此外我们还将使用200节点的两个域名simu.menkor.cn和api.menkor.cn进行多host情况下的测试。
第六步,部署一个tomcat的service(tomcat-deploy.yaml位于附件)
kubectl apply -f tomcat-deploy.yaml
这样,我们的节点下就同时存在tomcat和web-front两个service,我们将配置不同路径,利用nginx-ingress-controller对其进行转发。
6.准备安全服务secret
为对外提供安全服务,我们需要对5中提及的simu.menkor.cn和api.menkor.cn两项域名进行加密服务,将来在部署ingress后端服务的时候会用到。我们以200节点为例,其他节点根据自己的域名和证书情况生成secret。
第七步,生成域名secret。
cd /etc/nginx/simu/_cert/simu.menkor.cn
kubectl create secret tls simu-menkor-cn-secret --cert=cert.pem --key=cert.key
cd /etc/nginx/simu/_cert/api.menkor.cn
kubectl create secret tls api-menkor-cn-secret --cert=cert.pem --key=cert.key
这样,我们就生成了两项secret,simu-menkor-cn-secret和api-menkor-cn-secret,在下一步中我们会使用它们来对两项域名提供安全访问控制。
7.部署ingress
前面我们已经为ingress搭建好了框架,最后一步就是在框架内加入按我们需要的路径规则,进行配置的ingress 后端服务。
第八步,执行命令(ingress-deploy.yaml位于附件):
kubectl apply -f ingress-deploy.yaml
下面我们对ingress-deploy.yaml文件的内容进行详解:
1处:在某些情况下,后端服务中公开的URL与Ingress规则中指定的路径不同。如果没有重写,则任何请求都将返回404。为避免这种情况,您可以将注释设置ingress.kubernetes.io/rewrite-target为服务所需的路径。例如,当应用程序期望打开时,可以与基于路径的路由一起使用/。
2处:这里就用到<6.准备安全服务secret>中用到的secret,通过添加2处配置,可对外提供https服务。分别是域名加上<6.准备安全服务secret>中生成的secret名称。
3处:host指定域名,如果指定,那么只能通过域名访问,如果不指定,则通过域名或者其他方式(只要可以转发到集群的node节点的80端口),都可以访问。
4处:为核心的路径转发配置,分别为一个path对应一个service,service需要指定它的serviceName和它的port,port就是service的集群内部port,可通过kubectl get svc,PORT(S)一栏冒号前的即为service的port。多host或多path通过如图所示添加-host或-path即可。
最终效果图如下:
附<1.部署文件介绍、准备>部署文件介绍:
1.namespace.yaml
创建一个独立的命名空间 ingress-nginx
2.configmap.yaml
ConfigMap是存储通用的配置变量的,类似于配置文件,使用户可以将分布式系统中用于不同模块的环境变量统一到一个对象中管理;而它与配置文件的区别在于它是存在集群的“环境”中的,并且支持K8S集群中所有通用的操作调用方式。
从数据角度来看,ConfigMap的类型只是键值组,用于存储被Pod或者其他资源对象(如RC)访问的信息。这与secret的设计理念有异曲同工之妙,主要区别在于ConfigMap通常不用于存储敏感信息,而只存储简单的文本信息。
ConfigMap可以保存环境变量的属性,也可以保存配置文件。
创建pod时,对configmap进行绑定,pod内的应用可以直接引用ConfigMap的配置。相当于configmap为应用/运行环境封装配置。
pod使用ConfigMap,通常用于:设置环境变量的值、设置命令行参数、创建配置文件。
3.default-backend.yaml
如果外界访问的域名不存在的话,则默认转发到default-http-backend这个Service,其会直接返回404:
4.rbac.yaml
负责Ingress的RBAC授权的控制,其创建了Ingress用到的ServiceAccount、ClusterRole、Role、RoleBinding、ClusterRoleBinding
5.with-rbac.yaml
是Ingress的核心,用于创建ingress-controller。前面提到过,ingress-controller的作用是将新加入的Ingress进行转化为Nginx的配置
refs:
参考博客:https://www.cnblogs.com/panwenbin-logs/p/9915927.html
https://blog.csdn.net/weixin_39600057/article/details/84965159
https://blog.csdn.net/u013061106/article/details/79748511
GitHub地址:https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy