k8s 五之service

什么是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 设定)

IPVS模式的service

为什么要开启 kube-proxy 的 ipvs 模式?

  • Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。
  • kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
  • IPVS模式的service,可以使K8s集群支持更多量级的Pod。
开启kube-proxy的ipvs模式:
1.yum install -y ipvsadm              #所有节点安装
2.kubectl edit cm kube-proxy -n kube-system    #修改IPVS模式
  mode: "ipvs"
3. kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'  #更新kube-proxy pod
4. ipvsadm -ln                        #查看ipvs策略

server2、server3同下
在这里插入图片描述
开启ipvs
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
更新kube-proxy pod,相当于重启这个服务。
在这里插入图片描述
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod。
在这里插入图片描述

创建service的方式

ClusterIP方式

vim service-example.yaml
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
  selector:
    app: nginx
  type: ClusterIP
kubectl create -f service-example.yaml

其实默认方式就是ClusterIP 代码如下
vim Deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1

发现TYPE为ClusterIP
在这里插入图片描述
在这里插入图片描述

无头服务方式

什么是无头服务?

  • Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。
  • 域名格式:$(servicename). $(namespace) .svc.cluster.local
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: myapp
  ports:
 - protocol: TCP
    port: 80
    targetPort: 80
  clusterIP: None    

在这里插入图片描述
没有 clusterip 但是有后端,靠域名访问。
在这里插入图片描述
解析出后端地址。更新回滚的的时候后端可能会变,而域名不变,我们访问域名。
在这里插入图片描述

外部访问service的三种方式

NodePort方式

vim service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: nginx
  type: NodePort  

在这里插入图片描述
在这里插入图片描述
通过主机ip+端口访问,可以从集群外部访问任何一个节点,还可以实现负载均衡。
在这里插入图片描述
测试dns解析(注意如果busybox版本不对则无法正常解析)即当后端发生变化时域名不变
在这里插入图片描述
换一个版本就好了;名字不写全时会自动加后缀
在这里插入图片描述
当后端更新时
在这里插入图片描述
在这里插入图片描述
这是更新后的后端ip
在这里插入图片描述
虽然后端ip发生变化,但是解析到的服务ip没有发生变化
在这里插入图片描述

LoadBalancer方式

  • 从外部访问 Service 的第二种方式,适用于公有云上的 Kubernetes 服务。这时候,你可以指定一个 LoadBalancer 类型的 Service。
  • 在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端。
    在这里插入图片描述
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: myapp
  ports:
 - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

ExternalName方式

  • 从外部访问的第三种方式叫做ExternalName
  • service允许为其分配一个公有IP(见绑定一个公网ip处)
apiVersion: v1
kind: Service
metadata:
  name: exsvc
spec:
  type:  ExternalName
  externalName: www.baidu.com
------
apiVersion: v1
kind: Service
metadata:
  name: ex-service
spec:
  selector:
    app: myapp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalIPs:
    - 192.168.1.100

在这里插入图片描述
在这里插入图片描述
解决报错,dig成功。
在这里插入图片描述
访问域名相当于访问百度,用于集群内部访问外部资源,当外部资源经常改变时,我们仍访问域名。
在这里插入图片描述
绑定一个公网ip
在这里插入图片描述
在这里插入图片描述
访问成功
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值