(七)Kubernetes Service

官网链接 https://kubernetes.io/zh/docs/concepts/services-networking/service/
service是将一组运行Pods上的应用程序公开为网络服务的抽象方法
为什么要有service
pod具有不停销毁、创建的特征,每个Pod又有自己分配的IP,Pod的创建、销毁意味着IP不停的变更,前端如何跟踪IP地址变得非常困难,service就是来解决这个问题的。它可以实现监控Pod的变化,并对外提供一个固定的访问入口(负载均衡的入口);
Endpoints
通过endpoints,我们可以知道service后面关联的pods情况;endpoints会随着pods的变化而变化。service和pod通过labels关联。
kubectl get endpoints #查看endpoints
Service的意义
防止Pod失联
定义一组Pod的访问策略(负载均衡,默认是轮询)
支持ClusterIP、NodePort、LoadBalancer三种类型
官网链接 https://kubernetes.io/zh/docs/tutorials/services/source-ip/#type-clusterip-%e7%b1%bb%e5%9e%8b-services-%e7%9a%84-source-ip
ClusetrIp :默认分配一个集群内部可以访问的的虚拟IP(VIP)

NodePort:在每个node上分配一个端口作为外部访问入口,端口建议固定,不要随机分配(可以通过每个节点外网IP访问,使用SLB绑定节点IP实现负载均衡)。

LoadBalancer:工作在特定的Cloud provider上。例如google cloud,AWS, OpenStack (不用我们自己配置SLB 里面的Node服务器,自己接入负载均衡)

service底层实现主要有Iptables和IPVS两种网络模式

Service代理
在kubernetes集群中,每个node运行一个kube-proxy进程。kube-proxy负责为Service实现一种VIP(虚拟IP)的形式。
cat /opt/kubernetes/cfg/kube-proxy.conf #node上设置代理模式
userspace代理模式

IpTables代理模式

相对于userspace模式,iptables模式在检测到分配的第一个pod链接失败后,会自动分配其他pod进行重试。
iptable会创建很多规则(更新,非增量)
iptable会从上到下逐条匹配(延迟大)
iptables -L #查看规则
IPVS代理模式

相对于iptables模式,iptables 是面向用户端口层面 IPVS模式 直接面向内核 效率更高,kube-proxy重定向通信延迟更短,同步代理规则性能更好,
ipvsadm -ln #查看ipvs规则
service.yaml

kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80 --name=nginx-service -o yaml --dry-run #生成yaml
apiVersion: v1 #service api版本
kind: Service #设置为service
metadata: #元数据
  creationTimestamp: null
  labels:
    run: nginx #标签
  name: nginx-service #service名称
spec:
  ports:
  - port: 80 #service端口,用于集群内部访问的端口
    protocol: TCP #协议tcp、udp
    targetPort: 80 #容器内部应用的端口,例如ngin默认端口是8080
    nodePort=30001 #设置nodeport端口,限定在30000-50000之间
  selector:
    run: nginx #关联的标签
  type: NodePort #ClusterIP、NodePort、LoadBalancer三种类型
status:
  loadBalancer: {}

多端口Service
使用多端口时候,必须提供所有端口的名称,使他们无歧义。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http #端口name1
      protocol: TCP
      port: 80
      targetPort: 9376
    - name: https #端口name2
      protocol: TCP
      port: 443
      targetPort: 9377

集群内部DNS服务
Core DNS 是目前kubernetes系统内部默认的DNS服务。
(七)Kubernetes Service
在使用busybox 测试DNS 是 假设不是同一个namespace 可以使用(七)Kubernetes Service 后面 svc.cluster.local 可以不填写。

猜你喜欢

转载自blog.51cto.com/1014810/2484784