k8s实战之Service
一、概述
为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持,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:
targetPort:
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:
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:
targetPort:
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:
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;
k8s实战之Service的更多相关文章
- K8S实战-构建Django项目-03-使用共享存储
上篇博文,发布之后,正好跟着双十一,不知道大家剁手了没~~.好啦,言归正传先声明一下,每周1,3,5更新教程,大家如果想要了解更多的教程可以重温一下之前的教程或者,关注崔格拉斯 公众号,大家想要源码的 ...
- k8s实战之从私有仓库拉取镜像 - kubernetes
1.实战目的 从私有docker仓库拉取镜像,部署pod.上一篇中,我们搭建了私有的镜像仓库,这一篇我们将与k8s结合实战使用私有仓库. 2.登录docker 为了完成本次实战,需要登录docker, ...
- k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡
k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 前言 endpoint kube-proxy userspace 模式 iptables ipvs kernels ...
- k8s实战为aspnetcore.webapi微服务注入配置信息 - kubernetes
1.浅析k8s配置信息 Secret 以密文的形式存储数据,可以用来保存一些敏感信息,例如:OAuth tokens.私钥.密码.数据库连接.事件总线连接等. ConfigMap 以明文的形式存储数据 ...
- k8s实战读书笔记
一.概述 kubernetes中Service是真实应用的抽象,将用来代理Pod,对外提供固定IP作为访问入口,这样通过访问Service便能访问到相应的Pod,而对访问者来说只需知道Service的 ...
- idou老师教你学Istio 14:如何用K8S对Istio Service进行流量健康检查
Istio利用k8s的探针对service进行流量健康检查,有两种探针可供选择,分别是liveness和readiness: liveness探针用来侦测什么时候需要重启容器.比如说当liveness ...
- 六,k8s集群service资源
目录 Service简介 ClusterIP Headless(无头service) NodePort Service简介 service的基本说明: Service 是作用于客户端可服务端(Pod) ...
- k8s实战--redis主从--guestbook
快速入门 实验:通过服务自动发现的redis主从 难点: 1,服务的自动发现,即如何确定coreDNS 已生效 2,redis的主从验证 遇到的问题: 1,Can't handle RDB forma ...
- 05 . k8s实战之部署PHP/JAVA网站
传统部署和k8s部署区别 通常使用传统的部署的时候,我们一个web项目,网站的搭建,往往使用的如下的一种整体架构,可能有的公司在某一环节使用的东西是不一样,但是大体的框架流程是都是差不多的 1111 ...
随机推荐
- 测试数据——有效范围(2)
测试数据库搞好,学习了一下逾期率的官方定义: • 对于某支标,如果某一期没有正常还款,则悲观逾期率=所有未还本金/借款本金: • 对于一批标,悲观逾期率=当前逾期标的所有未还本金/借款本金: • 以3 ...
- 企业防火墙之iptables
1.1 企业中安全优化配置原则 尽可能不给服务器配置外网ip ,可以通过代理转发或者通过防火墙映射.并发不是特别大情况有外网ip,可以开启防火墙服务. 大并发的情况,不能开iptables,影响性能, ...
- MyBatis 作用域和生命周期
理解到目前为止所讨论的类的作用域和生命周期是非常重要的.如果使用不当可导致严重的并发性问题. SqlSessionFactoryBuilder 这个类可以在任何时候被实例化.使用和销毁.一旦您创造了 ...
- WPF按钮删除默认的鼠标悬停效果
<Style x:Key="NormalMouseButton" TargetType="Button"> <Setter Property= ...
- 让你的ASP.NET虚拟主机也支持子网站
现在asp.net虚拟主机一般都可以绑定多个域名,但是通过这几个域名打开的页面都一样.如何使绑的这几个域名分别打开不通的页面(即实现子网站的功能)呢? 其实很简单,只需4个步骤: 1)给虚拟主机 ...
- 关于Windows勒索病毒以及445端口防护
前两天,与这个周末,5月12日起,Onion.WNCRY两类敲诈者病毒变种在全国乃至全世界大范围内出现爆发态势,大量个人和企业.机构用户中招. 与以往不同的是,这次的新变种病毒添加了NSA(美国国家安 ...
- 对IIC总线时序的一点理解以及ACK和NACK(NAK)
参考自:http://blog.chinaunix.net/uid-16100003-id-3059814.html 关于IIC的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都 ...
- 翻页效果实现turn.js
使用插件turn.js实现翻书功能. 看下效果:http://yk.wanxue.cn/2019/01/yd/ 当然第一版做的时候加载很慢很慢,原版插件会把所有图片加载出来再显示页面.很不爽的体验就改 ...
- http 三次握手
1.三次握手 目的:主要规避由于网络阻塞,传输不畅等原因导致服务器端端口一直被占用,无法释放端口资源.(想想假设只要一次就建立连接,服务器响应后浏览器若是没收到数据,等待一段时间后,网络超时,浏览器重 ...
- C语言中连接器介绍
在C语言中.一个重要的思想就是分别编译.即若干个源程序能够在不同的时候单独进行编译.然后在恰当的时候整合到一起.可是连接器通常是与C编译器分离的,连接器怎样做到把若干个C源程序合并成一个总体呢? 典型 ...