k8s集群中的service

发布时间:2025-10-21 点击:18
云计算
k8s集群内部服务发现的方式有两种:
1、通过变量发现
只能获取相同namespace里的变量
变量的获取有先后顺序,引用的变量必须要先创建
2、通过dns的方式发现
在kube-system里有dns,可以自动发现所有命名空间里的服务的clusterip
所以,在同一个命名空间里,一个服务访问另外一个服务的时候,可以直接通过服务名来访问
只要创建了一个服务(不管在哪个ns里创建的),都会自动向kube-system里的dns注册
如果是不同的命名空间,可以通过 服务名.命名空间名 来访问
service是一种抽象的对象,它定义了一组pod的逻辑集合和一个用于访问它们的策略。
service主要实现集群内部通信,以及基于四层的内外通信(如端口)。
service用于为pod提供一个固定,统一的访问接口及负载均衡的能力,并借助新一代dns的服务发现功能,解决客户端发现并访问容器化应用的难题。
service的地址是不会发生改变的,它通过标签选择器和后端的pod关联。
k8s集群中的3种ip:
1、node ip:node节点的ip地址
2、pod ip: pod的ip地址
3、cluster ip: service的ip地址,不能ping通
k8s集群中的service类型
$ kubectl explain svc.spec.type
defaults to clusterip. valid options are externalname, clusterip, nodeport, and loadbalancer.
不使用type字段的话,默认就是clusterip类型
1、clusterip:通过集群的内部 ip 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的servicetype。
k8s集群内部流量走向:
内部客户端–service(clussterip:port)–endpoint(ip和port列表)–应用pod(port)
2、nodeport:通过每个 node 节点上的 ip 和静态端口(nodeport)暴露服务。nodeport 服务会路由到 clusterip 服务,这个 clusterip 服务会自动创建。通过请求 :,可以从集群的外部访问一个 nodeport 服务。
nodeport类型的service数据流向:
外部用户–外部lb–nodeport(集群入口)–service–endpoint–应用pod
3、loadbalancer类型的service应用在公有云环境中
4、externalname类型的service用于实现集群内部pod访问集群外部的服务
数据流向:内部pod–service–外部服务
该类型的service没有serviceip,没有nodeport,没有标签选择器,需要cname解析记录
完成内部流量转发工作的是各工作节点的kube-proxy
proxy工作模式有3种:
1、userspace代理模式
2、iptables代理模式
3、ipvs代理模式
ipvs模式和iptables模式的区别仅仅是:请求流量的调度功能由ipvs完成,其他功能仍由iptables完成
创建service的两种方式:
1、使用kubectl expose命令
2、定义资源清单文件
$ kubectl explain svc.metadata
fields:
labels
name #svc的名字
namespace
$ kubectl explain svc.spec
fields:
clusterip #svc的ip地址
ports
selector
type
$ kubectl explain svc.spec.clusterip
clusterip is the ip address of the service and is usually assigned randomly by the master.
valid values are "none", empty string (""), or a valid ip address.
"none" can be specified for headless services when proxying is not required.
only applies to types clusterip, nodeport, and loadbalancer. ignored if type is externalname.
clusterip表示svc的ip地址,一般自动获取,不用手动指定。如果不使用该字段或者指定其值为空,都表示自动获取ip地址。
如果指定其值为none,表示该svc是无头服务。
当svc的type是externalname时,不能使用该字段。
$ kubectl explain svc.spec.ports
fields:
1、port:
指该service暴露的端口,用yaml文件创建svc时是必选项,用命令创建时可以不指定,如果不指定,会继承pod中的containerport。
2、nodeport:
指node节点端口(只有当type为nodeport或loadbalancer时才需要该参数,一般自动生成),用于对外通信。
3、targetport:
指后端pod暴露的端口,就是pod中的containerport。
如果既不指定port又不指定targetport,那么port和targetport都会继承pod中的containerport。
如果指定了port而没有指定targetport,那么targetport会继承port值,所以此时必须指定targetport值为pod中的containerport,不能随便指定端口号,除非port值和pod中的containerport相同(这种情况可以不指定targetport)。
当type为clusterip时,流量经过的端口走向是:
svc端口(port)—-pod端口(targetport)—-容器端口(containerport)
当type为nodeport时,流量经过的端口走向是:
节点端口(nodeport)—-svc端口(port)—-pod端口(targetport)—-容器端口(containerport)
使用命令创建svc(containerport是8080)
$ kubectl get deploy
$ kubectl expose deploy deploy_name1
$ kubectl get svc
$ kubectl delete svc svc_name
$ kubectl expose deploy deploy_name2 –port=8080
$ kubectl expose deploy deploy_name3–port=80 –target-port=8080
$ kubectl expose deploy deploy_name4 –port=80 –target-port=8080 –type=nodeport
$ kubectl get svc svc_name -o yaml
spec: clusterip: 10.97.153.130 externaltrafficpolicy: cluster ports: - nodeport: 30693 port: 80 protocol: tcp targetport: 8080$ curl http://10.97.153.130
$ curl http://192.168.1.243:30693 #243是master地址
$ kubectl delete svc svc_name
用yaml文件创建svc
apiversion: v1kind: servicemetadata: labels: ame: mysvc name: mysvcspec: ports: - port: 80 targetport: 8080 selector: app: mysvc #匹配标签为app: mysvc的后端pod type: nodeportheadless无头类型的service:
该service没有ip,客户端不经过service,而是直接访问后端的pod
无头服务的type不能是nodeport。
k

电脑中如何设置指定软件单独切换NVIDIA独立显卡
备案没有云服务器怎么弄
好的网站建设判定要求有哪些
ZStack 神龙服务器:弹性裸金属开创企业私有云新纪元
蒙牛称“特仑苏”域名遭恶意抢注
网站域名可以买过期的域名吗
客户是移动网络访问网站反应速度慢
稳定的挂机宝和云服务器提供商