Day08-Kubernetes 那些事 -Service 篇

前言

在前面的文章讲完了 Pod 後接下来就要讲讲如何正确的连接到 Pod ,其实连接到 Pod 有两种方式,一种是建立 Service 另一种是用 port-forward ,接下来的文章就来好好谈谈这两种方法吧!

port-forward

port-forward 简单来说就是把 host 上的某个 port 连线至 Pod 的对外 port ,就好像我们在用 Docker 跑一个 container 的时候会下 -P 这个参数来连结机器与 container 的 port 一样,只是这边是连到 Pod 而已。

方法也很简单只要在终端机下 kubectl port-forward helloworld NodePort:PodPort 即可。

这时候在浏览器就可以打上 http://localhost:8080 来看到内容了。

相信大家也知道这种做法有个缺点就是每次建立 Pod 还要自己手动打指令去连结 port 真的太搞刚了,而且久了也会忘记到底机器上哪个 port 有用到,因此这边笔者要推荐另一个做法来取代 port-forward 也就是 Service。

什麽是 Service?

service 的存在就是建立一个网路连线通道让应用程序可以正确地连结到正在运行的 Pods,而 Service 一共有 4 种表现形式,接下来就细谈一下这 4 种形式的差异吧!

  • ClusterIP

    预设值,代表这个 Service 只能在相同的 Cluster 内使用,无法让外部使用。

  • NodePort

    简单来说就是外部可以连到内部使用了,假如机器上本身有其他服务,例如:Nginx 之类的服务,然後还架一个 K8s 的 cluster 出来,这时候 K8s cluster 内的 service 就可以利用 NodePort 让机器上其他服务也可以使用。

  • ExternalName

    主要是为了让不同 namespace 中的以 ClusterIP 形式生成的 Service 可以利用 ExternalName 设定的外部名称,藉以连到指定的 namespace 中的 Service,由於笔者目前还没有提到 namespace 所以读者们稍微有一个印象就好,後续的文章会再加以阐述 namespace。

  • LoadBalancer

    这个属性是强化版的 NodePort ,除了拥有 NodePort 可以让外部连线的优点,同时也建立了负载平衡的机制来分散流量,但很可惜 LoadBalancer 目前只有云端服务,如:GCP、AWS 等等有支援而已,minikube 目前暂不支援所以想在本地端试试看的读者可能就没办法尝试使用这个形式了。


加了 Service 後目前 K8s 的流程图就会长这样,虽然有点简陋但应该不算难懂XD

Service 写法

接下来就用一个简单的范例来讲一下 Service 的写法吧!

apiVersion: v1
kind: Service
metadata:
  name: helloworld
  labels:
    app: frontend
    environment: develop
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 32700
  selector:
    app: frontend

基本上写法就跟 Pod 差不多,唯一不同的地方就在 spec 的细部设定,因此底下就来讲讲 spec 的相关设定吧!

  • type

    用来决定这个 Service 要以什麽形式建立, type 後面的值接的就是上面文章提到的 4 种形式。

  • ports

    用来决定该 Service 要连接哪些 port ,这边有一些细部的设定分别来阐述一下。

    • protocol: 用来决定连线的网路协议,预设值为 TCP ,当然也可以使用 UDP。

    • port: 建立好的 Service 要以哪个 port 连接到 Pod 上。

    • targetPort: 指的是目标 Pod 的 port ,通常 port 跟 targetPort 会设定一样。

    • nodePort: 指的是机器上的 Port 要对应到该 Service 上,这个设定要 nodePort 形式的 Service 才有效果,假如今天没有设定 nodePort 的话,K8s 就会自动开一个机器上的 port 去对应到该 Service ,这边有个小提醒,nodePort 的范围在 30000–32767 之间,不在这范围内的 port 都是不允许的。

  • selectors

    还记得上一篇文章提到的 Label 吗?今天 Service 想要连接到正确的 Pod 就必须要利用 selectors 了,这边只要原封不动的把 Pod 的 Label 复制上去即可。

建立 Service

跟 Pod 一样都需要用 apply 这个参数来建立 Service 的描述档。

刚刚上面的 port-forward 是利用跟本机端的 port 连动,所以可以用 localhost 的方式连接到 Pod ,由於这里已经归 K8s 管了,因此我们必须要用 minikube 的虚拟机器 IP 才可以连到,这边可以下 minikube ip 来取得虚拟机器 IP。

接下来我们就可以透过刚刚设定好的 Service nodePort 来连接到 Pod 了,由於一开始有先在 Service 描述档上写上 nodePort: 32700 ,因此我们就可以利用机器上的 32700 port 来连接到 Service 的 8080 port。

看到这边貌似很完美,但相信读者们一定会发现一件事,这个 port 真的太丑了,有没有办法让我们用 http 的预设 80 port 来连接呢?其实是可以的而这个方法会在下一篇文章告诉大家。

小结

今天介绍了 Service 这个用来连接 Pod 的网路连线通道,相信大家应该都更了解要如何跟 K8s 内的 Pod 进行沟通,但其实我们还差一步就可以让使用者有更好的连线方式可以连接。

如果对於文章有任何问题欢迎留言给我,接下来笔者要介绍 Ingress ,那我们就下篇文章见喽~


<<:  【心得】你今天种菜了吗? grid之路-grid的使用(6)

>>:  [Day22] Tableau 轻松学 - TabPy 介绍

[NestJS 带你飞!] DAY17 - Injection Scopes

Nest 在大多数情况下是采用 单例模式 (Singleton pattern) 来维护各个实例,也...

全端入门Day14_前端程序撰写之多一点的HTML

昨天简单介绍了HTML,今天就深度介绍一点。 HTML的一些语法 我们把重点拉成2个部分,其中1个是...

Day10-TypeScript(TS)的索引型别(Indexable Type)

今天来介绍TypeScript(TS)的索引型别(Indexable Type), 今天是轻松的一天...

python3的环境安装

我使用的版本是python3.8.6,示范安装用的目前(20210721)最新的版本 首先到官网下载...

Day 23: 人工智慧在音乐领域的应用 (AI作曲-基因演算法六 总要敬老尊贤吧?)

今天我们来把整个基因演算法作曲系列做一个完结。 前几天我们花了很多篇幅一一讲解整个基因演算法作曲的各...