Day13 - Google Kubernetes Engine 基础 - 使用 Service 暴露服务

前言

上一回我们使用 Pod 将应用程序部属到 Kubernetes 环境里,今天会介绍如何透过 Service 元件让应用程序可以从外部存取。

Service 元件介绍

Service 是 Kubernetes 内部的基础元件,负责定义如何存取 Pod 规则。不管是内部的沟通,或者是外部的服务暴露,都会使用到 Service 来作为 Pod 的进入点。而根据使用状况,会使用到不同类型的 Service ,主要有以下三种。

ClusterIP

ClusterIP 是 Service 的默认类型,使内部可以访问该服务,而外部则无法存取。通常会使用在如後端服务器这种只允许内部存取的应用。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235lDsDMEzZxb.png

NodePort

NodePort 是一种对外服务的方式,会在所有节点上开放一个连接埠(预设是30000 ~ 32767),发送到该端口的流量就会被转发到对应服务。因为需要暴露主机位址才能使用,所以大多只用於测试或是 Demo。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235978hHZAc5d.png

LoadBalancer

LoadBalancer 会跟外部的 Load Balancer 服务搭配,是云端上暴露服务的标准方式。在 GKE 上使用会提供一个外部 IP ,透过此 IP 就能将流量转发到你的服务上。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235u6pIVoB847.png

透过 Service 暴露服务

就来试着建置 Service 元件,我们会建立一个类型为 LoadBalancer 的 Service,就可以透过 IP 存取服务。

  1. 进入 Cloud Shell 网站,点击终端机输入指令

  2. 列出所有的 project ,找到之前所创建专案的 PROJECT_ID

gcloud projects list

  1. 点击倒三角形->点选专案的 PROJECT_ID,开启专案 Terminal

建置元件的方式一样透过 yaml 档来定义。

  1. 建立 myservice.yaml 档案
cd ~/k8s-test && touch myservice.yaml
  1. 点击左上 Explorer -> Open Folder -> 选择 k8s-test 资料夹 -> Open

还记得上回 mypod.yaml 档案里设置的 Label,根据标签可将 Pod 做分群管理,Service 如何把流量导入到正确的 Pod 上,就是使用 Label Selector , 根据设定的标签来寻找到对应的 Pod。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235BPTmDaETsG.png

  1. 查看 mypod.yaml 档案里设置的 Label

https://ithelp.ithome.com.tw/upload/images/20210912/201392356MSSsec9Sq.png

可以看到设置了一个Label app=myapp,所以只要在 Service 的 Label Selector 也设定同样标签,就能成功将流量转发到此 Pod 上。

  1. 点击myservice.yaml档案并贴上以下内容

https://ithelp.ithome.com.tw/upload/images/20210912/201392359wKivLBCZz.png

  • myservice.yaml
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: myapp
  • apiVersion
    • 该元件的版本号,根据要建立的元件而定
  • kind
    • 要建立的元件
  • metadata
    • name: 指定 Service 的名称
  • spec
    • type: 指定 Service 的型别
    • ports
      • protocol: 可以使用 TCP 或 UDP 两种 Protocol
      • port: 对外部开放的 Port
      • targetPort: 对应到 Pod 的那个 Port
    • selector
      • 根据 Label 找出对应的 Pod
  1. 根据myservice.yaml建立元件
kubectl apply -f myservice.yaml
  1. 使用kubectl get <type>查看 Services 元件。
kubectl get svc

(输出结果)

NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.3.240.1    <none>        443/TCP        24h
myservice    LoadBalancer   10.3.253.46   <pending>     80:30254/TCP   5s

第一个为 kubernetes 内部的 Service 可以忽略。myserviceEXTERNAL-IP栏位显示是<pending>,需要等待大约2-3分钟才能拿到IP。

  1. 等待一段时间( 约2-3分钟 )後查看 Services 元件
kubectl get svc

(输出结果)

NAME         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.3.240.1    <none>          443/TCP        24h
myservice    LoadBalancer   10.3.253.46   34.150.28.184   80:30254/TCP   2m41s

有了外部IP,就能存取服务了。

  1. 开启浏览器,输入网址後送出
http://<EXTERNAL-IP>

看到服务器回传讯息,代表可以存取到 Pod 了。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235gOicrbtalC.png

总结

今天学习到了 Kubernetes 基本的网路元件 Service,有兴趣的话可以搜寻 Ingress、Service Mesh 等关键字,能够了解到更多 K8s 网路的解决方案。


<<:  全端入门Day13_前端程序撰写之HTML

>>:  [FGL] 吸星大法 - IMPORT之 1: 使用extension扩展功能

D29 Selenium 自动注册帐户

研究了半天 写了一个自动注册帐户的程序 如下 首先会读取chromedriver 开启後转到注册页面...

BPMN 业务流程图

BPMN (Business Process Model and Notation) 也是一个用来做...

Day 13 懒得想变数吗? RSpec 有提供你啦

该文章同步发布於:我的部落格 还记得我们使用 let 方法来实作一个物件来让我们可以快速使用! 但...

<Day7>以模拟帐户作示范 — 登入 Shioaji API

● 接下来几章都是先以模拟帐户作登入,尚未使用正式证券户帐户登入 如果尚未有永丰金证券帐户的朋友,但...

Golang - Stack & Heap

常常在社群里面看到从其他程序语言转来用Go会有的问题 这些是找到的资料跟总结 同步更新在github...