使用k8s:将Docker容器部署到Kubernetes引擎并启动应用程序

总结

目标是使用GKE的Kubernetes Engine在Docker容器中运行的应用程序。我们将使用GCP官方的hello-app作为要运行的应用程序。该应用程序将在端口80上对请求作出“Hello, World!”的回应。

准备事项

    • Google Cloud PlatformのKubernetes Engineで任意のプロジェクトを作成してください。

 

    プロジェクトに対する課金を有効にしてください。→プロジェクトの請求設定の変更
スクリーンショット 2018-08-13 1.15.38.png
    基本的な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

スクリーンショット 2018-08-13 1.44.36.png
スクリーンショット 2018-08-13 1.47.39.png

在使用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.

就是这样。

广告
将在 10 秒后关闭
bannerAds