k8sservice

Posted S4061222

tags:

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

一、Service简介

Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡

service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

service的类型

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

二、IPVS模式下的Service

(1)Service 是由 kube-proxy 组件,加上 iptables 来共同实现的.

(2)kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。

(3) IPVS模式的service,可以使K8s集群支持更多量级的Pod

实验环境:

启动仓库

安装ipvsadm 软件,server2,3,4同样操作

server2,3,4同样操作


查看配置信息

server2中开启 kube-proxy 的 ipvs 模式,编辑ipvs模式到k8s配置中

编辑配置信息,指定使用 ipvs 的模式,不写时默认用的是 iptables

修改完信息之后,需要重载,批量删除副本后才可生效

重启之后,此时在每个结点上都可以看到 iptables 策略

查看svc

执行deploayment清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1


查看mysvc的详细信息

cat svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:

  - protocol: TCP
    port: 80
    targetPort: 80
      selector:
    app: myapp

kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod

访问任意服务svc,可查看到访问次数

查看调度的次数,而且ip addr(server2,3,4)也可以看到这个ip(10.109.18.244)
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP(自行ip addr查看)

ip由集群分配,负载均衡(默认nat)

三、Service实现集群外部访问

1. NodePort(第一种)


ClusterIP(集群内部)修改为 NodePort

查看svc,由ClusterIP变化为NodePort

NodePort方式:su主机直接开启端口,不是策略,还是负载均衡,ClusterIP基础上加上端口

master端和node端都会将端口暴露出来



由于端口被暴露出来,外部在访问时需要指定端口来访问,负载均衡

kube-dns

k8s内内置dns解析服务,用于实现域名访问,可以查看到mysvc的分配ip



原因:dns的两个服务coredns(mysvc服务名称解析)

kube-dns服务的端口53

可以查看kube-dns详细信息,看到Endpoints,dns端口为53

查看域名解析pod节点信息如 ip

kubectl -n kube-system get pod -o wide

测试访问IP

无头服务

  • 不需要分配vip,直接dns记录的方式解析出被代理,通过域名访问
  • 域名格式:$(servicename).$(namespace).svc.cluster.local
  • Pod滚动更新后,依然可以解析


拉起容器,查看svc信息,发现没有ClusterIP


进入容器终端查看解析,可以直接访问服务名

重新执行清单 deployment.yaml 生成 myapp:v1 版本的pod(此处可不用重启pod)

退出容器并删除demo


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


dig后是pod地址,轮询



查看pod的地址

版本更新(v1-v2)
滚定更新,ip变了
执行清单

可以看到解析的地址已经变化

对应pod的地址

mysvc的后端查看到pod地址

2. Loadbalancer(第二种)

在 nodeport的基础之上,从云端来分配一个 IP;此处没有云端时会一直处于 <pending> 的状态。

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

创建项目metallb,将metallb两个镜像压入harbor仓库 hyl.westos.org 中


修改kube-proxy的配置:
ipvs模式strtctARP为true

每个节点一个proxy,删除后生效

创建操作目录并进入,修改与私有云对接的 metallb.yaml 文件,


删除副本重建后生效
查看metallb-system节点,每个节点一个(server2为controller)

namespaces已经增加了metallb-system

自动生成secrets memberlist,查看

编辑配置 configmap.yaml 文件,定义地址池

查看到cm中的配置信息已读取

创建一个svc(lb-svc)进行测试,之前实验的svc删掉


执行lb-svc.yaml并查看svc,可以看到分配到了前面定义的10-20之间的IP,此处为172.25.28.10

集群外部访问分配的IP实现负载均衡

ipvsadm -ln发现在server4主机中出现了轮询

server2,3,4中的kube-ipvs0中已经写入此ip

3. ExternalIP(第三种不常用)

需要外部添加IP到网卡中才可生效(直接锁定一个ip,ClusterIP 基础上+ip)

管理员自己指定,需要add ip到eth0网卡,原因找不到mac地址,不知道到那个主机

cat exc-ip.yaml

apiVersion: v1
kind: Service
metadata:
  name: ex-service
spec:
  selector:
    app: myapp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  externalIPs:
  - 172.25.28.100  

拉起服务成功后,表示已经将访问策略写到了node结点上,如果需要访问测试,还需要添加临时IP

ip addr add 172.25.0.100/24 dev eth0

外部访问:

curl 172.25.28.100

4. ExternalName(第四种)

解析域名,无后端,无 ClusterIP
外部域名变化,集群内部访问不变化域名

编辑 ex-svc.yaml 文件

执行清单后,查看此服务my-service,发现无 ClusterIP ,外部域名为 www.westos.org

重新拉起一个demo容器,可以看到此服务的ip为10.96.0.10

dig查看详细解析A记录
可以解析此域名

编辑my-service,修改域名为www.baidu.com

查看svc信息发现域名已经变化

再次dig查看详细解析A记录,发现域名已经变化,外部域名变化,集群内部访问不变化域名

以上是关于k8sservice的主要内容,如果未能解决你的问题,请参考以下文章

k8sService资源

K8SService服务详解,看这一篇就够了!!

k8sService代理模式之IPVS模式无头服务发布service五种类型Fannel原理及Flannel vxlan类型

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js