理解 Kubernetes 在 GKE 上的使用

Kubernetes是一个管理基于容器的系统生命周期的开源工具。
它通常在基础设施1上运行,但这次我们将使用预先准备好的GKE环境,从使用者的角度来学习。
粗略的理解
首先,为了大致了解构架,我们看一下图表。

左侧是Kubernetes的控制器,右侧是受管理的容器。以下是需要简单了解的词汇。
-
- Node・・Dockerが動くマシンのこと。
-
- Pod・・コンテナを配置する入れ物。この単位でスケールさせたりします。
- Proxy・・コンテナとの通信を経由するプロキシ。
当使用API或命令行进行管理时,由于经常出现以下单词,我将简单地记住它们。
-
- Deployments 2・・Pod(コンテナ)を管理するもの
- Service 3・・Pod(コンテナ)と通信を維持するためのポリシーなどを定義するもの
为什么要学习?
我們希望使用以下教程來理解 Kubernetes。
- Redis と PHP を使用したゲストブックの作成
因为教程中的信息已经过时(从创建ReplicationController变为创建Deployment),所以我会同时参考以下内容进行操作。
- Guestbook Example
制作这样的东西。
+--------------+
| LoadBalancer |
+--------------+
|
+--------------+
| frontend |
+--------------+
| |
+--------------+ +--------------+
| redis-master | | redis-slave |
+--------------+ +--------------+
准备命令环境
我将按照以下方式设置 gcloud 命令和 kubectl 命令:
启动容器引擎。
设定一个默认环境,这样每次输入命令时就不需要指定了。
$ gcloud config set project PROJECT_ID # プロジェクトIDの指定
$ gcloud config set compute/zone asia-northeast1-a # ゾーンの指定
$ gcloud config list # 現在の設定を確認
Your active configuration is: [default]
[compute]
region = asia-northeast1
zone = asia-northeast1-a
[core]
account = EMAIL_ADDRESS
disable_usage_reporting = False
project = PROJECT_ID
创建集群(节点)
首先,我们创建一个容器部署集群(节点)。默认情况下,会创建3个节点,但这次我们指定节点数为1进行创建。
$ gcloud container clusters create guestbook --num-nodes=1
Creating cluster guestbook...done.
Created [https://container.googleapis.com/v1/projects/{PROJECT_ID}/zones/asia-northeast1-a/clusters/guestbook].
kubeconfig entry generated for guestbook.
NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
guestbook asia-northeast1-a 1.4.7 104.198.127.169 n1-standard-1 1.4.7 1 RUNNING
由于Kubernetes已经启动,我们可以尝试使用以下命令启动本地代理服务器。
$ kubectl proxy
Starting to serve on 127.0.0.1:8001
当您访问http://localhost:8001/ui/时,会出现Kubernetes的界面。这个界面看起来很棒。

创建Redis主节点
创建部署(Pod和容器)。
- redis-master-deployment.yaml ファイル
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis-master # 名前の指定(必須)
spec:
replicas: 1 # コンテナのレプリカ数の設定
template:
metadata:
labels: # ラベルをKV型で設定
app: redis
role: master
tier: backend
spec:
containers:
- name: master # コンテナの名前
image: gcr.io/google_containers/redis:e2e # コンテナイメージの指定(必須)
resources:
requests:
cpu: 100m # CPUを0.1コア確保
memory: 100Mi # メモリ100MiB確保
ports:
- containerPort: 6379 # コンテナポートの指定
kube createでこのファイルを読ませるとyamlに記載したとおりのコンテナを作成してくれます。
$ kubectl create -f redis-master-deployment.yaml
deployment "redis-master" created
- Deployment一覧を表示する
```bash
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
redis-master 1 1 1 1 2m
- Pod一覧を表示する
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
redis-master-343230949-6dmjd 1/1 Running 0 2m
成功创建了 Redis 容器
通过Kubernetes的kubectl run命令来迂回一下。
即使不创建yaml文件,也可以使用kubectl run命令来创建。
kubectl run コマンド
$ kubectl run redis-master \
> --image=gcr.io/google_containers/redis:e2e \
> --labels="app=redis,role=master,tier=backend" \
> --requests="cpu=100m,memory=100Mi" \
> --port=6379
deployment "redis-master-run" created
其实,这样做的话,容器的名称(实际容器名称并非如此)会变成redis-master(默认为Pod名称),并不完全相同。由于找不到设置容器名称的命令参数[^4],所以我试着在–overrides选项中强行进行了设置。
[^4]: kube run命令参考文档
[^4]: kube run命令的参考资料
–overridesオプションをつけてkubectl run
$ kubectl run redis-master \
> --image=gcr.io/google_containers/redis:e2e \
> --labels="app=redis,role=master,tier=backend" \
> --overrides='{"spec":{"template":{"spec":{"containers":[{"name":"master","image":"gcr.io/google_containers/redis:e2e","resources":{"requests":{"cpu":"100m","memory":"100Mi"}},"ports":[{"containerPort":6379}]}]}}}}'
deployment "redis-master" created
由于–image选项是必需的,因此需要在–overrides参数中和容器镜像位置中重复指定。这种方式几乎是将yaml转换为json,有点没有意义的感觉。
为了确认,我将比较”kube describe pod “命令的输出。
$ diff -u redis-master.describe redis-master_run.describe
--- redis-master.describe 2016-12-29 23:38:58.000000000 +0900
+++ redis-master_run.describe 2016-12-29 23:41:49.000000000 +0900
@@ -1,17 +1,17 @@
-Name: redis-master-343230949-6dmjd
+Name: redis-master-343230949-n0sxq
Namespace: default
Node: gke-guestbook-default-pool-af5eb675-xszz/10.146.0.2
-Start Time: Thu, 29 Dec 2016 22:37:55 +0900
+Start Time: Thu, 29 Dec 2016 23:40:41 +0900
Labels: app=redis
pod-template-hash=343230949
role=master
tier=backend
Status: Running
-IP: 10.52.0.11
+IP: 10.52.0.15
Controllers: ReplicaSet/redis-master-343230949
Containers:
master:
- Container ID: docker://2f57187ee653673df16d40532528086475aadbff9994540541147285600de612
+ Container ID: docker://49226c07f4a0ab49503cc46eea01c9382ffe3b62d9d27170ccd8b21f04500365
Image: gcr.io/google_containers/redis:e2e
Image ID: docker://sha256:e5e67996c442f903cda78dd983ea6e94bb4e542950fd2eba666b44cbd303df42
Port: 6379/TCP
@@ -19,7 +19,7 @@
cpu: 100m
memory: 100Mi
State: Running
- Started: Thu, 29 Dec 2016 22:38:24 +0900
+ Started: Thu, 29 Dec 2016 23:40:42 +0900
Ready: True
Restart Count: 0
Volume Mounts:
只要除了IP地址和日期没有任何更改,我们可以看出这是使用相同设置创建的。
出差 (Deployment)
使用Kubernetes 1.2版本时,Deployment对象可以方便地进行Pod的创建、滚动更新和回滚等操作。
在此之前,Replication Controller负责了这方面的角色,因此在教程中,我们使用Replication Controller创建Pod并进行说明。然而在当前版本(1.4.7)中,通过Deployments创建Pod时,会触发Replication Controller的下一代版本Replica Sets的运行。或许Replication Controller会被取代掉吧。。
[^5]: 复制控制器 – kubernetes.io
[^6]: 副本集 – kubernetes.io
順便一提,Kubernetes的管理界面似乎仍然以Replication Controller为主,通过界面创建Pod时会自动创建Replication Controller。我试一试。
- コマンドラインからコンテナ(Pod)を作成
$ kubectl run cli --image=gcr.io/google-samples/gb-frontend:v4
deployment "cli" created
在这里,通过Kubernetes的用户界面以名为”ui”的方式创建容器。
- 2つのPodが作成されています
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
cli-2068554765-12stb 1/1 Running 0 1m
ui-sbpaz 1/1 Running 0 22s
- UIから作成したコンテナは Replication Controller になっています
$ kubectl get replicationcontroller
NAME DESIRED CURRENT READY AGE
ui 1 1 1 45s
- コマンドラインからはDeploymentになっています
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
cli 1 1 1 1 1m
yaml的配置本身并没有太大变化。要强调的是,在metadata部分省略了labels。
--- legacy/redis-master-controller.yaml 2016-12-28 01:18:16.000000000 +0900
+++ redis-master-deployment.yaml 2016-12-28 01:43:37.000000000 +0900
@@ -1,13 +1,13 @@
-apiVersion: v1
-kind: ReplicationController
+apiVersion: extensions/v1beta1
+kind: Deployment
metadata:
name: redis-master
# these labels can be applied automatically
# from the labels in the pod template if not set
- labels:
- app: redis
- role: master
- tier: backend
+ # labels:
+ # app: redis
+ # role: master
+ # tier: backend
spec:
# this replicas value is default
# modify it according to your case
@@ -15,9 +15,10 @@
# selector can be applied automatically
# from the labels in the pod template if not set
# selector:
- # app: guestbook
- # role: master
- # tier: backend
+ # matchLabels:
+ # app: guestbook
+ # role: master
+ # tier: backend
template:
metadata:
labels:
通过SSH登录进行了一个小插曲。
您也可以通过SSH登录到节点。
-o wideでPodが配置されているノードIDを表示させます。
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
redis-master-343230949-n0sxq 1/1 Running 0 11m 10.52.0.15 gke-guestbook-default-pool-af5eb675-xszz
- 上記ノードを指定してSSHログインします。
$ gcloud compute ssh gke-guestbook-default-pool-af5eb675-xszz
Warning: Permanently added 'compute.7579721538501918346' (RSA) to the list of known hosts.
Welcome to Kubernetes v1.4.7!
You can find documentation for Kubernetes at:
http://docs.kubernetes.io/
The source for this release can be found at:
/home/kubernetes/kubernetes-src.tar.gz
Or you can download it at:
https://storage.googleapis.com/kubernetes-release/release/v1.4.7/kubernetes-src.tar.gz
It is based on the Kubernetes source at:
https://github.com/kubernetes/kubernetes/tree/v1.4.7
For Kubernetes copyright and licensing information, see:
/home/kubernetes/LICENSES
user@gke-guestbook-default-pool-af5eb675-xszz ~ $
- ログイン出来たので”docker ps”コマンドを実行してみます。kubernetes関連のコンテナが沢山動いてますね。
user@gke-guestbook-default-pool-af5eb675-xszz ~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49226c07f4a0 gcr.io/google_containers/redis:e2e "redis-server /etc/re" 12 minutes ago Up 12 minutes k8s_master.b505b5b1_redis-master-343230949-n0sxq_default_c5e1c119-cdd4-11e6-9059-42010a920020_d5ed9c19
f2e1a93483ef gcr.io/google_containers/pause-amd64:3.0 "/pause" 12 minutes ago Up 12 minutes k8s_POD.d8dbe16c_redis-master-343230949-n0sxq_default_c5e1c119-cdd4-11e6-9059-42010a920020_594d5d61
ed54277b3108 asia.gcr.io/google_containers/addon-resizer:1.6 "/pod_nanny --cpu=80m" 2 hours ago Up 2 hours k8s_heapster-nanny.55df2c69_heapster-v1.2.0-1847815531-zrkw6_kube-system_378ff7ba-cdc2-11e6-9059-42010a920020_84f3de55
22a3bf8a8816 asia.gcr.io/google_containers/heapster:v1.2.0 "/heapster --source=k" 2 hours ago Up 2 hours k8s_heapster.d8c9b305_heapster-v1.2.0-1847815531-zrkw6_kube-system_378ff7ba-cdc2-11e6-9059-42010a920020_b3e26ab1
b4bb94588700 gcr.io/google_containers/pause-amd64:3.0 "/pause" 2 hours ago Up 2 hours k8s_POD.d8dbe16c_heapster-v1.2.0-1847815531-zrkw6_kube-system_378ff7ba-cdc2-11e6-9059-42010a920020_f00e16d7
262de7613d9e asia.gcr.io/google_containers/exechealthz-amd64:1.2 "/exechealthz '--cmd=" 2 hours ago Up 2 hours k8s_healthz.aaa6418e_kube-dns-v20-8uddr_kube-system_25491b5f-cdc2-11e6-9059-42010a920020_19442f61
218ef4491c93 asia.gcr.io/google_containers/kube-dnsmasq-amd64:1.4 "/usr/sbin/dnsmasq --" 2 hours ago Up 2 hours k8s_dnsmasq.daf813d2_kube-dns-v20-8uddr_kube-system_25491b5f-cdc2-11e6-9059-42010a920020_da4ffbd1
02b6c5abe863 asia.gcr.io/google_containers/kubedns-amd64:1.8 "/kube-dns --domain=c" 2 hours ago Up 2 hours k8s_kubedns.dc925936_kube-dns-v20-8uddr_kube-system_25491b5f-cdc2-11e6-9059-42010a920020_226b6b62
9fc09d1f352d asia.gcr.io/google_containers/defaultbackend:1.0 "/server" 2 hours ago Up 2 hours k8s_default-http-backend.8208ca2c_l7-default-backend-v1.0-shaxn_kube-system_251d5635-cdc2-11e6-9059-42010a920020_22aef95d
61d5ea514139 asia.gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0 "/dashboard --port=90" 2 hours ago Up 2 hours k8s_kubernetes-dashboard.44adcd81_kubernetes-dashboard-v1.4.0-ev5z4_kube-system_2538ca75-cdc2-11e6-9059-42010a920020_3c45962e
ddc295bd5b86 asia.gcr.io/google_containers/fluentd-gcp:1.21 "/bin/sh -c 'rm /lib/" 2 hours ago Up 2 hours k8s_fluentd-cloud-logging.9d1761e_fluentd-cloud-logging-gke-guestbook-default-pool-af5eb675-xszz_kube-system_9d40f2ab7a284a2e847ba6ea821d674b_08346356
b5a7f7a969fe gcr.io/google_containers/pause-amd64:3.0 "/pause" 2 hours ago Up 2 hours k8s_POD.d8dbe16c_kube-dns-v20-8uddr_kube-system_25491b5f-cdc2-11e6-9059-42010a920020_cfddc70c
2625088adb2d gcr.io/google_containers/pause-amd64:3.0 "/pause" 2 hours ago Up 2 hours k8s_POD.d8dbe16c_l7-default-backend-v1.0-shaxn_kube-system_251d5635-cdc2-11e6-9059-42010a920020_2eb5e129
6904e351db39 gcr.io/google_containers/pause-amd64:3.0 "/pause" 2 hours ago Up 2 hours k8s_POD.d8dbe16c_kubernetes-dashboard-v1.4.0-ev5z4_kube-system_2538ca75-cdc2-11e6-9059-42010a920020_536e1b7b
7672d253bc84 gcr.io/google_containers/pause-amd64:3.0 "/pause" 2 hours ago Up 2 hours k8s_POD.d8dbe16c_fluentd-cloud-logging-gke-guestbook-default-pool-af5eb675-xszz_kube-system_9d40f2ab7a284a2e847ba6ea821d674b_85d10a63
16bdffccc672 gcr.io/google_containers/kube-proxy:31be43b1cb619b7b0ab8fe01f997fe2f "/bin/sh -c 'kube-pro" 2 hours ago Up 2 hours k8s_kube-proxy.3ea31aa7_kube-proxy-gke-guestbook-default-pool-af5eb675-xszz_kube-system_0a4a2e1c974bec66debcc5815d60085a_0833b062
9cacc1697cf5 gcr.io/google_containers/pause-amd64:3.0 "/pause" 2 hours ago Up 2 hours k8s_POD.d8dbe16c_kube-proxy-gke-guestbook-default-pool-af5eb675-xszz_kube-system_0a4a2e1c974bec66debcc5815d60085a_20190c5a
途径(SSH登录用户)
通过使用以下命令格式,可以使用本地环境的用户名进行连接而不带USER参数:gcloud compute ssh [USER@]INSTANCE(与常规SSH操作相同)。用户将自动创建并注册到GCE。
您可以从以下位置查看注册的用户和SSH公钥:
https://console.cloud.google.com/compute/metadata/sshKeys
创建Redis主节点服务
我們將創建一個用於與容器通信的服務。
- redis-master-service.yaml ファイル
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
role: master
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: master
tier: backend
- yamlファイルを読み込んでサービスを作成します。
$ kubectl create -f redis-master-service.yaml
service "redis-master" created
- サービスの情報を表示します。
$ kubectl get service redis-master
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-master 10.55.246.114 <none> 6379/TCP 43s
- もちろん、コマンドラインでサービスを作成することもできます。
$ kubectl expose service redis-master \
> --labels="app=redis,role=master,tier=backend" \
> --selector="app=redis,role=master,tier=backend" \
> --port=6379 \
> --target-port=6379
Redis スレーブのコンテナとサービス作成
我们将创建容器和服务,就像创建Redis主节点一样。
- redis-slave-deployment.yaml ファイル
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis-slave
spec:
replicas: 2 # レプリカ数を2に指定
template:
metadata:
labels:
app: redis
role: slave
tier: backend
spec:
containers:
- name: slave
image: gcr.io/google_samples/gb-redisslave:v1
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM # 環境変数をセットしています。PHPのアプリケーションで使います。
value: dns
ports:
- containerPort: 6379
- コンテナを作成してPod数が2になっていることを確認します。
$ kubectl create -f redis-slave-deployment.yaml
deployment "redis-slave" created
$ kubectl get deployment redis-slave
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
redis-slave 2 2 2 0 24s # 2になっている
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
redis-master-343230949-08kqi 1/1 Running 0 7m
redis-slave-132015689-3x3qp 1/1 Running 0 48s # 1Pod目
redis-slave-132015689-b6cha 1/1 Running 0 48s # 2Pod目
我可以看到有两个Redis从节点的Pod。接下来我们创建一个服务。
- redis-slave-service.yaml ファイル
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
app: redis
role: slave
tier: backend
spec:
ports:
- port: 6379
selector:
app: redis
role: slave
tier: backend
- redis-slaveのサービスを作成して確認します。
$ kubectl create -f redis-slave-service.yaml
service "redis-slave" created
$ kubectl get svc redis-slave # servicesを"svc"と省略することができます。
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-slave 10.55.255.111 <none> 6379/TCP 18s
创建前端Web服务器
由于后端(redis)已被创建,现在我们将着手创建前端部分。
- front-deployment.yaml ファイル
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google-samples/gb-frontend:v4
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
- frontendを作成して確認します。
$ kubectl create -f frontend-deployment.yaml
deployment "frontend" created
kubectl get deployment frontend
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
frontend 3 3 3 3 1m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-88237173-cp3rn 1/1 Running 0 1m
frontend-88237173-kxlgh 1/1 Running 0 1m
frontend-88237173-tw65g 1/1 Running 0 1m
redis-master-343230949-08kqi 1/1 Running 0 29m
redis-slave-132015689-3x3qp 1/1 Running 0 22m
redis-slave-132015689-b6cha 1/1 Running 0 22m
我将创建一个专门用于前端的服务。由于前端需要实现多台负载均衡,所以选择了type: LoadBalancer进行指定。
- frontend-service.yaml ファイル
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: guestbook
tier: frontend
$ kubectl create -f frontend-service.yaml
service "frontend" created
$ kubectl get svc frontend
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.55.254.255 104.198.125.6 80/TCP 3m
当指定为 LoadBalancer 时,会创建一个独立的 GCE 负载均衡器。默认情况下,它没有进行健康检查等配置,因此根据需要需要进行更改。

当我在浏览器中访问EXTERNAL_IP时,我可以看到以下的屏幕。

PHP代码的内容
我想要确认一下这个应用程序是用PHP编写的以确定它在做什么。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require 'Predis/Autoloader.php';
Predis\Autoloader::register();
if (isset($_GET['cmd']) === true) {
$host = 'redis-master';
if (getenv('GET_HOSTS_FROM') == 'env') {
$host = getenv('REDIS_MASTER_SERVICE_HOST');
}
header('Content-Type: application/json');
if ($_GET['cmd'] == 'set') {
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => $host,
'port' => 6379,
]);
$client->set($_GET['key'], $_GET['value']);
print('{"message": "Updated"}');
} else {
$host = 'redis-slave';
if (getenv('GET_HOSTS_FROM') == 'env') {
$host = getenv('REDIS_SLAVE_SERVICE_HOST');
}
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => $host,
'port' => 6379,
]);
$value = $client->get($_GET['key']);
print('{"data": "' . $value . '"}');
}
} else {
phpinfo();
} ?>
如果是写入操作,连接到Redis的主节点;如果是读取操作,连接到Redis的从节点。Redis的主节点的主机名为redis-master,从节点为redis-slave。这意味着在创建Redis部署时指定的名称已经在容器的DNS空间中生效。
有时候也会不使用DNS,所以我们加入了这个判断if (getenv(‘GET_HOSTS_FROM’) == ‘env’) {,以便可以使用环境变量。
由于在 frontend-deployment.yaml 中进行了以下配置,因此在此PHP代码中使用了DNS名称。
...
env:
- name: GET_HOSTS_FROM
value: dns # envにするとPHPが環境変数を使うようになる
...
试着改变复制品的数量
可以轻松地在中途改变复制品的数量。
- レプリカ数を5へ変更する
$ kubectl scale deployment frontend --replicas=5
deployment "frontend" scaled
- 5になっていることが分かります。
$ kubectl get deployment frontend
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
frontend 5 5 5 5 51m
- Podを見ると増えているのが分かります
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-88237173-cp3rn 1/1 Running 0 26m
frontend-88237173-kuyzx 1/1 Running 0 6s # 増えたPod
frontend-88237173-kxlgh 1/1 Running 0 26m
frontend-88237173-sljba 1/1 Running 0 6s # 増えたPod
frontend-88237173-tw65g 1/1 Running 0 26m
redis-master-343230949-08kqi 1/1 Running 0 53m
redis-slave-132015689-3x3qp 1/1 Running 0 47m
redis-slave-132015689-b6cha 1/1 Running 0 47m
寄一個方向(kube編輯)
您可以使用kube edit命令来更改副本数量和其他配置。
$ KUBE_EDITOR=vim kubectl edit deployment frontend # デフォルトエディタはvi
您可以通过使用上述命令打开配置文件(yaml),然后进行修改并保存,以更改设置。
障碍发生时Pod的行为
我想用命令删除Pod并模拟故障。
- シミュレーションする前に状態を確認します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-88237173-cp3rn 1/1 Running 0 53m
frontend-88237173-kxlgh 1/1 Running 0 53m
frontend-88237173-tw65g 1/1 Running 0 53m
redis-master-343230949-08kqi 1/1 Running 0 1h
redis-slave-132015689-3x3qp 1/1 Running 0 1h
redis-slave-132015689-b6cha 1/1 Running 0 1h
- Podを一つ削除します。
$ kubectl delete pod frontend-88237173-cp3rn
pod "frontend-88237173-cp3rn" deleted
- 即座に新しいPodが作成されています。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-88237173-0omu3 1/1 Running 0 3s # 直ぐPodが作成された
frontend-88237173-kxlgh 1/1 Running 0 54m
frontend-88237173-tw65g 1/1 Running 0 54m
redis-master-343230949-08kqi 1/1 Running 0 1h
redis-slave-132015689-3x3qp 1/1 Running 0 1h
redis-slave-132015689-b6cha 1/1 Running 0 1h
成功地重制了复制品。
尝试更改标签
我想要确认一下Kubernetes据说可以通过检查标签来检查副本数量,如果标签有变动,我想要了解它的行为。
- ラベルがtier=frontend のPodを表示します。
$ kubectl get pod -l tier=frontend
NAME READY STATUS RESTARTS AGE
frontend-88237173-0omu3 1/1 Running 0 21m # このPodのラベルを変更する
frontend-88237173-fadzg 1/1 Running 0 1m
frontend-88237173-tw65g 1/1 Running 0 1h
- ひとつのPodのラベルを変更します。
$ kubectl label --overwrite pods frontend-88237173-0omu3 tier=middle
pod "frontend-88237173-0omu3" labeled
- ラベルがtier=frontendのPodを表示します。新しいPodに入れ替っているのが分かります。
$ kubectl get pod -l tier=frontend
NAME READY STATUS RESTARTS AGE
frontend-88237173-fadzg 1/1 Running 0 2m
frontend-88237173-kkjpu 1/1 Running 0 4s # 新しいPodに変わっている
frontend-88237173-tw65g 1/1 Running 0 1h
- frontendとしてレプリカ数は維持しています。
$ kubectl get deployment frontend
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
frontend 3 3 3 3 1h # Podの数は変わらない
- 変更したPodはDeployment外に存在しています。
$ kubectl get pod -l tier=middle
NAME READY STATUS RESTARTS AGE
frontend-88237173-0omu3 1/1 Running 0 22m # 変更したPodは存在している
这边也维持了一个出色的复制品。
清洁
删除所有资源。
$ kubectl delete service,deployment --all
service "frontend" deleted
service "kubernetes" deleted
service "redis-master" deleted
service "redis-slave" deleted
deployment "frontend" deleted
deployment "redis-master" deleted
deployment "redis-slave" deleted
$ gcloud container clusters delete guestbook
The following clusters will be deleted.
- [guestbook] in [asia-northeast1-a]
Do you want to continue (Y/n)? Y
Deleting cluster guestbook...done.
Deleted [https://container.googleapis.com/v1/projects/{PROJECT_ID}/zones/asia-northeast1-a/clusters/guestbook].
最后
我觉得容器的操作很简单,不仅供应也很容易,但我认为最大的魅力是在运营中有灵活的管理。下一步,我希望学习更接近实践的内容,例如滚动更新等。
那么,
选择合适的解决方案 – kubernetes.io
部署 – kubernetes.io
服务 – kubernetes.io