service服务

  • 一.前言
    • (1)、service简述
    • (2)、service类型
  • 二、IPVS服务
    • (1)、简介
    • (2)、使用
  • 三、service外部访问方式
    • (1)、NodePort
    • (2)、LoadBalancer
    • (3)、configmap文件设置ip分配
    • (4)、ExternalName

一.前言

(1)、service简述

Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

(2)、service类型

service的类型:ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个  NodeIP:nodePort都将路由到ClusterIP。LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用。ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过spec.externlName 设定

二、IPVS服务

(1)、简介

此服务是由每个节点的 kube-proxy 组件,加上 iptables 来共同实现的。kube-proxy 调用物理机中 iptables 的地址转发功能处理service,有一个service就会写入一个 iptables 规则,一旦宿主机有大量的pod,需要写入很多规则,这会消耗大量cpu资源,不理想。如果开启lvs的负载均衡,使用一个虚拟ip,这样会不写入iptables规则了,可以支持更多量级的Pod。

(2)、使用

ipvsadm就是lvs均衡负载的服务支持
1、查看,安装组件
集群中的每个服务器都要查看是否具有ipvsadm模块

 lsmod | grep ip_vs   查看是否有此服务yum install -y ipvsadm   木有的话可以下载此程序touch /etc/sysconfig/ipvsadm  ipvs启动需要手动简历文件kubectl -n kube-system get pod | grep proxy               图1、查看组件是否运行kubectl -n kube-system get pod -o wide| grep proxy        图1、查看组件是否进行

图1、发现当前集群是通过proxy服务进行的

kube-system命名空间里cm里面存放着系统配置文件

2、更改名为kube-proxy的cm配置文件
在主节点修改系统配置文件模式为ipvs

[root@server2 pod]  kubectl edit cm kube-proxy -n kube-system


虽然更改了配置文件,但是发现ipvs的策略并没有启动

3、更新kube-proxy pod
删除之前的pod会自动重建,重建后的pod会生效刚才修改的配置

kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'


此时宿主机的ipvs策略已经生效已经具备了均衡调度的功能

4、开启控制副本,启动容器,并基于svc服务

[root@server2 pod] mkdir ipvs
[root@server2 pod] cd ipvs/
[root@server2 ipvs] kubectl  apply  -f deployment.yml           %开启pod
[root@server2 ipvs] kubectl  apply  -f svc.yml                         %分配虚拟ip分配[root@server2 ipvs] cat deployment.yml
//
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: myapp:v2
/[root@server2  ipvsl] cat mysvc.yaml
//
apiVersion: v1
kind: Service
metadata:name: mysvc                                                         此svc的名称叫mysvc
spec:ports:- protocol: TCPport: 80                                                          暴露80端口targetPort: 80                                                    暴露80端口selector:app: nginx                                                        选择标签为nginx的容器开启svc服务,暴露外部访问端口
//

5、查看虚拟ip的信息

[root@server2 ipvs] kubectl describe svc mysvc         图1、查看到svc服务
[root@server2 ipvs] ipvsadm -ln                        图2、查看ipvs服务
[root@server2 ipvs] ip a                               图1、查看网卡

图1、可以发现开启了虚拟vip,还有暴露出了容器的80端口

图2、可以发现lvs服务也用这个调度策略

图3、查看网络设置可以发现在宿主机上添加了一个虚拟网卡:kube-ipvs0,并且找到了刚才分配的svc服务的虚拟ip

6、对暴露端口的虚拟vip进行访问测试
结果发现实现了容器的均衡负载

三、service外部访问方式

(1)、NodePort

NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP: nodePort都将路由到ClusterIP
1、新建svc文件,设置nodeport节点
(上个实验的deployment控制器仍然运行)

[root@server2 ipvs]# kubectl delete -f mysvc.yaml
[root@server2 ipvs] kubectl apply -f svc.yaml [root@server2 pod] cat  svc.yaml
//
apiVersion: v1
kind: Service
metadata:name: svc                                    名字改为svc
spec:ports:- nodePort: 30175                        设置端口为30175port: 80protocol: TCPtargetPort: 80selector:app: nginxsessionAffinity: None                   在此修改访问类型为NodePort type: NodePort 

2、编译svc的配置文件,发现svc文件已经修改类型为NodePort

[root@server2  ipvs] kubectl edit svc svc

3、查看svc的信息
可以看到mysvc的外部访问端口是NodePort类型,将主机的30175映射到svc服务的80端口

[root@server2 control] kubectl get svc                           图1
[root@server2 control] netstat -antlp | grep 30175               图1

