一.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,其他节点依次更新。

k8s service ingress_ingress

二.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上。