Linux企业运维——Kubernetesservice

Posted 是大姚呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux企业运维——Kubernetesservice相关的知识,希望对你有一定的参考价值。

Linux企业运维——Kubernetes(六)service

1、service简介

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

Service的类型:

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

2、IPVS模式的service

  • Service 是由 kube-proxy 组件,加上 iptables 来共同实现的.
  • kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的iptables
    规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
  • IPVS模式的service,可以使K8s集群支持更多量级的Pod。

所有节点都先安装IPVS

yum install -y ipvsadm //所有节点安装ipvs

server2、3、4分别查看ipvs模式



修改模式为ipvs模式


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

查看当前连接情况,可以看到mysvc的访问地址是10.103.165.189,不过没有后端pod

编辑deployment.yaml,将副本数置为3

读取应用该文件,现在有3个pod

查看mysvc的详细内容,可以看到后端pod有3个

再次查看当前连接情况,可以看到现在mysvc有3个pod
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod。

测试访问该服务6次

可以看到每次访问以轮询的方式分配给每一个pod,因为每个pod的权值相同,所以分别响应了2次

3、实现外部访问

3.1、NodePort方式

server1启动harbor

server2查看mysvc详细信息,并测试访问

编译mysvc的配置文件,修改类型为NodePort

可以看到修改成功,开放的端口是30017

node节点也可以看到该端口处于监听状态


使用真实主机访问服务,可以看到来自三个后端轮询应答

查看pod列表,可以发现轮询应答正是来自这3个pod

进入容器中并查看mysvc服务的dns解析

显示kube-system的pod,看到两个coredns
查看kube-system的svc,服务端口为53

查看kube-dns服务详细信息,有两个后端pod,对比一下ip可以发现,就是刚才的两个coredns

3.2、Headless无头模式

以DNS记录的方式解析出被代理Pod的IP地址,不需要通过Ip地址访问,可直接访问服务名称

查看所有的pod并显示标签

编辑headless.yaml文件

应用配置,可以看到新创建了一个nginx-svc的服务

查看nginx-svc服务的域名解析,可以看到对应三个负载均衡服务器,测试访问,三个ip轮询应答

安装dig插件用以查看解析的A记录

使用下图命令,查看10.96.0.10服务的A记录


编辑deployment.yml配置文件,将myapp的镜像版本改为v2

应用配置文件

再次使用Dig命令查看A记录解析,有三个应答ip

查看ngix-svc服务详细信息,后端pod对应刚才三个应答的ip

3.3、LoadBalancer模式

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

首先,更改kube-proxy配置

server2删除之前的kube-proxy

在harbor仓库中新建metallb项目

server1导入metallb镜像,然后上传至仓库

在网页上可以看到上传完成

真实主机获取metallb压缩文件及yaml配置文件

将metallb压缩文件发送给server1,将metallb.yaml配置文件发送给server2

修改yaml配置文件中speaker和controller的镜像路径


server2完成配置并应用

查看所有命名空间,看到metallb-system

查看metallb-system空间的所有信息,看到一个controller和三个speaker

编辑configmap.yaml文件,指定分配的IP地址范围

配置完成并应用,查看metallb-system的ConfigMap


编辑lb-svc.yml 文件,建立svc并获取分配的ip

完成并应用配置,查看服务,可以看到lb-svc服务,ip地址是我们之前配置的范围里的

真实主机测试访问,可以看到负载均衡

3.4、ExternalName方式

externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,可以提供集群内的名字,也可以指定外部真实域名。

清理之前的lb-svc.yml配置文件,可以看到lb-svc服务已经删除

编辑ex-svc.yaml文件

查看my-service服务,看到对应的外部地址是www.westos.org

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

kubectl edit svc my-service进入my-service配置,将externalName改为www.baidu.com

再使用dig查看解析,看到CNAME记录变成www.baidu.com

以上是关于Linux企业运维——Kubernetesservice的主要内容,如果未能解决你的问题,请参考以下文章

Linux企业运维高效技巧心得及分享

Linux企业运维——Kubernetesingress服务

Linux企业运维——DockerRegistry仓库

Linux企业运维——KubernetesPod资源清单

Linux运维是什么?行业前景如何?

Linux企业运维——KubernetesPod生命周期