Linux企业实战之容器(十六)——Kubernetes(5)

本文深入讲解Kubernetes中Service的概念及作用,包括四种类型:ClusterIP、NodePort、LoadBalancer和ExternalName,以及如何通过域名访问集群资源。同时,探讨了不同模式下Service的工作原理和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 service

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

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

  • service的类型:

    • ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。

    • NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。

    • LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用。

    • ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。

(1) ClusterIP模式

ClusterIP模式是Kubernetes默认的service模式,如果在创建service时不添加模式,则生成的service模式默认为ClusterIP

步骤一:编辑资源清单,创建pod和service

在这里插入图片描述
在这里插入图片描述

kubectl apply -f deployment.yaml           #创建pod
kubectl apply -f service.yaml			   #创建service
kubectl get pod
kubectl get svc

在这里插入图片描述

步骤二:创建一个新的pod来访问,之前创建的pod和service

kubectl run test -it --image=reg.westos.org:5000/busyboxplus

curl 10.244.2.28            #访问pod
curl 10.100.86.173          #访问service

在这里插入图片描述

注意:这里的ClusterIP模式只能在集群内部进行访问,跨节点是不能够进行通信的。

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

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们根据上面查询的宿主机当前的iptables规则可以看到,当前主机上已经存在很多iptables规则了,如果我们继续创建pod和service,那么宿主机上的iptables规则会越来越多,这样会消耗大量的CPU资源。

IPVS模式的service,可以使K8s集群支持更多量级的Pod,可以很好的实现pod的负载均衡

开启kube-proxy的ipvs模式实验

步骤一:在集群的所有节点安装ipvsadm

yum install ipvsadm -y
ipvsadm -l        

在这里插入图片描述
步骤二:修改ipvs模式

kubectl edit cm kube-proxy -n kube-system         #修改集群的kube-proxy模式为ipvs

在这里插入图片描述
在这里插入图片描述
步骤三:删除之前部署kubernetes时,默认创建的kube-proxy的pod,使我们刚刚修改的ipvs模式的pod被自动创建

kubectl get pod -n kube-system
kubectl get pod -n kube-system | grep kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'                                            #删除之前的kube-proxy的pod
kubectl get pod -n kube-system | grep kube-proxy

在这里插入图片描述

在这里插入图片描述

步骤四:在每个节点上查询lvs策略

ipvsadm -l

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

注意:当我们将service修改为ipvs的模式后,iptables上将不会再创建servic的iptables规则,而是在ipvs上创建规则

在这里插入图片描述
在这里插入图片描述

增加pod的副本数,则ipvs会自动增加策略

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(2)NodePort模式

步骤一:直接更改已经创建好的service的type为NodePort

在这里插入图片描述

kubectl edit svc myservice      #更改type        
kubectl  get svc                #查看更改完type的service
kubectl describe  svc myservice

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

步骤二:也可以通过编辑资源清单文件,来创建NodePort模式的service

vim service.yaml

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

kubectl apply -y service.yaml
kubectl get svc

在这里插入图片描述

(3) LoadBalancer模式

LoadBalancer模式,等于是在NodePort的基础上,在外部添加了一个负载均衡调度器

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

步骤一:编辑service的资源清单文件,创建service

vim service.yaml


kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app:  nginx
  type: LoadBalancer

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get pod
kubectl get svc

在这里插入图片描述
在这里插入图片描述

步骤二:查看创建的service的具体信息

kubectl describe svc myservice

在这里插入图片描述
在这里插入图片描述

(4)ExternalName模式

ExternalName模式,是为了让集群来访问外部的资源

步骤一:编辑service资源清单文件,创建service

vim service.yaml

kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
 # port:
 #   - protocol: TCP
 #     port: 80
 #     targetPort: 80
 # selector:
 #   app:  nginx
  type: ExternalName
  externalName: www.baidu.com

kubectl apply -f service.yasml
kubectl get svc

在这里插入图片描述
步骤二:解析域名
在这里插入图片描述
在这里插入图片描述

我们在编辑资源清单时,编辑的 externalName: www.baidu.com,解释域名时,可以在集群内部解析到www.baidu.com,说明集群可以访问集群外的资源

(5)service允许为其分配一个公有IP

步骤一:编辑资源清单文件

vim service.yaml

kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app:  nginx
  externalIPs:
    - 192.168.43.120

kubectl apply -f service.yanl
kubectl get svc

在这里插入图片描述

步骤二:查看service的具体信息,以及测试从指定的外部端口来访问集群

kubectl describe svc myservice

ipvsadm  -ln

curl    192.168.43.120

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

总结:上面所讲述的集中service的模式,其中ClusterIP模式是集群默认的service模式,而NodePort、LoadBalancer模式可以使得集群外部的主机来访问集群内部的资源,而ClusterIP模式只能允许集群内部的不同pod来进行相互访问资源。

2 通过域名来访问集群资源

Kubernetes 提供了一个 DNS 插件 Service

我们上面将servic的几种模式时,都是通过IP来进行访问的,其实Kubernetes里面有DNS插件,我们可以通过域名,也能进行对集群的访问

步骤一:编辑service的资源清单文件,创建service

vim service.yaml

kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app:  nginx
  type: ClusterIP

kubectl apply -f service.yaml
kubectl get svc

在这里插入图片描述

步骤二:创建pod,查看myservice的解析

kubectl attach test -it      #连接我们之前创建好的test这个pod

nslookup myservice           #解析myservcie

在这里插入图片描述

在这里插入图片描述

步骤三:查看Kubernetes为集群提供的DNS服务

kubectl get svc -n kube-system

在这里插入图片描述

  • Headless Service(也称为“无头服务”)

    • Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址;
    • 域名格式:$(servicename).$(namespace).svc.cluster.local

步骤一 :编辑service资源清单文件,创建service

vim service.yaml

kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app:  nginx
  clusterIP: None

kubectl apply -f service.yaml
kubectl get svc

在这里插入图片描述

步骤二:查看创建的service的详细信息,通过pod来检测其地址信息,并且来访问

kubectl describe svc myservice
kubectl attach test -it
nslookup myservice

在这里插入图片描述

在这里插入图片描述

当然也可以使用dig来查看解析

kubectl attach demo -it

dig myservice.default.svc.cluster.local

在这里插入图片描述

在这里插入图片描述

步骤三:pod做滚动更新后,依然可以做解析

vim deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: reg.westos.org:5000/myapp:v2
        ports:
        - containerPort: 80

kubectl apply -f deployment.yaml

在这里插入图片描述

kubectl get pod
kubectl attach demo -it
dig myservice.default.svc.cluster.local

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值