kubernetes ingress 在物理机上的nodePort和hostNetwork两种部署方式解析及比较

  1. https://www.cnblogs.com/xuxinkun/p/11052646.html
  2.  
  3. 今天用ingress 刚好遇到了..非常感谢同事的帮助
  4.  
  5. 也找到了一篇blog 系统介绍的.

ingress controller在物理机上的两种部署方式

ingress controller(ingress-nginx)负责k8s中的7层负载均衡。其在物理机中有多种部署方式。本文中主要选择了nodePort和hostNetwork两种部署方式进行介绍。主要原因是这两种部署方式不需要借助于其他组件,直接使用的是k8s的基础组件和使用方式,较为容易理解和排障。

注:本文中的kube-proxy使用的是iptables

本文使用的ingress-nginx的commit版本是51ad0bc54b1475384b67bee9e8a8e41e26b18bc4。该版本的部署方式是在NGINX: 0.24.1版本后重构了deploy文件夹中的ingress-nginx的部署相关文件。采用了kustomize进行部署配置。因此推荐使用kubectl 1.14以上的版本。且特别注意,下面的命令都是使用了kubectl apply -k的方式运行,而不是-f参数。

deploy各个文件夹走读

ingress-nginx项目deploy文件夹下有多个文件夹,为不同的环境提供支持。这里我们主要介绍的是与在物理机部署相关的几个文件夹。

cluster-wide
  1. ├── cluster-wide
  2.    ├── cluster-role-binding.yaml
  3.    ├── cluster-role.yaml
  4.    └── kustomization.yaml

cluster-wide文件夹主要用于创建cluster-role和cluster-role-binding,为ingress-controller提供apiserver的cluster访问权限。这里cluster-role-binding.yaml要作一下修改,指定namespace: ingress-nginx。因为在后面创建的ServiceAccount等其他资源都是默认在该namespace下。

  1. [root@local cluster-wide]# cat cluster-role-binding.yaml
  2. apiVersion: rbac.authorization.k8s.io/v1beta1
  3. kind: ClusterRoleBinding
  4. metadata:
  5. name: nginx-ingress-clusterrole-nisa-binding
  6. roleRef:
  7. apiGroup: rbac.authorization.k8s.io
  8. kind: ClusterRole
  9. name: nginx-ingress-clusterrole
  10. subjects:
  11. - kind: ServiceAccount
  12. name: nginx-ingress-serviceaccount
  13. namespace: ingress-nginx
cloud-generic
  1. ├── cloud-generic
  2.    ├── deployment.yaml
  3.    ├── kustomization.yaml
  4.    ├── role-binding.yaml
  5.    ├── role.yaml
  6.    ├── service-account.yaml
  7.    └── service.yaml

cloud-generic文件夹提供了通用的一些部署文件。其中deployment.yaml是负责创建ingress-controller的deployment,默认副本数为1,可以进行调节。service.yaml是为ingress-controller创建的service。其他的主要是与账户相关的内容。

baremetal
  1. ├── baremetal
  2.    ├── kustomization.yaml
  3.    └── service-nodeport.yaml

baremetal文件夹主要是创建了一个NodePort类型的svc,然后向ingress-controller的容器进行导流的。因为该部署方式需要依赖cloud-generic里的资源,因此在kustomization.yaml中描述了对cloud-generic的依赖。可以参看kustomization.yaml中的bases。

  1. [root@local baremetal]# cat deploy/baremetal/kustomization.yaml
  2. apiVersion: kustomize.config.k8s.io/v1beta1
  3. kind: Kustomization
  4. bases:
  5. - ../cloud-generic
  6. patchesStrategicMerge:
  7. - service-nodeport.yaml

大致了解了相关部署文件的功能,那么结合具体的两种部署图(部署图来自官网),来进行一下具体介绍。

nodePort部署

nodePort的部署思路就是通过在每个节点上开辟nodePort的端口,将流量引入进来,而后通过iptables首先转发到ingress-controller容器中(图中的nginx容器),而后由nginx根据ingress的规则进行判断,将其转发到对应的应用web容器中。因此采用nodePort部署较为简单,直接使用以下命令即可。

  1. kubectl apply -k deploy/baremetal/
  2. kubectl apply -k deploy/cluster-wide/

hostNetwork部署

相比较起来,hostNetwork模式不再需要创建一个nodePort的svc,而是直接在每个节点都创建一个ingress-controller的容器,而且将该容器的网络模式设为hostNetwork。也就是说每个节点物理机的80和443端口将会被ingress-controller中的nginx容器占用。当流量通过80/443端口进入时,将直接进入到nginx中。而后nginx根据ingress规则再将流量转发到对应的web应用容器中。

