k8s独立组件ingress,七层转发

一、K8S的Service

1、Service的作用

Service的作用体现在两个方面:

1、集群内部:不断跟踪pod的变化,更新endpoints中的pod对象,基于pod的IP地址不断变化的一种服务发现机制,也可以实现负载均衡,四层代理,service暴露的端口只能用于内网访问,局域网。

2、集群外部:类似负载均衡器,可以把流量IP+端口,不涉及转发url(http、https),把请求转发到pod中

2、Service类型:

clusterip:默认模式,对外

NodePort:容器端口---Service端口---NodePort映射。设定了NodePort之后每个节点都会有一个端口被打开30000-32767 对内访问,内网

LoadBalancer:云平台上的Service服务。由云平台提供负载均衡的IP地址

ExternalName:域名映射

ingress:基于域名进行映射,转发的是url请求(http协议或者https协议)转发到Service,再由Service转发到每一个pod

ingress只需要一个或者是少量的公网IP或者LB,可以把多个http请求暴露到外网

他是七层反向代理

可以将ingress理解为,Service的Service。是一组基于域名和url路径把请求转发到一个或者多个请求转发到Service的规则

ingress先七层转发转发都Service,Service再四层转发转发到pod

二、ingress:是K8s独立的组件

1、ingress的组成:

ingress是一个api对象,通过yaml文件来进行配置。ingress作用就是定义请求如何转发到Service的规则

ingress通过http和https暴露集群内部的Service,给Service提供一个外部的url、负载均衡、ssl/tls(https)的能力,实现一个基于域名的负载均衡

ingress-controller:ingress由这个组件来具体的实现反向代理和负载均衡的程序,以及对ingress定义的规则进行解析,根据ingress的配置的规则进行请求的转发。

但是这个ingress-controller不是K8S自带的组件功能,ingress-controller是一种插件的统称(一系列工具)

比如ingress-nginx(最常用的)、traefik(可视化界面,但是并发量差)都是ingress-controller,插件

ingress-controller是pod的方式运行在节点上

ingress根据service的名称选择service,service根据标签来匹配pod

三、ingress-nginx-controller暴露服务端的三种方式

1、Deployment+LoadBalancer模式:

ingress部署在公有云。ingress配置文件中会有type。type:LoadBalancer。公有云平台会为这个LoadBalancer的Service自动创建一个负载均衡器。绑定公网地址

通过域名指向公网地址,实现集群对外暴露

2、Daemonset+hostnetwork+nodeSelector模式:域名

Daemonset:在每个节点都会创建一个pod

hostnetwork:共享节点主机的网络命名空间。容器内直接使用节点主机的IP+端口(80和443)。pod上的容器可以直接访问主机上的网络资源(直接实现流量的转发和访问)

nodeSelector:根据标签选择部署的节点。选择nginx-ingress-controller部署的节点

缺点:和宿主机共用端口,直接利用节点主机的网络和端口资源,一个node只能部署一个ingress-controller的pod

优点:适用大并发场景的生产环境。性能是最好的

Service和endpoints来发现节点

最终转发是由ingress-controller来转发请求(http)和负载均衡

用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。

缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。 比较适合大并发的生产环境使用。

3、deployment+NodePort:端口

同样用deployment模式部署ingress-controller,并创建对应的service,但是service的type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景

NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响

4.DaemonSet+HostNetwork具体的部署过程

三个节点部署镜像

三台同步导入到当地仓库

三台同步下载yaml文件

主节点修改配置文件

注释以下两行

8181端口时nginx-controller的默认配置,当ingress没有资源可以匹配时会自动转发

编辑ingress

客户端:

三个节点镜像域名及IP映射

前缀匹配

选择标签部署:vim mandatory.yaml

选择node01打标签

正常访问

5.deployment+NodePort部署:先删除部署ingrees-nginx的mandatory

vim mandatory.yaml

下载nodeport的yaml文件

​​

6.ingress的deployment+NodePort实现https代理访问:

首先创建ssl的证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=CHINA/O=NJ"

req:生成证书文件的

x509:生成x.509自签名的证书

-sha256:表示使用sha-256散列算法

-nodes:表示生成到的秘钥不加密

-day 365:证书有效期365天

