Kubernetes(下文简称 k8s) 代表了 Google 的第三代容器管理系统,仅次于 Borg 和 Omega ,现在已经成为主要的容器平台。GKE 提供了了全套的 k8s 托管服务,将 Autoscaler 和 k8s 集成后,实现了 k8s 节点的自动伸缩机制,能根据 pod 的需求自动扩缩节点,实现了无服务器理念。

Load Balancer 作为 k8s 三种外部访问方式之一,是暴露服务到 internet 的标准方式。在 GKE 上,Ingress 是使用 Cloud Load Balancing 实现的。当您在集群中创建 Ingress 时,GKE 会创建一个 HTTP(S) 负载平衡器,它将提供一个静态的公网 IP 地址,并将其配置为将流量路由到您的应用。

本次实操手册将主要讲述如何在 GKE 上部署 HTTP(S) Load Balancer 及容器应用程式。
这里我们建议使用 GCP console 预设的 Cloud Shell,因为预设的 cloud shell 已经装好 gcloud command、kubectl、docker、git。
本次实操是在 cloud shell 进行演示。如果您想要在本机端操作,则需要确保您的本机端已经安装以下工具,并设定预设的 project ID,步骤如下:

  • Google Cloud SDK
  • kubectl →使用 gcloud command 安装
gcloud components install kubectl
  • Docker CE
  • git source control

[PROJECT_ID] 填入您所要使用的 GCP 项目 ID,预设的 zone 为us-central1-b 或是改成您想要部署的 zone。

gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

步骤一:打包 Docker 映像档

GKE 支持的应用程式部署格式为 Docker,此步骤带您打包一个简易的网页应用程式 hello-app。首先,下载 hello-app 的原始代码。

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/hello-app


设定 PROJECT_ID 的环境参数,这个 PROJECT_ID 会被用来当作上传映像档的GCP project。

export PROJECT_ID= "$(gcloud config get-value project -q)"

下面的指令会在当前的路径下使用 Dockerfile 建置一个映像档并贴上标签。gcr.io 代表着 Google Container Registry,类似 Dock Hub 的映像档储存空间。但相较于 Docker Hub,Google Container Registry 是非公开的 registry。(确保您本机的 Docker 正在运行)

docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .

执行 docker images 指令来确认刚刚的 build 是否成功。

步骤二:在本地端执行容器

在本地端测试刚刚建立的映像档

docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/hello-app:v1
使用本机端的终端机:打开新的浏览器窗口,

输入http://localhost:8080 测试刚刚运转起来的应用程式。

使用 Cloud Shell:

docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/hello-app:v1

点击选择 Add Cloud Shell Session,新增一页 Cloud Shell 的分页。

curl http://localhost:8080


收到页面成功的回传讯息后,在执行 docker run 的终端机或是 Cloud Shell 按下 Ctrl+c 停止容器的运行。

步骤三:上传 Docker 映像档至 GCR

接着,我们要把刚刚建好的映像档上传至 GCR,GKE 才能够使用这个映像档来运行集群。在上传映像档前需要先验证 Docker command-line,这里已经验证过了所以才会出现 already registered correctly。

gcloud auth configure-docker
图片
验证完之后就可以上传至 GCR。
图片

步骤四:创建 GKE 集群

创建一个名为 loadbalancedcluster 的 GKE 集群,在预设的情况下 GKE 会自动帮您创建三个 node,在这边我们设定两个 node。

gcloud container clusters create loadbalancedcluster --num-nodes=2
图片

创建 GKE 集群需要等待数分钟,创建完成后可以列出 GKE 集群内的所有 node,也就是 VM instances。

gcloud compute instances list | grep gke
图片


步骤五:部署应用程式至GKE 丛集

部署应用程式需要使用到 kubectl 这个指令工具来与集群交互。Pods 是Kubernetes 管理系统里面所代表的应用程式也是可以部署的最小单位,一个 Pod 里面可以有一个或是多个容器。

kubectl create deployment web 这个指令会让 Kubernetes 创建一个名为 web 的 Deployment。Deployment 管理着应用程式的 replicas 也就是多个应用程式的复制品,并把这些 replicas 安排到各个 nodes 上面去执行。

kubectl create deployment web --image=gcr.io/${PROJECT_ID}/hello-app:v1 --port 8080
图片
kubectl get pods
图片


步骤六:创建Service 并开启NodePort

Service 可以让 web 这个应用程式对外开放,但是目前我们只对内开放,且 Service 类型为NodePort,也就是 GKE 会在所有有执行 web 应用程式的 node 上面开启一个随机的 port。让之后创建的 Load Balancer 可以透过 NodePort 来分流。

kubectl expose deployment web --target-port=8080 --type=NodePort
图片
kubectl get service web
图片

这边 Service web 所开启的 nodePort 为32178。且尚未开放 Service 的 external IP。


步骤七:创建 Ingress 资源

Ingress 是管理所有外部流量路由至内部设定的 k8s 资源。当使用者创建一个Ingress,GKE 会创建一个HTTP(S) Load Balancing 并导流至应用程式所在的端口。

创建一个名为 basic-ingress.yaml 的文件,并贴入以下的内容

apiVersion: extensions/v1beta1kind: Ingressmetadata: name: basic-ingressspec: backend:   serviceName: web   servicePort: 8080

部署 Ingress 至GKE。

kubectl apply -f basic-ingress.yaml
图片

需要等待数分钟让 Ingress controller 创建一个HTTP(S) load balancer。

步骤八:测试应用程式

取得 load balancer 的 external IP,想要了解如何设定固定的 external IP,可以访问https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#step_5_optional_configuring_a_static_ip_address

kubectl get ingress basic-ingress
图片

呼叫 curl 指令测试应用程式。

curl http://[IP_ADDRESS]:80
图片


步骤九:(Option) 部署多个应用程式至集群

可以运行多个服务在同一个 load balancer 的外部 IP地址,我们只需要设定好 Ingress 的路由规则。

首先,先建立另一个名为 web2 的应用程式。

kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0 --port=8080
图片

对内开放 web2 Deployment。

kubectl expose deployment web2 --target-port=8080 --type=NodePort
图片

创建一个名为 fanout-ingress.yaml 的档案,并贴入以下内容:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: fanout-ingress
spec:
 rules:
 - http:
     paths:
     - path: /*
       backend:
         serviceName: web
         servicePort: 8080
     - path: /v2/*
       backend:
         serviceName: web2
         servicePort: 8080

可以看到这个 manifest 有设定http 的路径,/* 的会导至 web 这个应用程式、/v2/* 会导至 web2 这个应用程式。

部署这个设定档,并等待数分钟。

kubectl create -f fanout-ingress.yaml
图片

透过 kubectl get ingress fanout-ingress 取得load balancer 的外部 IP。

过一段时间后,使用 curl 去测试各个应用程式:

图片


以上就是本次实操手册的全部内容啦~



返回全部