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