-newkey rsa:2048:RSA的密钥对,长度2048为位

-keyout tls.key -out tls.crt:密钥文件key,证书文件crt

-subj "/CN=nginxsvc/O=nginxsvc":主题,CN: common name O:

创建secret类型为tls

四、ingress的权限控制:访问页面的时候,输入设置好的密码才能访问页面,语法basicAuth

首先下载阿帕奇

创建健全文件

创建secret名称为basic-auth

编辑配置文件:首先设置认证的类型,再设置认证的secret的名称

访问时需要输入账号zhailiming及密码123

如何做页面跳转 ​​​​​​​

访问www.zlm.com就会跳转到www.test1.com

五、ingress的另外一个组件:

1.ingress-traefik 专门为了部署k8s微服务开发的http反向代理和负载均衡工具;自动发现匹配的后端pod变化,同时有可视化的页面;自动感知变化,实现服务自动发现。方法还是:deployment+NodePort和Daemonset+hostnetwork+nodeSelector

2.ingress-nginx和ingress-traefik区别:

ingress-nginx:使用nginx作为前端的负载均衡器,通过ingress-controller和k8s的api交互的方式来实现后端服务器的发现以及podIP地址的变化,动态的实现nginx的配置及修改

ingress-traefik:本身就能够和k8s的api交互,感知后端service以及pod的变化;traefik更简单、更加方便;由go语言写的和k8s的兼容性更好,但是并发能力只有ingres-nginx的6成

六、实现ingress-traefik的deployment+NodePort方法

首先下载四个文件deployment.yaml、traefik-rbac.yaml、traefik-ds.yaml、ui.yaml

wget https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-deployment.yaml

wget https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-rbac.yaml

wget https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/traefik-ds.yaml

wget https://gitee.com/mirrors/traefik/raw/v1.7/examples/k8s/ui.yaml

启动rbac健全文件

启动deploymount及ui(如果实现Daemonset+hostnetwork则启动ds和ui即可)

实现deployment+NodePort 方法

​​​​​

七、总结

1.ingress:核心是对外提供访问

2.ingress---根据service的名称选择service----service把请求根据匹配的标签转发到pod

3.ingress支持http及https

4.有两个重要的组件:

nginx-ingress-controller------主流

traefik-ingress-controller------目前再推广

5.最常用的是deployment+NodePort

6.对外访问用:Daemonset+hostnetwork

7.nginx-ingress-controller三种工作方式:

deployment+LoadBalancer,需要云平台提供一个负载均衡的公网地址,公有云上做

Daemonset+hostnetwork+nodeSelector,指定节点部署controller,缺点就是和宿主机共享网络,只能是一个controller的pod,hostnetwork这个配置会和宿主机共享网络资源,适用于大集群

deployment+NodePort,最常见,最常用,也是最简单的方式。他是集中一个NodePort端口,所有的ingress的请求都会转发到NodePort,然后由Service把流量转发到pod,一个ingress的NodePort可以实现访问多个虚拟主机(域名),和nginx是一样的,使用于内部访问,性能较低

8.ingress由这个组件来具体的实现反向代理和负载均衡

相关推荐
阿里云云原生9 小时前
Serverless 安全新杀器:云安全中心护航容器安全
安全·云原生·serverless
你是我的天晴9 小时前
Istio下载及安装
云原生·istio
你是我的天晴9 小时前
Istio:微服务网格的强大工具,Istio介绍
微服务·云原生·istio
Lill_bin10 小时前
Ribbon简介
分布式·后端·spring cloud·微服务·云原生·ribbon
吴半杯12 小时前
Docker安装SVN,搭建自己的本地版本仓库
docker·svn·容器
编程经验分享14 小时前
Windows 安装 ZooKeeper 以及 IDEA 安装 zoolytic 连接工具
分布式·zookeeper·云原生
俗庸20315 小时前
k8s中的认证授权
云原生·容器·kubernetes
HoweWWW15 小时前
k8s介绍及部署
docker·容器·kubernetes
俗庸20315 小时前
kubernetes技术详解,带你深入了解k8s
云原生·容器·kubernetes
躺平的花卷16 小时前
部署k8s基础环境
docker·容器·自动化