图1、发现开启了pod的虚拟ip,也开启了本地的30175端口。

4、访问测试
访问任意一个节点IP+节点端口都将路由到ClusterIP,可以实现外部的访问。并且访问方式是均衡负载的。

5、新建一个容器,进入查看解析
发现自动对svc进行了DNS解析

6、查看svc的dns解析信息
发现此svc虚拟ip与上图的虚拟ip相同

可以查看kube-dns这个服务的后端就是两个core-dns,作地址解析的

(2)、LoadBalancer

从外部访问 Service 的第二种方式,适用于公有云上Kubernetes 服务。这时候,你可以指定一个 LoadBalancer 类型的 Service。

负载均衡由service提供
公有云提供ip分配

在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端。

1、更改配置文件
修改系统的配置文件,开启云端调度服务

[root@server2 control] kubectl edit configmap -n kube-system kube-proxy
[root@server2 control] kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'    修改后刷新生效


2、上传镜像至harbor,部署metallb服务
获取镜像文件,和一个yaml文件

wget https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
wget https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml


3、更改获取的metallb.yaml文件
搜索image,将文中多处的image更换为下图的镜像

[root@server1 metallb] kubectl  apply  -f metallb.yaml

4、查看情况服务

[root@server2 metallb] kubectl get ns                               图1
[root@server2 metallb] kubectl -n metallb-system get all            图2

图1

图2、云端控制的pod

(3)、configmap文件设置ip分配

ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。

1、编写应用configmap.yaml文件

[root@server2 metallb] vim configmap.yaml//
apiVersion: v1
kind: ConfigMap
metadata:namespace: metallb-systemname: config
data:config: |address-pools:- name: defaultprotocol: layer2addresses:- 172.25.42.10-172.25.42.20              设置ip分配范围
//[root@server2 metallb] kubectl apply -f configmap.yaml

2、编写、应用svc文件
这里取名叫lb-svc.yaml

[root@server2 metallb] cat lb-svc.yaml apiVersion: v1
kind: Service
metadata:name: lb-svc
spec:ports:- name: httpport: 80targetPort: 80selector:app: nginxtype: LoadBalancer                       方式为负载均衡
//[root@server2 metallb]# kubectl apply -f lb-svc.yaml

3、查看信息
此策略已生效

此时分配的外部端口为172.25.42.11

4、访问测试,发现负载均衡,实现了云服务调度

[root@server1 metallb] kubectl  apply  -f lb-svr.yml
service/lb-svc created
[root@server1 metallb] curl 172.25.3.11
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server1 metallb] curl 172.25.3.11/hostname.html
nginx-deployment-6456d7c676-ldq7x
[root@server1 metallb] curl 172.25.3.11/hostname.html
nginx-deployment-6456d7c676-rlhkv
[root@server1 metallb] curl 172.25.3.11/hostname.html
nginx-deployment-6456d7c676-7zhl5

在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端。

(4)、ExternalName

从外部访问的第三种方式叫做ExternalName
ExternalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,可以提供集群内的名字,也可以指定外部真实域名。
将集群的虚拟ip转换为另一个域名,并且给这个域名一个ip,使得外部可以通过访问这个ip访问到集群的容器。
1、简历hostyml文件
指定暴露给外部的域名

[root@server1 ipvs] kubectl  apply  -f host.yml
[root@server1 upvs] cat host.yml /
apiVersion: v1
kind: Service
metadata:name: my-service
spec:type: ExternalNameexternalName: test.westos.org               指定外部的域名为test.westos.org
///


2、查看解析过程
进入容器查看到当前的DNS解析地址

通过dig命令查看一下解析过程
当查找服务时,群集DNS服务返回 CNAME 记录,其值为 www.westos.org。 访问 my-service 的方式与其他服务的方式相同,但主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发。
发现其进行了地址转换,将其服务的地址转换为test.westos.org

3、设置外部访问端口
service允许为其分配一个公有IP,注意 k8s的externalIPs只是提供了给了一个外部访问的ip,但如果没有pod开放对应接口是无法获取到内容的,因此需要与实际pod相对应。

vim ex-service.yaml apiVersion: v1
kind: Service
metadata:name: ex-service
spec:selector:app: nginxports:- name: httpprotocol: TCPport: 80targetPort: 80externalIPs:- 172.25.42.100

4、外部访问
首先在宿主机上能够能查看到外部的虚拟ip

在真机上可以实现对外部对集群内容器的均衡访问

