Docker$Kubernetes笔记---06---k8s Service&Ingress
2023-12-25 16:23:39 0 举报
登录查看完整内容
Docker$Kubernetes笔记---06---k8s Service&Ingress
作者其他创作
大纲/内容
Service:Service用于4层流量的负载
ingress:ingress用于7层流量负载
k8s的流量负载组件:
在k8s中,pod是应用程序的载体,我们可以通过pod的IP访问容器中的应用程序,但是pod的IP地址不是固定的,所以不方便使用pod的IP进行访问服务;而Service可以对提供同一类服务的多个pod进行聚合,并提供一个统一的入口地址,这个地址在整个Service的生命周期中是不变的,通过Service的入口地址就能访问到后面的pod服务
Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个节点都运行着一个kube-proxy的服务进程,当创建Service的时候,会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的信息,然后会**将最新的Service信息转换成对应的访问规则**,该规则在所有的集群节点都会生成,最终通过访问规则进行流量转发。
userspace模式:最原始的转发模式,该模式在转发处理时会增加内核与用户空间的数据拷贝操作,转发效率低,已经很少用(作为了解)
iptables模式:该模式下kube-proxy不承担四层负载均衡器的角色,只创建iptables规则,然后用户的请求直接通过iptables转发规则被转发到后端的每个Pod中,但iptables模式不能提供灵活的负载均衡策略,只是随机的将流量转发到后端的Pod,当后端Pod不可用时也无法进行健康检查
ipvs(Virtual Server)模式:ipvs与iptables类似,kube-proxy也不承担四层负载均衡器的角色,只创建ipvs规则,然后用户的请求直接通过ipvs转发规则被转发到后端的每个Pod中,但是ipvs在转发时支持的负载均衡算法非常的灵活,例如轮询、随机、加权轮询、基于端口转发等
kube-proxy目前支持三种工作模式:
查看ipvs模块(在第一章集群环境部署时已经安装)lsmod | grep -e ip_vs -e nf_conntrack_ipv4
开启ipvs,编辑kube-proxy文件 PS:修改为ipvs模式kubectl edit cm kube-proxy -n kube-systemPS:cm(cmconfigmaps)在K8s中属于配置资源
删除当前正在使用的kube-proxy的pod(按照标签删除)kubectl delete po -l k8s-app=kube-proxy -n kube-system
查看kube-proxy的pod是否被重建kubectl get po -n kube-system
查看ipvs功能是否开启ipvsadm -Ln
想要使用ipvs转发模式需要安装ipvs内核模块,否则会降级为iptables模式
Service---概述
可通过 kubectl explain service查看service资源支持的属性
ClusterIP:默认访问方式,由k8s自动分配的虚拟IP,只能在集群内部访问
NodePort:将service通过指定的Node上的端口暴露给外部,通过此方式,就可以在集群外部访问服务
LoadBalancer:使用外接负载均衡器完成到服务的负载均衡分发,注意此模式需要外部云环境支持
ExternalName:把集群外部的服务引入集群内部,直接使用
service的四种访问方式介绍
创建deployment.yml文件vim deployment.yml
创建deploykubectl create -f deployment.yml
查看pod详细信息kubectl get po -n dev -o wide
为了更好的验证用户请求被分配到哪个pod中,修改3个pod中的nginx默认首页kubectl exec -it deployment-6696798b78-6zl8p -n dev /bin/bashecho \"10.244.1.44\" > /usr/share/nginx/html/index.html
访问3个pod测试curl http://10.244.196.129:80
实验:通过Deployment创建3个pod并设置标签为app=nginx-pod(使用前面的deployment.yml创建即可)
Service---资源清单文件介绍
创建service-clusterip.yml文件vim service-clusterip.yml
创建servicekubectl create -f service-clusterip.yml
查看service信息kubectl get svc service -n dev
查看service详细描述kubectl describe svc service -n dev
查看ipvs的映射规则 PS:rr为默认轮询策略:当service接收到请求后,会通过轮询算法将请求分配到对应的三个pod中ipvsadm -Ln
访问测试
删除servicekubectl delete -f service-clusterip.yml
总结:ClusterIP的访问方式只能用在集群内部主机之间访问,集群外部主机没办法访问PS:这边测试的时候用到了上面创建的三个pod作为测试
Service---ClusterIP类型
在某些场景下,开发人员如果不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这样的情况,k8s提供了HeadLiness,HeadLiness不会分配Cluster IP,如果想要访问Service,只能通过Service的域名进行访问
创建service-headliness.yml文件vim service-headliness.yml
创建headlinesskubectl create -f service-headliness.yml
查看headlinesskubectl get svc service-headliness -n dev
查看headliness描述信息kubectl describe svc service-headliness -n dev
进入容器查看当前容器使用的DNS解析地址kubectl get po -n devkubectl exec -it deployment-6696798b78-6zl8p -n dev /bin/bash
安装dig命令;PS:使用dig命令通过DNS服务器地址加上headliness名称与search名称进行访问yum -y install bind-utils
访问dig @10.96.0.10 service-headliness.dev.svc.cluster.local
Service---HeadLiness类型
前边创建的service只能用于在集群内部访问,但是在生产环境中,service是需要暴露给外部访问的,如果希望将service暴露给集群访问,那么就要用到NodePort类型的service,NodePort的工作原理其实就是将service的端口映射到Node的一个端口上,然后外部主机就可以通过NodeIP:NodePort来访问集群中的pod了
实验:创建service-nodeport.yml文件vim service-nodeport.yml
创建servicekubectl create -f service-nodeport.yml
查看service信息kubectl get svc -n dev
外部主机访问测试(通过宿主机主机IP加service端口,此时访问集群中任何一台节点IP都可以)http://192.168.1.197:30000
Service---NodePort类型
LoadBalancer和NodePort类似,目的都是向外部暴露一个端口,区别在于LoadBalancer会在集群外部在做一个负载均衡设备,而这个设备需要外部环境支持,外部服务器发送到这个设备的请求,会被设备负载之后转发到集群中
Service---Service之LoadBalancer类型
ExternaIName用于引入集群外部的服务,它通过externaIName属性指定外部一个服务的地址,然后在集群内部访问此service就可以访问到外部服务了
实验:创建service-externalname.ymlvim service-externalname.yml
创建servicekubectl create -f service-externalname.yml
查看servicekubectl get svc -n dev
域名解析dig @10.96.0.10 service-externalname.dev.svc.cluster.local
Service---Service之ExternaIName类型
NotePort:该方式的缺点是会占用很多集群机器的端口,当集群服务变多时,这个缺点就愈发的明显
LoadBalancer:该方式的缺点是每个service都需要一个外部负载均衡设备的支持才可以
基于这种现状,k8s提供了ingress资源对象,ingress只需要一个NodePort或者一个负载均衡设备就可以满足暴露多个service的需求
在前面的章节中通过通过Service对集群之外暴露服务的主要方式有两种:
Ingress:k8s中的一个对象,作用是定义请求如何转发到service的规则
Ingress controller:具体实现反向代理及负载均衡的程序,对Ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx,Contour,Haproxy等等
实际上Ingress相当于一个7层的负载均衡器,是k8s对反向代理的一个抽象,它的工作原理类似于Nginx,可以理解成Ingress里建立诸多映射规则,Ingress Colltroller通过监听这些配置规则并转化成Nginx的反向代理配置,然后对外部提供服务,在这里有两个核心理念:
1.用户编写Ingress规则,说明哪个域名对应K8s集群中的Service
2.Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的Nginx反向代理配置
3.Ingress控制器会将生成的Nginx配置写入到一个运行着的Nginx服务中,并动态更新
4.到此为止,其实真正工作的就是一个Nginx了,内部配置了用户定义的请求转发规则
Ingress(以nginx为例)的工作原理
Ingress---Ingress介绍
到github中下载对应kubernetes版本的ingress-nginx版本https://github.com/kubernetes/ingress-nginx/tags
进入到对应的目录下通过yaml文件方式安装控制器ingress-nginx-controller-v1.9.5/deploy/static/provider/cloud/
创建ingress-nginxkubectl apply -f deploy.yaml
查看ns(会有一个ingress-nginx的名称空间产生)kubectl get ns
查看ingress-nginx名称空间的podkubectl get po -n ingress-nginx
查看servicekubectl get svc -n ingress-nginx
搭建ingress环境,先部署ingress-nginx控制器
yml文件创建vim tomcat-nginx.yml
为了避免前边创建的nginx-pod存在,先删除dev名称空间kubectl delete ns dev
创建dev名称空间kubectl create ns dev
创建svc与podkubectl create -f tomcat-nginx.yml
查看svc信息kubectl get svc -n dev
查看pod信息kubectl get po -n dev
部署tomcat与nginx的pod,通过tomcat-nginx.yml文件创建
Ingress---ingress环境搭建
通过ingress代理http服务,创建ingress-http.ymlvim ingress-http.yml
创建ingresskubectl create -f ingress-http.yml
查看ingress信息kubectl get ing ingress-http -n dev
查看详细描述kubectl describe ing ingress-http -n dev
192.168.1.197 www.nginx.com
192.168.1.197 www.tomcat.com
添加解析
浏览器访问由于域名无法正常解析,需要在windows内进行解析:C:\\Windows\\System32\\drivers\\etc
测试HTTP代理
查看ingress-nginx暴露的端口kubectl get svc -n ingress-nginx
在访问测试时,通过域名与ingress对外暴露的端口进行访问
http://www.nginx.com:30256
http://www.tomcat.com:30256
访问测试:注意80对应的是HTTP端口,443对应的是HTTPS端口
Ingress---Ingress-HTTP代理
生成证书openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj \"/C=CN/ST=TJ/O=nginx/CN=thinkmo.com\"
创建密钥kubectl create secret tls tls-secret --key tls.key --cert tls.crt
创建ingress-https.ymlvim ingress-https.yml
创建ingresskubectl create -f ingress-https.yml
查看ingress信息kubectl get ing ingress-https -n dev
查看详细信息kubectl describe ing ingress-https -n dev
查看ingress-nginx端口kubectl get svc -n ingress-nginx
https://www.nginx.com:31232
https://www.tomcat.com:31232
访问测试:访问443对应的端口
Ingress---ingress-HTTPS代理
Docker$Kubernetes笔记---06---k8s Service&Ingress
0 条评论
回复 删除
下一页