设为首页 收藏本站
查看: 1272|回复: 0

[经验分享] k8s实战之Service

[复制链接]
发表于 2018-1-5 22:43:24 | 显示全部楼层 |阅读模式
一、概述
  为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持,k8s中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构,任何应用都可以非常轻易地运行在k8s中而无须对架构进行改动;
  k8s分配给Service一个固定IP,这是一个虚拟IP(也称为ClusterIP),并不是一个真实存在的IP,而是由k8s虚拟出来的。虚拟IP的范围通过k8s API Server的启动参数 --service-cluster-ip-range=19.254.0.0/16配置;
  虚拟IP属于k8s内部的虚拟网络,外部是寻址不到的。在k8s系统中,实际上是由k8s Proxy组件负责实现虚拟IP路由和转发的,所以k8s Node中都必须运行了k8s Proxy,从而在容器覆盖网络之上又实现了k8s层级的虚拟转发网络。

服务代理:
  在逻辑层面上,Service被认为是真实应用的抽象,每一个Service关联着一系列的Pod。在物理层面上,Service有事真实应用的代理服务器,对外表现为一个单一访问入口,通过k8s Proxy转发请求到Service关联的Pod。
  Service同样是根据Label Selector来刷选Pod进行关联的,实际上k8s在Service和Pod之间通过Endpoint衔接,Endpoints同Service关联的Pod;相对应,可以认为是Service的服务代理后端,k8s会根据Service关联到Pod的PodIP信息组合成一个Endpoints。
  

  #kubectl get service my-nginx  

  #kubectl get pod --selector app=nginx  

  k8s创建Service的同时,会自动创建跟Service同名的Endpoints:  

  #kubectl get endpoints my-nginx -o yaml  

  #kubectl describe service my-nginx  

  Service不仅可以代理Pod,还可以代理任意其他后端,比如运行在k8s外部的服务。加速现在要使用一个Service代理外部MySQL服务,不用设置Service的Label Selector。
  Service的定义文件: mysql-service.yaml:
  

apiVersion: v1  

kind: Service  

metadata:  

name: mysql  

spec:  

ports:  

- port: 3306  
           targetPort: 3306
  
           protocol: TCP
  

  同时定义跟Service同名的Endpoints,Endpoints中设置了MySQL的IP:192.168.3.180;
  Endpoints的定义文件mysql-endpoints.yaml:
  

apiVersion: v1  

kind: Endpoints  

metadata:  

name: mysql  

subsets:  

- addresses:  

- ip: 192.168.39.175  
ports:
  
         - port: 3306
  
protocol: TCP
  

  #kubectl create -f mysql-service.yaml -f mysql-endpoints.yaml
  微服务化应用的每一个组件都以Service进行抽象,组件与组件之间只需要访问Service即可以互相通信,而无须感知组件的集群变化。
  这就是服务发现;
  #kubectl exec my-pod -- nslookup my-service.my-ns --namespace=default
  #kubectl exec my-pod -- nslookup my-service  --namespace=my-ns

二、Service发布
  k8s提供了NodePort Service、 LoadBalancer Service和Ingress可以发布Service;

  NodePort Service
  NodePort Service是类型为NodePort的Service, k8s除了会分配给NodePort Service一个内部的虚拟IP,另外会在每一个Node上暴露端口NodePort,外部网络可以通过[NodeIP]:[NodePort]访问到Service。

  LoadBalancer Service   (需要底层云平台支持创建负载均衡器,比如GCE)
  LoadBalancer Service是类型为LoadBalancer的Service,它是建立在NodePort Service集群基础上的,k8s会分配给LoadBalancer;Service一个内部的虚拟IP,并且暴露NodePort。除此之外,k8s请求底层云平台创建一个负载均衡器,将每个Node作为后端,负载均衡器将转发请求到[NodeIP]:[NodePort]。
  

apiVersion: v1  

kind: Service  

metadata:  

name: my-nginx  

spec:  

selector:  

app: nginx  

ports:  

- name: http  

port: 80  
targetPort: 80
  
protocol: TCP
  
type: LoadBalancer
  

  负载均衡器由底层云平台创建提供,会包含一个LoadBalancerIP, 可以认为是LoadBalancer Service的外部IP,查询LoadBalancer Service:
  #kubectl get svc my-nginx

Ingress
  k8s提供了一种HTTP方式的路由转发机制,称为Ingress。Ingress的实现需要两个组件支持, Ingress Controller和HTTP代理服务器。HTTP代理服务器将会转发外部的HTTP请求到Service,而Ingress Controller则需要监控k8s API,实时更新HTTP代理服务器的转发规则;
  

apiVersion: extensions/v1beta1  

kind: Ingress  

metadata:  

name: my-ingress  

spec:  

rules:  

- host: my.example.com  

http:  

paths:  

- path: /app  

backend:  

serviceName: my-app  

servicePort: 80  

  Ingress 定义中的.spec.rules 设置了转发规则,其中配置了一条规则,当HTTP请求的host为my.example.com且path为/app时,转发到Service my-app的80端口;
  #kubectl create -f my-ingress.yaml; kubectl get ingress my-ingress
  NAME     RULE     BACKEND   ADDRESS
  my-ingress    -
  my.example.com
  /app     my-app:80
  当Ingress创建成功后,需要Ingress Controller根据Ingress的配置,设置HTTP代理服务器的转发策略,外部通过HTTP代理服务就
  可以访问到Service;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-432059-1-1.html 上篇帖子: [k8s]jenkins部署在k8s集群 下篇帖子: jenkins + k8s + lnp
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表