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由这个组件来具体的实现反向代理和负载均衡

相关推荐
鸠摩智首席音效师3 小时前
Docker 中如何限制CPU和内存的使用 ?
docker·容器
Michaelwubo3 小时前
Docker dockerfile镜像编码 centos7
运维·docker·容器
好像是个likun3 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
暴富的Tdy6 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
魏 无羡6 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
Karoku0666 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
豆豆豆豆变7 小时前
docker之compose篇
docker·容器·自动化运维
凌虚8 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
saynaihe8 小时前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
G_whang9 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器