大家好,我是Zhan,一名个人练习时长一年半的大二后台练习生

这篇文章是学习 Kubernetes第五篇学习笔记

假如有不对的当地,欢迎各位指正

与君同舟渡,达岸各自归


引语

在上篇文章【云原生 • Kubernetes】(四) k8s 本来不是直接创立 Pod!! – ()中,我们解说了 Kubernetes 中 四种Controller 的运用,了解到了,是 Controller 让 Pod 有了 运维的才能 以及更好的 办理,不过在文章末尾处我也提到了:Pod 无法供给网络服务、以及完成负载均衡,因此为了让 Pod 供给对外的网络拜访,本文将会解说 Service

  • 什么是 Service 以及 Service 的效果与特性
  • Service 与 Pod 之间又是什么样的联系
  • 怎么运用和装备 Service
  • Service 有哪些类型

1️⃣ 什么是 Service

官网地址:kubernetes.io/zh-cn/docs/…

1.1 界说

官网给出的界说是:Service 是 将运行在一个或一组Pod上的网络运用程序揭露为网络服务的办法

浅显来讲,Service 是为 Pod 供给网络服务的一种办法

1.2 为什么需求 Service

在上文中我们也提到了,仅仅靠控制器无法供给网络服务,假如一组 Pod(例如 MySQL) 为集群内的其他的 Pod(Java) 供给服务,那么 Java 怎么找到 MySQL 的 IP 地址,假如 MySQL 具有多个副本,又当怎么呢?

【云原生 • Kubernetes】(五)学了这么久的 Kubernetes 终于可以访问 Pod 了!!

有点类似于 SpringCloud 中的 注册中心,front pod 无需关怀它们调用了哪个 backend pod,假如 backend pod 发生了何种改变,也无需 front pod 知情,Service 界说的笼统能够做到这种解耦。

1.3 Service 与 Ingess 的差异

ServiceIngressKubernetes 中用于办理和揭露运用程序的两个重要概念,它们有着不同的效果和功能。

  • Service 是 Kubernetes 中的一种笼统,Service 答应运用程序内部的各个组件(Pod)能够经过Service称号和端口号来相互通讯,而不需求直接露出Pod的IP地址。
  • Ingress 是 Kubernetes 中的一种资源对象,Ingress能够将外部的HTTP恳求路由到 Kubernetes 集群内部的Service,然后完成从集群外部拜访运用程序的才能
  • 简而言之:
    • Service 用于在Kubernetes 内部 办理和拜访运用程序的不同组件
    • Ingress 用于从集群 外部 揭露运用程序的路由和拜访办法
  • 一般情况下,Ingress会运用一个反向代理来处理外部的恳求,并将其转发到相应的Service上

2️⃣ 特性

  • Pod 经过 Label 与 Service 进行关联。这与 Controller 中的 Selector 一样,经过标签进行挑选。
  • Service 生命周期与 Pod 无关,不会由于 Pod 的重新创立而改变 IP。无论 Service 关联的 Pod 怎么增缩,它的 IP 都不会改变。
  • Service 供给了一种逻辑上的稳定网络端点,它能够将 恳求负载均衡 到后端的多个Pod实例上,然后完成运用程序的高可用性和扩展性。
  • 能够对集群外部供给拜访端口。仅仅方便测验,在上面我们说的是一般运用情况,一般我们不会这么去用。
  • 集群内部能够经过服务姓名进行拜访,不需求直接露出Pod的IP地址。

3️⃣ 运用 Service

3.1 装备文件

apiVersion: apps/v1
kind: Deployment  
metadata:  
  name: nginx  
  labels:  
    app: nginx  
spec:  
  replicas: 3  
  template:  
    metadata:  
      name: nginx  
      labels:  
        app: nginx  
    spec:  
      containers:  
        - name: nginx  
          image: nginx:1.7.9  
          imagePullPolicy: IfNotPresent  
          ports:  
            - containerPort: 80  
      restartPolicy: Always  
  selector:  
    matchLabels:  
      app: nginx  
---  
apiVersion: v1  
kind: Service  
metadata:  
  name: nginx  
