使用k8s:将Docker容器部署到Kubernetes引擎并启动应用程序
总结
目标是使用GKE的Kubernetes Engine在Docker容器中运行的应用程序。我们将使用GCP官方的hello-app作为要运行的应用程序。该应用程序将在端口80上对请求作出“Hello, World!”的回应。
准备事项
-
- Google Cloud PlatformのKubernetes Engineで任意のプロジェクトを作成してください。
- プロジェクトに対する課金を有効にしてください。→プロジェクトの請求設定の変更
- 基本的なgcloud, kubectlコマンドなどの初期設定については公式かk8s : GKEによるKubernetesセットアップ(クラスタ作成まで)〜無料枠〜を参照してください。
步骤1: 创建容器映像。
首先,Kubernetes引擎接受Docker镜像作为应用程序部署格式。所以首先需要创建一个Docker镜像。
克隆hello-app。
$ git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Cloning into 'kubernetes-engine-samples'...
remote: Counting objects: 436, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 436 (delta 0), reused 1 (delta 0), pack-reused 431
Receiving objects: 100% (436/436), 385.01 KiB | 332.00 KiB/s, done.
Resolving deltas: 100% (180/180), done.
$ cd kubernetes-engine-samples/hello-app
环境变量设置
$ export PROJECT_ID="$(gcloud config get-value project -q)"
Your active configuration is: [cloudshell-29771]
$ echo $PROJECT_ID
kubernetes-test-213018
创建一个容器镜像,为其打上上传用的标签。
这个命令告诉Docker使用当前目录下的Dockerfile来创建镜像,并指示通过gcr.io/my-project/hello-app:v1等名称对其进行标记。
$ docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .
Sending build context to Docker daemon 9.728kB
Step 1/7 : FROM golang:1.8-alpine
1.8-alpine: Pulling from library/golang
550fe1bea624: Pull complete
cbc8da23026a: Pull complete
~中略~
Successfully built c0b949436195
Successfully tagged gcr.io/kubernetes-test-213018/hello-app:v1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gcr.io/kubernetes-test-213018/hello-app v1 c0b949436195 About a minute ago 10.3MB
<none> <none> c6c64569411f About a minute ago 263MB
alpine latest 11cd0b38bc3c 5 weeks ago 4.41MB
golang 1.8-alpine 4cb86d3661bf 6 months ago 257MB
$ docker ps -a //プロセスはまだない。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
步骤2:将容器映像上传至容器注册表。
将容器镜像上传到容器注册表。
上传
$ gcloud docker -- push gcr.io/${PROJECT_ID}/hello-app:v1
WARNING: `gcloud docker` will not be supported for Docker client versions above 18.03.
As an alternative, use `gcloud auth configure-docker` to configure `docker` to
use `gcloud` as a credential helper, then use `docker` as you would for non-GCR
registries, e.g. `docker pull gcr.io/project-id/my-image`. Add
`--verbosity=error` to silence this warning: `gcloud docker
--verbosity=error -- pull gcr.io/project-id/my-image`.
See: https://cloud.google.com/container-registry/docs/support/deprecation-notices#gcloud-docker
The push refers to repository [gcr.io/kubernetes-test-213018/hello-app]
29c39384924b: Pushed
~中略~
步骤3:本地运行容器(可选)。
让我们在本地(控制台)上执行,并尝试通过端口8080进行访问。
$ docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/hello-app:v1
2018/08/12 16:43:49 Server listening on port 8080
2018/08/12 16:44:25 Serving request: /
2018/08/12 16:44:25 Serving request: /favicon.ico
在使用curl进行验证也没有问题。
$ curl http://localhost:8080
Hello, world!
Version: 1.0.0
Hostname: f871bced7ec5
我們已經確認了在本地進行的App驗證。現在讓我們進行部署。
步骤4:创建容器集群。
在创建群集方面,将按照以下步骤进行。
参考资料:k8s:使用GKE进行Kubernetes设置(直到创建群集)〜免费阶梯〜
$gcloud config set project [プロジェクト名]
$gcloud config set compute/zone [ゾーン名]
$gcloud config set compute/region [リージョン名]
$gcloud config list
我会按照以下的方式创建本次项目。
[项目名称]:kubernetes-test
[区域名称]:us-west1-a
[可用区名称]:us-west1
// プロジェクト
$ gcloud config set project kubernetes-test-213018
// ゾーン
$ gcloud config set compute/zone us-west1
// リージョン
$ gcloud config set compute/region us-west1-a
// 確認
$ gcloud config list
[compute]
region = us-west1-a
zone = us-west1
[core]
account = xxxxxx
disable_usage_reporting = False
pass_credentials_to_gsutil = false
project = kubernetes-test-213018
Your active configuration is: [default]
$ gcloud compute instances list
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
gke-test-cluster-default-pool-ea04ffe6-tptm us-west1-a f1-micro true 10.138.0.2 35.233.147.83 RUNNING
gke-test-cluster-default-pool-ea04ffe6-wmfz us-west1-a f1-micro true 10.138.0.3 35.233.215.176 RUNNING
gke-test-cluster-default-pool-ea04ffe6-xwgq us-west1-a f1-micro true 10.138.0.4 35.227.149.76 RUNNING
步骤5:部署应用程序
要在Kubernetes Engine集群中部署和管理应用程序,需要与Kubernetes集群管理系统进行通信。
提示
· 在Kubernetes上运行的应用单位被称为Pods。
· 执行kubectl run命令时,Kubernetes将在集群中创建一个名为hello-web的Deployment。Deployment可以管理多个应用程序副本,称为Replica,并安排在集群中的每个节点上运行。在本例中,Deployment只会执行一个应用程序的Pod。
引用:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
听端口
$ kubectl run hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1 --port 8080
deployment "hello-web" created
Pods验证
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-web-6f5854c4f4-c8kt8 1/1 Running 0 35s
步骤6:将应用程序发布到互联网上。
如果要将应用程序明确公开到互联网上,由于在Kubernetes引擎上运行的容器没有外部IP地址,因此无法从互联网访问。在这种情况下,请执行以下命令。
$ kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080
service "hello-web" exposed
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-web LoadBalancer 10.59.246.168 35.233.225.41 80:32667/TCP 4m
确认访问
$ curl http://35.233.225.41:80
Hello, world!
Version: 1.0.0
Hostname: hello-web-6f5854c4f4-c8kt8
一切顺利,我成功访问了!
公開已經順利結束了,但在這裡我想提到一些和規模有關的技巧。
请确认目前的复制品数量。
$ kubectl get deployment hello-web
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-web 1 1 1 1 8m
将此设置为3个。执行kubectl scale deployment {app_name} –replicas=3。
$ kubectl scale deployment hello-web --replicas=3
deployment "hello-web" scaled
i35_267_m@kubernetes-test-213018:~/kubernetes-engine-samples/hello-app$ kubectl get deployment hello-web
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-web 3 3 3 2 9m
这样就变成了。
再者,如果保持现状,将会被收费,因此我们将进行清理工作。
$ kubectl delete service hello-web
service "hello-web" deleted
$ gcloud compute forwarding-rules list
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET
a84f4475b9e5111e89f1442010a8a001 us-west1 35.233.225.41 TCP us-west1/targetPools/a84f4475b9e5111e89f1442010a8a001
$ gcloud container clusters delete test-cluster
ERROR: (gcloud.container.clusters.delete) One of [--zone, --region] must be supplied: Please specify location..
$ gcloud container clusters delete test-cluster --zone us-west1-a
The following clusters will be deleted.
- [test-cluster] in [us-west1-a]
Do you want to continue (Y/n)? y
Deleting cluster test-cluster...done.
就是这样。