10、k8s对外服务之ingress
service和ingress的作用
service的作用
NodePort:会在每个节点开放一个端口,端口号30000-32767。
也是只能用于内网访问,四层转发。实现负载均衡。不能基于域名进行访问。
clusterip:service的默认类型,只能在集群内部访问。
loadBalancer:基于云平台的实现的,需要有loadBalancer的地址,仅限于云平台。
externallPS:service允许分配外部IP,把外部IP路由集中到集群的一个或者多个node节点。
ingress:只需要一个或者少量的公网IP地址或者loadBalancer的地址,就可以实现将多个http的服务暴露到外网,七层代理,service的service,基于域名和URL路径,把用户的请求转发到一个或者多个service的规则。
数据流向图
根据ingress-controller匹配到指定service,service再把访问ingress的基于域名的连接流量转发到service匹配的pod。
ingress的组成
ingress只能配置yaml文件配置,其实ingress是一种规则,根据ingress的配置匹配到指定service,service再把访问ingress的基于域名的连接流量转发到service匹配的pod。
ingress-controller:不是k8s自带的组件,第三方的软件,不管是哪一种ingress-controller机制都是一样的,没有任何区别,都是以pod的形式运行在集群当中。
- ingress-nginx:主流的ingress-controller。
- traefik:有图形化的ui,直观。
ingress-controller暴露方式
1、deployment+loabBalancer:你把ingress部署在公有云,可以采用这种方式,loadBalancer会为service自带创建一个负载均衡器,只要域名解析指向到loadbalancer的地址,就可以实现集群的对外访问。
2、daemonSet+hostnetwork+nodeSelector:ingress-controller会直接使用宿主机的网络和端口,一个node节点只能部署一个ingress-controller的pod。适用于大并发的生产环境。
3、deployment+nodeport:deployment部署也会执行一个ingress-controller的pod,pod也会执行一个service,service的模式是nodeport,分别对应80(http)和443(https),对应节点的端口号范围是30000-32767。
还需要额外部署一个service转发到pod,这种方式又会多了一层转发的请求,请求量级大,性能会有一定影响。
转发方式:NAT
ingress部署实现的过程
daemonSet+hostnetwork+nodeSelector模式
1、先给node2定义标签
2、提前准备好nginx-ingress-controller脚本文件并运行,保证daemonSet
由下可见hostnetwork直接使用了宿主机node2的端口转发流量
- 8181:nginx-controller默认配置的后台转发的端口,ingress没有匹配到规则时,使用的默认端口。
3、接着编写yaml脚本,定义pvc、pod、service和ingress,使ingress请求转向service,service再转向pod,pvc给pod自动分配pv。
4、最后给node2节点做域名映射,运行脚本后显示成功。
deployment+nodeport模式
1、提前准备好nginx-ingress-controller脚本文件并运行,保证deployment
2、创建service的yaml文件如下
3、直接运行上面实验(包含pvc、pod、service和ingress)的yaml脚本
4、最后node1或者node2节点做域名映射,运行脚本后显示成功。
https
https概念
http的加密版就是https,默认端口是443。加密方式:SSL或者TSL协议实现加密和认证。SSL已经淘汰,TLS证书是主流。
TLS的组成:
- 记录协议(record protocol):负责数据传输的可靠性
- 握手协议(handshake Security):建立安全连接的过程
TSL的作用:
- 数据加密:使用对称密钥加密通信的内容。
- 认知:通过数字证书验证服务器(服务端和客户端都要)的身份。证书可以自定义,也可以在专门的数字证书网站获取。
- 完整性检查:防止第三方对数据进行篡改。
htttps数据流向:
1、客户端发起请求,如向百度发起请求(请求方式:https,请求方法:get),请求建立连接:三次握手。
2、TLS/SSL的握手过程:
- 客户端——>发送支持tls版本的加密套件列表(证书和私钥文件)
- 服务端——>服务器选择一个双方都支持的TLS的证书和私钥等等,生产一个数字证书。
- 客户端——>客户端收到服务端的证书之后,验证证书的有效性(签发证书人是否合法,过期时间等等)。
- 客户端生成预定的密钥(TLS),和服务器交换密钥;服务端验证密钥的有效性,以及密钥是否正确。
- TLS的握手过程完成
3、建立安全连接:使用协商好的加密算法和密钥对后续的数据进行加密传输。
4、关闭TLS连接,释放资源然后四次挥手断开连接。
https部署实现的过程
daemonSet+hostnetwork+nodeSelector
1、先在集群内生成证书和密钥
证书:用于加密和认证网络通信的数字证书,证明服务器的身份。确保客户端连接到服务器是合法的。协商加密的密钥,保证通信过程中数据的安全。
公钥:有组织信息,数字签名等等,证书颁发机构签发的。
私钥:对服务器的证书进行数字签名,同时用于解密客户端发送的加密数据,私钥只有服务端才能够访问。
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
- openssl:签发ssl证书
- req:执行证书的请求以及生产相关的文件
- -x509:生成自签名x.509格式的证书
- -sha256:使用sha-256的散列算法
- -nodes:表示生成的私钥不加密
- -days 365:证书有效期的时间365天
- -newkey rsa:2048:表示生成密钥对是rsa加密的,长度是2048位。
- -keyout tls.key:生成的密钥对保存到tls.key文件中
- -out tls.crt:证书保存到tls.crt文件中
- -subj "/CN=nginxsvc/O=nginxsvc:为证书添加一个主题,CN是证书的名称,O是组织关系。
2、将证书和密钥保存到secret中
3、根据上面http的配置文件修改ingress控制字段添加个加密即可。
4、最后在主节点上给node2节点做域名映射,运行脚本后显示成功。
deployment+nodeport模式实现https在上面http实操基础上添加加密字段即可。
容器内抓包
1、获取docker的container id
2、根据container id获取docker的进程号
docker inspect --format '{{.State.Pid}}' container id
3、进入这个容器的网络命令空间
nsenter -n -t pid号
4、抓包
tcpdump -i 容器的网卡名
ingress补充
基于用户名和密码实现登录的认证
这里我们使用上面deployment+nodeport模式实验的pod,当然也可以重新建一个pod。
apt -y install apache2
设置http的账号密码
- auth是加密的文件的名称,必须是auth的名称。
2、创建secret,使用auth加密的文件。
3、配置yaml文件
页面跳转,重定向
配置yaml文件
做个地址映射即可实现url页面跳转
当我们访问re.xy104.com会跳转到www2.xy104.com:32271
traefik
ingress-controller的另一种插件,和nginx-ingress大同小异。
也是部署微服务更快捷的视线的http反向代理和负载均衡,以及7层代理。
nginx-ingress 需要不断的请求 k8s的api,获取终端的变化,traefik自动的实时更新,可以完全同步获取k8s的api的更新结果,和k8s的适配度更高。
nginx-ingree处理大并发环境更优秀
traefik:一般用于小的集群,并发量不是那么大的请求环境,。
traefik的部署方式
deployment+nodeport:适合面向内部服务
daemonset+hostnetwork+nodeselector:适合面向外部服务
loadbalancer+deployme
总结
ingress是外部进入k8s集群的入口,可以理解为service的service,ingress使用的时候,域名,匹配到可用的service。
ingress是做7层转发,可以对http/https的请求进行处理。