这里需要对cloud-generic/deployment.yaml进行一下改动,将其资源类型从deployment改为daemonset,并且在spec中添加hostNetwork: true,从而使其可以使用物理机网络。

  1. [root@local deploy]# cat cloud-generic/deployment.yaml
  2. apiVersion: extensions/v1beta1
  3. kind: DaemonSet
  4. metadata:
  5. name: nginx-ingress-controller
  6. spec:
  7. template:
  8. metadata:
  9. annotations:
  10. prometheus.io/port: "10254"
  11. prometheus.io/scrape: "true"
  12. labels:
  13. nginx-ingress-controller: 0.24.1
  14. spec:
  15. serviceAccountName: nginx-ingress-serviceaccount
  16. hostNetwork: true
  17. ...

修改完成后,使用以下命令即可完成hostNetwork模式的部署。

  1. kubectl apply -k deploy/cloud-generic/
  2. kubectl apply -k deploy/cluster-wide/

两种部署方式的比较

相比较起来,nodePort部署模式中需要部署的ingress-controller容器较少。一个集群可以部署几个就可以了。而hostNetwork模式需要在每个节点部署一个ingress-controller容器,因此总起来消耗资源较多。另外一个比较直观的区别,nodePort模式主要占用的是svc的nodePort端口。而hostNetwork则需要占用物理机的80和443端口。

从网络流转来说,通过nodePort访问时,该node节点不一定部署了ingress-controller容器。因此还需要iptables将其转发到部署有ingress-controller的节点上去,多了一层流转。

另外,通过nodePort访问时,nginx接收到的http请求中的source ip将会被转换为接受该请求的node节点的ip,而非真正的client端ip。

而使用hostNetwork的方式,ingress-controller将会使用的是物理机的DNS域名解析(即物理机的/etc/resolv.conf)。而无法使用内部的比如coredns的域名解析。

因此具体使用哪种部署方式,需要根据实际情况和需求进行选择。

ingress controller试用

在部署好ingress controller后,可以通过一个样例进行测试使用。首选创建一个应用容器和以及一个对应的svc。

  1. kubectl run web --image=gcr.azk8s.cn/google-samples/hello-app:1.0 --port=8080
  2. kubectl expose deployment web --target-port=8080

