Kubernetes 使用Service把前端連接到后端

2022-06-15 11:34 更新

使用 Service 把前端連接到后端

本任務會描述如何創(chuàng)建前端(Frontend)微服務和后端(Backend)微服務。后端微服務是一個 hello 歡迎程序。 前端通過 nginx 和一個 Kubernetes 服務 暴露后端所提供的服務。

教程目標 

  • 使用部署對象(Deployment object)創(chuàng)建并運行一個 ?hello ?后端微服務
  • 使用一個 Service 對象將請求流量發(fā)送到后端微服務的多個副本
  • 同樣使用一個 Deployment 對象創(chuàng)建并運行一個 ?nginx ?前端微服務
  • 配置前端微服務將請求流量發(fā)送到后端微服務
  • 使用 ?type=LoadBalancer? 的 Service 對象將全段微服務暴露到集群外部

在開始之前

你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構建:

要獲知版本信息,請輸入 ?kubectl version?。

本任務使用外部負載均衡服務, 所以需要對應的可支持此功能的環(huán)境。如果你的環(huán)境不能支持,你可以使用 ?NodePort ?類型的服務代替。

使用部署對象(Deployment)創(chuàng)建后端

后端是一個簡單的 hello 歡迎微服務應用。這是后端應用的 Deployment 配置文件:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  selector:
    matchLabels:
      app: hello
      tier: backend
      track: stable
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        tier: backend
        track: stable
    spec:
      containers:
        - name: hello
          image: "gcr.io/google-samples/hello-go-gke:1.0"
          ports:
            - name: http
              containerPort: 80
...

創(chuàng)建后端 Deployment:

kubectl apply -f https://k8s.io/examples/service/access/backend-deployment.yaml

查看后端的 Deployment 信息:

kubectl describe deployment backend

輸出類似于:

Name:                           backend
Namespace:                      default
CreationTimestamp:              Mon, 24 Oct 2016 14:21:02 -0700
Labels:                         app=hello
                                tier=backend
                                track=stable
Annotations:                    deployment.kubernetes.io/revision=1
Selector:                       app=hello,tier=backend,track=stable
Replicas:                       3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:                   RollingUpdate
MinReadySeconds:                0
RollingUpdateStrategy:          1 max unavailable, 1 max surge
Pod Template:
  Labels:       app=hello
                tier=backend
                track=stable
  Containers:
   hello:
    Image:              "gcr.io/google-samples/hello-go-gke:1.0"
    Port:               80/TCP
    Environment:        <none>
    Mounts:             <none>
  Volumes:              <none>
Conditions:
  Type          Status  Reason
  ----          ------  ------
  Available     True    MinimumReplicasAvailable
  Progressing   True    NewReplicaSetAvailable
OldReplicaSets:                 <none>
NewReplicaSet:                  hello-3621623197 (3/3 replicas created)
Events:
...

創(chuàng)建 hello Service 對象

將請求從前端發(fā)送到到后端的關鍵是后端 Service。Service 創(chuàng)建一個固定 IP 和 DNS 解析名入口, 使得后端微服務總是可達。Service 使用 選擇算符 來尋找目標 Pod。

首先,瀏覽 Service 的配置文件:

---
apiVersion: v1
kind: Service
metadata:
  name: hello
spec:
  selector:
    app: hello
    tier: backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: http
...

配置文件中,你可以看到名為 ?hello ?的 Service 將流量路由到包含 ?app: hello? 和 ?tier: backend? 標簽的 Pod。

創(chuàng)建后端 Service:

kubectl apply -f https://k8s.io/examples/service/access/backend-service.yaml

此時,你已經有了一個運行著 ?hello ?應用的三個副本的 ?backend ?Deployment,你也有了 一個 Service 用于路由網絡流量。不過,這個服務在集群外部無法訪問也無法解析。

創(chuàng)建前端應用

現(xiàn)在你已經有了運行中的后端應用,你可以創(chuàng)建一個可在集群外部訪問的前端,并通過代理 前端的請求連接到后端。

前端使用被賦予后端 Service 的 DNS 名稱將請求發(fā)送到后端工作 Pods。這一 DNS 名稱為 ?hello?,也就是 ?examples/service/access/backend-service.yaml? 配置 文件中 ?name ?字段的取值。

前端 Deployment 中的 Pods 運行一個 nginx 鏡像,這個已經配置好的鏡像會將請求轉發(fā) 給后端的 hello Service。下面是 nginx 的配置文件:

# The identifier Backend is internal to nginx, and used to name this specific upstream
upstream Backend {
    # hello is the internal DNS name used by the backend Service inside Kubernetes
    server hello;
}

server {
    listen 80;

    location / {
        # The following statement will proxy traffic to the upstream named Backend
        proxy_pass http://Backend;
    }
}

與后端類似,前端用包含一個 Deployment 和一個 Service。后端與前端服務之間的一個 重要區(qū)別是前端 Service 的配置文件包含了 ?type: LoadBalancer?,也就是說,Service 會使用你的云服務商的默認負載均衡設備,從而實現(xiàn)從集群外訪問的目的。

---
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  selector:
    app: hello
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 80
  type: LoadBalancer
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  selector:
    matchLabels:
      app: hello
      tier: frontend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: hello
        tier: frontend
        track: stable
    spec:
      containers:
        - name: nginx
          image: "gcr.io/google-samples/hello-frontend:1.0"
          lifecycle:
            preStop:
              exec:
                command: ["/usr/sbin/nginx","-s","quit"]
...

創(chuàng)建前端 Deployment 和 Service:

kubectl apply -f https://k8s.io/examples/service/access/frontend-deployment.yaml
kubectl apply -f https://k8s.io/examples/service/access/frontend-service.yaml

通過輸出確認兩個資源都已經被創(chuàng)建:

deployment.apps/frontend created
service/frontend created

說明: 這個 nginx 配置文件是被打包在 容器鏡像 里的。 更好的方法是使用 ?ConfigMap?, 這樣的話你可以更輕易地更改配置。

與前端 Service 交互 

一旦你創(chuàng)建了 LoadBalancer 類型的 Service,你可以使用這條命令查看外部 IP:

kubectl get service frontend

外部 IP 字段的生成可能需要一些時間。如果是這種情況,外部 IP 會顯示為 ?<pending>?。

NAME       CLUSTER-IP      EXTERNAL-IP   PORT(S)  AGE
frontend   10.51.252.116   <pending>     80/TCP   10s

當外部 IP 地址被分配可用時,配置會更新,在 ?EXTERNAL-IP? 頭部下顯示新的 IP:

NAME       CLUSTER-IP      EXTERNAL-IP        PORT(S)  AGE
frontend   10.51.252.116   XXX.XXX.XXX.XXX    80/TCP   1m

這一新的 IP 地址就可以用來從集群外與 ?frontend ?服務交互了。

通過前端發(fā)送流量

前端和后端已經完成連接了。你可以使用 curl 命令通過你的前端 Service 的外部 IP 訪問服務端點。

curl http://${EXTERNAL_IP} # 將 EXTERNAL_P 替換為你之前看到的外部 IP

輸出顯示后端生成的消息:

{"message":"Hello"}

清理現(xiàn)場

要刪除服務,輸入下面的命令:

kubectl delete services frontend backend

要刪除在前端和后端應用中運行的 Deployment、ReplicaSet 和 Pod,輸入下面的命令:

kubectl delete deployment frontend backend


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號