svc游戏 svc


Service 的概念Kubernetes Service 定义了这样一种抽象:一个 Pod 的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务 。这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector

svc游戏 svc

文章插图

核心迭代在 Kubernetes 集群中,每个 Node 运行一个 kube-proxy 进程 。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式 。在 Kubernetes v1.0 版本,代理完全在 userspace 。在 Kubernetes v1.1 版本,新增了 iptables 代理,但并不是默认的运行模式 。从 Kubernetes v1.2 起,默认就是 iptables 代理 。在 Kubernetes v1.8.0-beta.0 中,添加了 ipvs 代理
在 Kubernetes 1.14 版本开始默认使用 ipvs 代理
在 Kubernetes v1.0 版本,Service 是 “4层”(TCP/UDP over IP)概念 。在 Kubernetes v1.1 版本,新增了 Ingress API(beta 版),用来表示 “7层”(HTTP)服务
猜想:为什么不擦爱用更为传统的 DNS 实现负载均衡?
1、userspace代理模式
svc游戏 svc

文章插图

2、iptables代理模式
svc游戏 svc

文章插图

3、ipvs代理模式
注意: ipvs 模式假定在运行 kube-proxy 之前在节点上都已经安装了 IPVS 内核模块 。当 kube-proxy 以 ipvs 代理模式启动时,kube-proxy 将验证节点上是否安装了 IPVS 模块,如果未安装,则 kube-proxy 将回退到 iptables 代理模式
svc游戏 svc

文章插图

Service 的类型
  • ClusterIp:默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP
  • NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过 <NodeIP>: NodePort 来访问该服务
  • LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到<NodeIP>: NodePort
  • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用 。没有任何类型代理被创建,这只有 kubernetes 1.7 或更高版本的 kube-dns 才支持
ClusterIP
svc游戏 svc

文章插图

为了实现图上的功能,主要需要以下几个组件的协同工作:
  • apiserver:用户通过 kubectl 命令向 apiserver 发送创建 service 的命令,apiserver 接收到请求后将数据存储到 etcd 中
  • kube-proxy:kubernetes 的每个节点中都有一个叫做 kube-porxy 的进程,这个进程负责感知service,pod 的变化,并将变化的信息写入本地的 ipvs 规则中
  • ipvs:基于内核的钩子函数机制实现负载
创建myapp-deploy.yaml文件
[root@master manifests]# vim myapp-deploy.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: myapp-deploynamespace: defaultspec:replicas: 3selector:matchLabels:app: myapprelease: stabeltemplate:metadata:labels:app: myapprelease: stabelenv: testspec:containers:- name: myappimage: wangyanglinux/myapp:v2imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80创建Service信息
[root@master manifests]# vim myapp-service.yamlapiVersion: v1kind: Servicemetadata:name: myappnamespace: defaultspec:type: ClusterIPselector:app: myapprelease: stabelports:- name: httpport: 80targetPort: 80Headless Service时不需要或不想要负载均衡,以及单独的 Service IP。遇到这种情况,可以通过指定 Cluster IP ( spec.clusterIP ) 的值为 “ None ” 来创建 Headless Service。这类 Service 并不会分配 Cluster IP,kube-proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。