spec:  
  # 经过标签进行挑选
  selector:  
    app: nginx  
  ports:  
	  # Service 的端口
    - port: 80  
	  # Pod 的端口,也就是 Container 中运用服务的端口
      targetPort: 80  
      # 露出外部服务的端口,假如不写会自动分配,固定在 30000-32767 
      nodePort: 30080  
      # 通讯协议:TCP / UDP
      protocol: TCP  
  # Service 的类型,NodePort 代表揭露NGINX运用程序
  type: NodePort

3.2 装备解释

在spec部分:

  • selector 指定了Service将路由到具有标签 app: nginxPod
  • ports 界说了Service的端口装备,这儿将容器端口 80 映射到 Service 的端口 80。一同指定了 NodePort30080,表明该 Service 将在一切节点上的30080端口上揭露。
  • protocol 设置为 TCP,表明运用 TCP协议 进行通讯。
  • 最后,Service的 type 设置为 NodePort,表明运用NodePort类型的Service来揭露NGINX运用程序。

3.3 测验运用

至此,成功创立好一个 Service,我们能够做到:

  • 在同一个命名空间下的其他容器,能够经过 curl Service的IP:port 拜访到 Pod 的 targetPort
    • 查看 Service 的 IP 的办法:kubectl get services -o wide
    • 能够创立一个 busybox:1.28 去进行测验,运用指令 wget Service的IP:80,就能够拉取到 index.html
  • 在容器外部拜访该Service对应的Pod,能够拜访 节点IP:NodePort 拜访到 Nginx 的 Index.html
    • 查看 Pod 在哪个结点上:kubectl get pods -o wide,拿到该节点地点的服务器的公网 IP
    • 浏览器拜访:http://节点IP:30080 就能够拜访到 index.html

3.4 负载均衡

为了验证拜访 Service 是否会有负载均衡,我们别离进入这三个容器:

  • 修正它们的 Index.html 别离为:Nginx-01、Nginx-02、Nginx-03
  • 然后在某个节点不断的运用指令拜访:curl Service的IP:port,这儿我们能够看到他们三者都会出现

4️⃣ 类型 type

上文中我们演示的类型为:NodePod,表明运用NodePort类型的Service来揭露NGINX运用程序。而 type 其实有四种类型:

  • ClusterIP : 在集群内部露出 Service,只能被集群内部的其他对象拜访,一般用于内部服务发现,不会向集群外部拜访。
    • 比如在一个 Web 运用中,你或许需求连接到一个数据库,但是这个数据库并不需求在运用之外露出,这时就能够运用 ClusterIP 类型的 Service,让运用能够拜访到数据库。
  • NodePort : 将 Service 露出在 Node 的某个端口上,然后能够经过 Node 的 IP 和 端口号来拜访 Service,一般用于开发和测验环境
  • LoadBalancer : 经过云服务供给的负载均衡器来将 Service 露出到公网上,使得外部用户能够拜访 Service
    • 适用于需求将运用程序揭露给公共互联网,或许需求经过云平台供给的负载均衡器来处理流量分发的情况。
  • ExternalName : 将 Service 映射到一个 DNS 称号上,然后能够经过 DNS 称号来拜访 Service,一般用于外部拜访服务
    • 适用于需求将Service称号解析为外部DNS称号的情况,例如连接到集群外部的数据库或其他服务。

总结

为了处理 Controller 无法供给网络服务、以及完成负载均衡的问题,Service 应运而生,完成了 Pod 之间的通讯,经过Service称号和端口号来相互通讯,而不需求直接露出Pod的IP地址,与 Ingress 之间的差异也要记住,Controller 是 内部 办理和拜访运用程序的不同组件,Ingress 是 外部 揭露运用程序的路由和拜访办法。


友链

  • ChatGPT
  • 【编程不夫君】Kubernetes(k8s)实战教程
  • 【Kubernetes文档】| Kubernetes 官方文档
  • 【云原生 • Kubernetes】(一) 初识 Kubernetes – ()
  • 【云原生 • Kubernetes】(二) Kubernetes 的组件与架构 – ()
  • 【云原生 • Kubernetes】(三) k8s 怎么运行 Container? – ()
  • 【云原生 • Kubernetes】(四) k8s 本来不是直接创立 Pod!! – ()

✒ 写在最后

都看到这儿啦~,给个点赞再走呗~,也欢迎各位大佬指正以及补充,在评论区一同交流,共同进步!也欢迎加微信一同交流:Goldfish7710。我们明天见~

【云原生 • Kubernetes】(五)学了这么久的 Kubernetes 终于可以访问 Pod 了!!