【项目实战19】k8s(5)—service服务(IPVS均衡负载)相关推荐

  1. 实战演示k8s部署go服务,实现滚动更新、重新创建、蓝绿部署、金丝雀发布

    1 前言 本文主要实战演示k8s部署go服务,实现滚动更新.重新创建.蓝绿部署.金丝雀发布 2 go服务镜像准备 2.1 初始化项目 cd /Users/flying/Dev/Go/go-lesson ...

  2. k8s之service服务(微服务)

    一.service介绍 Service可以看作是一组提供相同服务的Pod对外的访问接口.借助Service,应用可以方便地实现服务发现和负载均衡. service默认只支持4层负载均衡能力,没有7层功 ...

  3. GRPC在k8s中的服务发现和负载均衡_traefik-ingress

    grpc一般都是内部服务调用,在k8s集群中进行服务发现和负载均衡的方式我所知道的有三种: 一.直接service nodepod方式部署,缺点就是会占用宿主机port,服务多起来,团队大起来的时候, ...

  4. 【SSH网上商城项目实战19】订单信息的级联入库以及页面的缓存问题

    购物车这一块还剩最后两个问题,就是订单信息的级联入库和页面缓存,这里的信息是指购物车和购物项,即我们将购物车的信息存入数据库的同时,也存入每个购物项的信息,而且外键都关联好,这涉及到了Hibernat ...

  5. 高并发部署策略 多副本服务+nginx均衡负载

    多副本web服务 单个flask服务封装的模型推理,在单机上支持的并发连接请求数量无法满足要求,压测为300左右的数量级别,压测代码如下: 通过客户端传输base64字节流到服务端处理,返回抠图结果 ...

  6. 2019最新《传智教育黑马java项目实战》

    1.SE基础班 1-1 Java基础语法 1-2 面向对象和封装 1-3 常用API第一部分 1-4 继承与多态 1-5 常用API第二部分 1-6 集合 1-7 异常与多线程 1-8 File类与I ...

  7. 从零开始入门 | Kubernetes 中的服务发现与负载均衡

    作者 | 阿里巴巴技术专家  溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...

  8. DNS+Anycast 均衡负载实战(IPV4)

    DNS+Anycast 均衡负载实战(IPV4) 我们都知道google的公共DNS为:8.8.8.8,甚至我们可以在全球任何地方都能ping通这个IP或者通过dig能解析域名,例如如下操作: # d ...

  9. k8s service服务发现详解:ipvs代理模式、服务类型

    目录 k8s服务发现Service 理解 Service的实现模型 userspace代理模式 iptables代理模式 ipvs代理模式 Service定义 Service配置清单重要字段 创建Cl ...

最新文章

  1. 关于学习Python的一点学习总结(23->跳出循环)
  2. 华为与思科VRRP协议
  3. 浅析网站内链优化如何营造良好的内链生态环境?
  4. 兼容Mono的下一代云环境Web开发框架ASP.NET vNext
  5. 事件触发控制_前端性能优化:事件的节流throttle与防抖debounce
  6. WinForm学习笔记(2)
  7. 限制CheckBoxList控件只能单选
  8. xmselect重新渲染_Layui使用总结及多选方案Xm-select
  9. 哪句诗词最让你怦然心动?
  10. JavaScript的for of语法遍历数组元素
  11. python内置函数sorted()
  12. 计算机网络(2.11)物理层- 宽带接入技术-光纤同轴混合网 (HFC网)
  13. resetuser.php,帝国CMS-管理员密码重置插件
  14. js 幻灯片放映图片_如何制作数据库驱动的首页幻灯片放映
  15. 144hz和60hz测试软件,144hz和60Hz显示器的区别有哪些?60Hz与144Hz显示器玩游戏差别对比评测...
  16. String工具类(半角-全角转换)
  17. C++入门实现黑客攻击系统(准备工作)
  18. 【数据库】【课程设计】商品销售信息管理系统设计
  19. 用条码标签打印软件批量打印照片
  20. 高驰涛——裸奔到北京的程序猿

热门文章

  1. matlab模糊工具箱使用,MATLAB中模糊神经网络工具箱的使用 - 全文
  2. matlab模糊控制图怎么导出_使用MATLAB生成模糊控制的离线查询表
  3. wireshark抓包
  4. 通过外国在线调查网站clixsense挣取第一桶美金!
  5. 《 QT5.9 c++ 开发指南》各种常见图表的绘制(一个例子让你不再担心表图的绘制)
  6. hover在两种情况下的两种用法
  7. 为什么C标识符不能以数字开头
  8. @PersistenceContext 注解在spring中代理
  9. 电磁感应、电感与变压器
  10. 用Python编写代码来理解赢得《英雄联盟》游戏的胜利的最重要因素