一.service简介
k8s中pod是最小的单元,pod中运行着各种业务应用,这些应用怎么对外提供服务?
若直接让pod对外提供服务,那么pod的IP因生成、销毁和滚动更新导致变化后,对外提供的服务就会受到影响。k8s抽象出一种service的概念,service一旦创建就不再变化,通过service来关联后端的一组pod,pod可随时变化,无论pod在不在一个节点node,对外提供服务均不会受到影响。
外部用户不直接访问pod,外部用户访问的是一唯一的虚拟IP(cluster-ip)和随机端口(30000-32767),通过iptables的nat转发实现与后端pod进行关联。
pod重新生成、销毁和滚动更新,pod的ip就变化了呀,怎么做到对应的转发呢?其实还有一个kube-proxy模块,kube-proxy实现反向代理和服务发现,在服务发现方面,kube-proxy轮训API来获取pod配置信息的变动,监控并维护集群中service和endpoint(ip+port)对象数据,保证后端pod的IP变化不会对前端用户造成影响,前端用户无需关心pod的任何变动。通过反向代理,可以将客户流量转发到与service对应的一组后端pod上面。
另外,service与pod的对接,还有一种标签label选择器的概念,service通过标签label来选取后端服务,同样,同一节点node和不同节点node上,可能存在标签名字一样的标签。这也说明service关联后端的一组pod,pod可能位于集群中不同或同一个节点node上。
pod滚动更新,旧pod暂时不删除---生成新pod---新pod可用---删除旧pod,其他节点依次更新。
二.service管理
1.作用
实现与pod的解耦,对外暴露流量
服务发现,确保pod可用
负载均衡,定义一组pod的访问策略
2.service的deployment资源字段查看
#查看service资源字段
kubectl explain service
kubectl explain service.spec
kubectl explain service.spec.ports
3.三个IP
Pod IP:就是pod的IP,集群内部通过大二层技术可以直接访问,node内直接访问,node之间通过大二层技术访问
Node IP:集群中节点node的物理网卡IP,pod与node之间的pod通信,需要经过此IP
ClusterIP:虚拟IP,无法ping,外部无法访问,集群内部使用,需要结合服务端口才具有意义。
4.四种类型
ClusterIP:默认类型,与pod集群内部pod之间通信,与外部无法通信
nodePort:使用宿主机的IP和端口与外部通信
loadBalancer:使用外接云负载均衡,完成服务到负载的分发,除了指定负载均衡的IP,还需要定义nodePort和ClusterIP。
ExternalName:不创建新的网络IP和端口,是DNS的CNAME记录。
5.service的创建
通过kubectl create service创建
#命令创建示例
#clusterip
kubectl create service clusterip my-service --tcp=port:targetport
#nodeport
kubectl create service nodeport my-service --tcp=port:targetport
#loadbalancer
kubectl create service loadbalancer my-service --tcp=port:targetport
#externalname
kubectl create service externalname my-service --external-name alibaby007.com
通过kubectl expose创建
nginx为deployment元数据的名字,nginx-service为service的名字
#clusterip
kubectl expose deployment nginx --name=nginx-service --port=80 --target-port=80 --type=ClusterIP
#nodeport
kubectl expose deployment nginx --name=nginx-service --port=80 --target-port=80 --type=NodePort
#loadbalancer
kubectl expose deployment nginx --name=nginx-service --port=80 --target-port=80 --type=LoadBalancer
#externalname
kubectl expose service nginx --name=nginx-service --port=80 --target-port=80 --type=ExternalName
通过deployment创建
kubectl apply -f my-service.yaml
ClusterIP类型的Service:
selector: MyApp 标签选择器,用来选择服务可以代理的后端pod。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 80
NodePort类型的Service: nodePort的范围30000-32767
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30007
type: NodePort
LoadBalancer类型的Service:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
ExternalName类型的Service:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: alibaby007.com
6.service的查看
#服务查看
kubectl get svc
#带SELECTOR信息查看
kubectl get svc -o wide
#更详细的查看
kubectl describe service my-service
#服务代理的endpoints ip+port
kubectl get endpoints my-service
7.service的删除
#首先查看
kubectl get svc
#命令行创建的删除
kubectl delete service my-service
#yaml创建的删除
kubectl delete -f my-service.yaml
三.ingress
service与ingress的区别
Service用于基本的网络访问和负载均衡,Ingress则用于复杂的HTTP/HTTPS路由和反向代理。
Service提供四层(TCP/UDP)负载均衡,而Ingress提供七层(HTTP/HTTPS)负载均衡。
Service通过NodePort或LoadBalancer暴露服务,但端口管理相对复杂。Ingress通过统一入口实现,将一个网站多个子服务的路径路由到不同的Service,管理更方便。
Service主要用于在内部网络中提供负载均衡和访问规则,而Ingress则用于将外部网络流量路由到适当的Service和Pod上。