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,步骤如下:
gcloud components install kubectl
[PROJECT_ID] 填入您所要使用的 GCP 项目 ID,预设的 zone 为us-central1-b 或是改成您想要部署的 zone。
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b
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 停止容器的运行。
接着,我们要把刚刚建好的映像档上传至 GCR,GKE 才能够使用这个映像档来运行集群。在上传映像档前需要先验证 Docker command-line,这里已经验证过了所以才会出现 already registered correctly。
gcloud auth configure-docker
验证完之后就可以上传至 GCR。
创建一个名为 loadbalancedcluster 的 GKE 集群,在预设的情况下 GKE 会自动帮您创建三个 node,在这边我们设定两个 node。
gcloud container clusters create loadbalancedcluster --num-nodes=2
创建 GKE 集群需要等待数分钟,创建完成后可以列出 GKE 集群内的所有 node,也就是 VM instances。
gcloud compute instances list | grep 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 可以让 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 是管理所有外部流量路由至内部设定的 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
可以运行多个服务在同一个 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 去测试各个应用程式:
以上就是本次实操手册的全部内容啦~