然后创建ingress,将通过hello-world.info域名访问ingress的请求转发到该容器中去。

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: example-ingress
  5. annotations:
  6. nginx.ingress.kubernetes.io/rewrite-target: /
  7. spec:
  8. rules:
  9. - host: hello-world.info
  10. http:
  11. paths:
  12. - path: /*
  13. backend:
  14. serviceName: web
  15. servicePort: 8080

这一切完成后,在/etc/hosts里绑定域名,127.0.0.1 hello-world.info

  1. sed -i '$a 127.0.0.1 hello-world.info' /etc/hosts

然后通过curl命令进行测试。

  1. root@i-5i2mhmaus9v67pz19zmahp07u:~# curl 127.0.0.1
  2. <html>
  3. <head><title>404 Not Found</title></head>
  4. <body>
  5. <center><h1>404 Not Found</h1></center>
  6. <hr><center>nginx/1.15.10</center>
  7. </body>
  8. </html>
  9. root@i-5i2mhmaus9v67pz19zmahp07u:~# curl hello-world.info
  10. Hello, world!
  11. Version: 1.0.0
  12. Hostname: web-77f97c6cc7-g7qft

这里可以看到,我们访问本地127.0.0.1的时候,会返回404错误。而访问绑定的域名,就可以正确导流了,返回正确结果。

参考资料

作者:xuxinkun 
出处:xinkun的博客 
链接:https://www.cnblogs.com/xuxinkun/ 
本文版权归作者所有,欢迎转载。
未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 
欢迎扫描右侧二维码关注微信公众号xinkun的博客进行订阅。也可以通过微信公众号留言同作者进行交流。

[转帖]kubernetes ingress 在物理机上的nodePort和hostNetwork两种部署方式解析及比较的更多相关文章

  1. kubernetes ingress 在物理机上的nodePort和hostNetwork两种部署方式解析及比较

    ingress controller在物理机上的两种部署方式 ingress controller(ingress-nginx)负责k8s中的7层负载均衡.其在物理机中有多种部署方式.本文中主要选择了 ...

  2. aliyun添加数据盘后的物理分区和lvm逻辑卷两种挂载方式

    一.普通磁盘分区管理方式 1.对磁盘进行分区 列出磁盘 # fdisk -l # fdisk /dev/vdb Welcome to fdisk (util-linux 2.23.2). Change ...

  3. 在 Kubernetes Ingress 中支持 Websocket/Socket 服务

    Kubernetes Ingress 可将集群内部的 Service 通过 HTTP/HTTPS 的方式暴露供外部访问,并通过路径匹配规则定义服务的路由.但是 Ingress 对 TCP/UDP 的服 ...

  4. Kubernetes集群的部署方式及详细步骤

    一.部署环境架构以及方式 第一种部署方式 1.针对于master节点 将API Server.etcd.controller-manager.scheduler各组件进行yum install.编译安 ...

  5. Kubernetes 深入学习(一) —— 入门和集群安装部署

    一.简介 1.Kubernetes 是什么 Kubernetes 是一个全新的基于容器技术的分布式架构解决方案,是 Google 开源的一个容器集群管理系统,Kubernetes 简称 K8S. Ku ...

  6. Kubernetes Ingress Controller的使用及高可用落地

    Kubernetes Ingress Controller的使用及高可用落地 看懂本文要具备一下知识点: Service实现原理和会应用 知道反向代理原理,了解nginx和apache的vhost概念 ...

  7. [转帖]Kubernetes及容器编排的总体介绍【译】

    Kubernetes及容器编排的总体介绍[译] 翻译自The New Stack<Kubernetes 生态环境>作者:JANAKIRAM MSV和 KRISHNAN SUBRAMANIA ...

  8. Kubernetes Ingress实战

    本节内容: 服务发现与负载均衡 Ingress实战 一.服务发现与负载均衡 在前面的安装部署kubernetes集群中已经简单用示例来演示了Pod和Service,Kubernetes通过Servic ...

  9. Kubernetes 学习11 kubernetes ingress及ingress controller

    一.上集回顾 1.Service 3种模型:userspace,iptables,ipvs 2.Service类型 ClusterIP,NodePort NodePort:client -> N ...

随机推荐

  1. tecplot当中共用一个legend进行对比

    原版视频下载地址链接: https://pan.baidu.com/s/1nvHa0kx  密码: q33e ​

  2. SQL中的xp_cmdshell拒绝访问

    数据库备份作业的sql,,最后一步删除指定时间之前的文件夹.. 使用 xp_cmdshell 函数调用  RMDIR 命令删除过期文件夹,但返回拒绝访问.. 代码如下: DECLARE @PATH2 ...

  3. pymongo helper

    import pymongo import click # 数据库基本信息 db_configs = { 'type': 'mongo', 'host': '127.0.0.1', 'port': ' ...

  4. PHP如何解决网站大流量与高并发的问题(三)

    七层负载均衡的实现 基于URL等应用层信息的负载均衡 Nginx的proxy是一个很强大的功能,实现了7层负载均衡 功能强大.性能卓越,运行稳定 配置简单灵活 能自动提出工作不正常的后端服务器 上传文 ...

  5. 4 个用于执行高级数学计算的 JavaScript 库

    在使用JavaScript执行数学方面的任务时,往往要用到浮点运算,且需要精确到某位小数,这就容易造成错误,而且会相当费时.因此,如果你需要做一些高精度的数学计算的编程工作,比如财务或科学计算,那么你 ...

  6. 【转】adb server is out of date. killing完美解决

    今天,久未出现的著名的“adb server is out of date.  killing”又发生了,在此,将解决方法记下,以便日后查看. 1. 错误信息: C:\Users\lizy>ad ...

  7. c#传不确定的参数个数,比如int型

    a(params int[] ) 调用时a(1,2,3,4,5,6)

  8. springboot前端传参date类型后台处理方式

    转载:https://blog.csdn.net/xiangluer/article/details/81913137?utm_source=copy 参考如下博客: https://www.jian ...

  9. 手把手教你如何使用量产工具修复u盘

    u盘是我们平时都使用到的一个小工具,我们会使用它来进行储存一些重要的文件,但要是我们操作不当的话,那么就会导致u盘出现一些问题的哟,比如说插入u盘无法打开文件等等,那么遇到这个问题时该这么办呢?那么, ...

  10. RecyclerView 实现快速滚动 (转)

    RecyclerView 实现快速滚动 极小光  简书作者   简评:Android Support Library 26 中终于实现了一个等待已久的功能:RecyclerView 的快速滚动. An ...