Kubernetes(k8s)-服务(Service)介绍

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

在我们前面讲的工作负载(Deployment,DaemonSet,StatefulSet)有单pod的,也有多pod的,但是我们并没有讲如何访问这些pod,虽然每个pod都有一个独立的ip地址,但是如果要采用负载均衡的同时访问多个pod呢?k8s就给我们抽象一个资源叫做服务Service,简称svc,我们通过访问svc,然后来实现负载均衡访问多个后端,并且还能随着pod的增加或者减少自动调整后端rs。

Service基本概念

在Kubernetes (k8s) 中,Service是一个抽象概念,它定义了一种访问和暴露一组运行在Pods中的应用的方法。Service使得外部访问Pods变得容易,并且为内部集群通信提供了一种稳定的方式,因为Pods可能会被杀死和动态创建。

Service有几种类型,每种类型提供不同的网络特性:

  1. ClusterIP:这是默认的Service类型,它为Service在集群内部提供一个内部的IP地址,这样集群中的其他组件就可以访问它。这个IP地址是集群内部的,外部网络无法访问它。

  2. NodePort:这种类型的Service在ClusterIP的基础上,为Service在每个节点的IP上提供一个静态端口(NodePort)。这样,Service可以通过<NodeIP>:<NodePort>的方式从集群外部访问。NodePort通常在30000-32767之间的范围内分配。

  3. LoadBalancer:这种Service类型在NodePort的基础上,还会请求云提供商的负载均衡器。这个负载均衡器会将外部的流量分发到集群中的Pods。这是让Service能够从互联网上可达的常用方式。

Service通过选择器(Selector)与Pods建立连接,选择器定义了Service要管理的Pods的标签。当一个Service被定义后,它会自动创建一个端点(Endpoints)对象来表示后端的Pods IP地址。

例如,假设你有一组标记为app=myapp的Pods,你可以创建一个Service来选择这些Pods,并为它们提供一个单一的访问点。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

在这个例子中,Service将监听端口80,并将流量转发到标记为app=myapp的Pods的80端口。其中port:80是服务的端口,targetPort: 80是容器的80端口。

图片

但是如果我们没有相匹配的标签的pod,则这个时候svc是无法被访问的,因为它没有对应的后端。

图片

我们通过这个网络插件的iptables实现可以看到没有连接直接被REJECT(拒绝)。

图片

如果我们准备好对应的匹配的pod,则这个svc就会有后端,访问就没问题。​​​​​​​

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: myapp
spec:
  replicas: 3  # 设置你想要维持的Pod副本数量
  selector:
    matchLabels:
      app: myapp  # 定义选择器,用于确定哪些Pod属于此Deployment
  template:  # 这是创建新Pod时使用的模板
    metadata:
      labels:
        app: myapp  # 确保Pod标签与选择器匹配
    spec:
      containers:
      - name: nginx
        image: nginx  # 使用Nginx镜像的特定版本
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80  # 容器监听的端口

图片

    #注意替换自己的ip地址
    [root@master01 ~]# curl -o /dev/null \
    > -s -w "%{http_code}\n" http://10.104.0.217
    200

    Service的存在确保即使后端Pods发生变化,前端客户端也无需知道这些变化,可以继续通过Service访问应用,因为svc会自动调整对后端的访问,实现自动屏蔽pod和增加扩容pod。这对于实现无缝的扩展和动态管理很重要。

    运维小路

    一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

    关注微信公众号《运维小路》获取更多内容。

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值