k8s对外服务之ingress:
service的作用:
NodePort:会在每个节点开放一个端口,端口号30000-32767。
也是只能用于内网访问,四层转发。实现负载均衡。不能基于域名进行访问。
clusterip:service的默认类型,只能在集群内部访问
loadBalancer:基于云平台的实现的,需要有loadBalancer的地址,仅限于云平台
externallPS:service允许分配外部ip,把外部ip路由集中到集群的一个或者多个node节点
ingress:只需要一个或者少量的公网ip地址或者是loadBalancer的地址,就可以实现将多个http的服务,暴露到外网,七层代理,service的service,基于域名和URL路径,把用户的请求转发到一个或者多个service的规则。
ingress的组成:
ingress只能通过yaml文件配置,其实ingress是一种规则,根据ingress的配置匹配到指定service,service再把访问ingress的基于域名的连接流量转发到service匹配的pod。
ingress-controller:不是k8s自带的组件,第三方的软件,不管是哪一种ingress-controller机制都一样的,没有任何区别,都是以pod的形式运行在集群当中。
ingress-nginx-------------主流的方式
traefik------------->图形化的ui,直观。
ingress-controller暴露服务的方式:
ingress-nginx
traefik
第一种:
deployment+loabBalancer
你把ingress部署在公有云,可以采用这种方式,loadBalancer会为service自动创建一个负载均衡器,只要域名解析指向到loadBalancer的地址,就可以实现集群的对外访问
第二种:
daemonSET+hostNetworkrk+nodeSelector:
ingress-controller会直接使用宿主机的网络和端口,一个node节点只能部署一个ingress-controller的pod。 适用于大并发的生产环境。
第三种:
deployment+Nodeport部署
deployment部署也会执行一个ingress-controller的pod,pod也会对应一个service,service的模式是NodePort,分别对应80和443
80----------》http--------------30000-32767
443---------》https-----------30000-32767
还需要再额外部署一个service,转发到pod。这种方式又会多了一层转发的请求,请求量极大,性能会有一定影响。
转发方式:NAT(地址转发)
daemonSET+hostNetworkrk+nodeSelector部署
做个标签

8181:nginx-controller默认配置的后台转发的端口,ingree没有匹配到规则时,使用的默认端口。
允许

pvc





deployment+Nodeport部署
https是什么:
就是http的加密版就是https,默认端口是443
加密方式:SSL/TLS协议实现加密认证
SSL已经淘汰,TLS证书是主流
TLS的组成:
记录协议(record protocol):负责数据传输的可靠性
握手协议(handshake Security):建立安全连接的过程
TSL的作用:
1、数据加密:使用对称密钥加密通信的内容
2、认证:通过数字证书验证服务器的身份
服务端和客户端之间都要认证。证书可以自定义,也可以在专门的数字证书网站获取
3、完整性检查:防止第三方对数据进行篡改
https数据流向:
1、客户端发起请求------>百度
请求的方式是https,请求的方法get
请求建立连接:三次握手
2、TLS/SSL的握手过程:
客户端-------->发送支持tls版本的加密套件列表(证书和私钥文件)
服务端-------->服务端选择一个双方都支持的TLS的证书和私钥等等,生成一个数字证书
客户端-------->客户端收到服务端的证书之后,验证证书的有效性(签发证书人是否合法,过期时间等等)
客户端生成预定的密钥(TLS),和服务器交换密钥,服务端验证密钥的有效性,已经密钥是否正确
TLS的握手过程完成
3、建立安全连接:
使用协商好的加密算法和密钥对后续的数据进行加密传输
4、关闭TLS连接,释放资源然后四次挥手断开连接
https部署实现的过程:
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的散列算法
-node:表示生成的私钥不加密
-days 365:证书的有效期时间365天
-newkey rsa:2048 :表示生成密钥对是RSA加密的,长度是2048位
-keyout tls.key -out tls.crt:生成的密钥对,保存到tls.crt文件中
-out tls.crt:证书保存到tls.crt文件中
-subj "/CN=nginxsvc/O=nginxsvc":为证书添加一个主题cn证书的名称 O:组织关系
证书:用于加密和认证网络通信的数字证书,证明服务器的身份。确保客户端连接到的服务器是合法的。协商加密的密钥,保证通信过程中数据的安全。
公钥,组织信息,数字签名等等,证书颁发机构签发的。
私钥:对服务器的证书进行数字签名,同时用于解密客户端发送的加密数据,私钥只有服务端才能够访问与证书匹配的私钥文件。



容器内抓包
1、获取docker的container id
2、根据containerid获取docker的进程号
docker inspect --format '{{.State.Pid}}' a9af52be75d17d7a97e0453ff5a721ff1bc4c5ecaf27519772b2d270320c49f6
3、进入这个容器的网络命令空间
nsenter-n-t pid号
4、tcpdump -i容器的网卡名
ingress:
1、基于用户名和密码实现登录的认证



已创建的要先删除再创建


2、页面跳转,重定向。

traefik
ingress-controller的另一种插件,和nginx-ingress大同小异
也是部署微服务更快捷的http反向代理和负载均衡,以及7层代理。
nginx-ingress需要不断的请求k8s的api,获取终端的变化,
traefik自动的实时更新,可以完全同步获取k8s的api的更新结果,和k8s的适配度更高
nginx-ingree:处理大并发环境更优秀
traefik:一般用于小的集群,并发量不是那么大的请求环境。
traefik的部署方式:
deployment+nodeport----------->内部服务
loadbalancer+deployment--------------->公有云支持
daemonset+hostnetwork+nodeselector------------>面向外部服务
4按照顺序部署




总结:
ingress是外部进入k8s集群的入口,可以理解为service的service,ingress使用的时候,域名,匹配到可用的service。
ingress是做7层转发,可以对http/https的请求进行处理


