k8s(四)service(IPVS,kube-dns,无头服务,集群外部访问)

一、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变了滚定更新,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记录,发现域名已经变化,外部域名变化,集群内部访问不变化域名
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值