kubernetesを学ぶ~その4:マニフェスト・コントローラ~
索引
-
- 上次的情节概要
-
- 关于宣言
-
- 关于控制器
-
- 关于术语
- 结束语
上次的剧情简介
前一次学习Kubernetes的第三部分,我详细介绍了kubectl。虽然只是涉及了一小部分内容,但我认为掌握基本知识非常重要。特别是对于像我这样没有K8s经验的新手来说,忠实于基本原则至关重要。嗯?感觉像是参加社团活动一样。
关于宣言的内容
K8sのオブジェクトを生成するためにオブジェクトに対応したAPIやメタ情報をYAML形式やJSON形式で書かれた宣言書のことをいいます。色んな情報ググったり体験談を拝見すると運用ではマニフェストでポッドの起動とかしないみたい。理由としては、運用でよく使うのが「コントローラ」であり、コントローラのマニフェストにポッドの雛形を記述した部分があるからだそうです。なるほど。コントローラについては、別でやろう。
选取的形式
YAML形式か、JSON形式かどちらにしようか検討する時、読みやすさやぱっと見のわかりやすさ(可読性)からYAML形式がよいと思います。
書き方
手始めに書き方を学ぶため、ポッドを起動するマニフェストを作ってみる。ホントはコントローラから作るのがいいんですが、基本を知るということでお許しを。別途やります。
test.ymlは、OpenLiteSpeedのポッドを作るマニフェストです。
apiVersion: v1
kind: Pod
metadata:
name: litespeed
spec:
containers:
- name: litespeed
image: indeedplusplus/openlitespeed:latest
apiVersion: v1
→キー(左側)と値(右側)で構成
· apiVersion是指定对象所管理的版本。
※有关键和值的信息,请参阅K8s API参考文档。
あと、よくやってしまうのですが、:(コロン)の右側に半角スペースが必要です。
これがないと、正しく認識しません。
※何度も「あれー? error parsingでたー。あぁ、半角スペースすぅ~(´;ω;`)」となっちゃった。何か気づく方法ないかな。
而且,如果不将键的大小写匹配,就会发生错误。
kind: Pod
metadata:
name: litespeed
・kindは、クライアントからリクエストを送るときのRESTリソースを表す文字を指定します。ポッド作るようにしたので、Podです。
・metadataは、オブジェクトのメタデータを指定します。必須項目のnameはポッドのオブジェクト名になります。なので、名前空間内で一意にする必要があります。
・metadata:を改行して半角スペースでインデントすると、ネストできます。
ハッシュなので、metadataというキーに対して、{name: litespeed}とハッシュが値になります。
spec:
containers:
- name: litespeed
image: indeedplusplus/openlitespeed:latest
・specは、kindで指定した値の仕様を記述します。
・containersは、ポッドで動かくコンテナの起動条件などを記述します。
・nameの左にハイフンがありますが、これは配列を表します。
要举个例子,元素数量只有一个。
顺便说一下,如果在图片左边加一个连字符,元素数量就会变成两个。嗯,不过在这个例子中不需要加。
另外,在一个侧车配置中存在一个Pod中有两个容器的情况下,将多个容器描述在containers数组中。
spec:
containers:
- name: litespeed #メインコンテナ
image: indeedplusplus/openlitespeed:latest
- name: cloner #サイドカーコンテナ
image: maho/c-cloner:0.1
还有其他一些选项,比如将卷挂载到容器的文件系统设置,以及设置环境变量的键项。由于会在后面继续学习和使用,所以在这里省略了。
关于控制器
控制器是控制Pod运行的对象。有多种类型,包括部署控制器和任务控制器等。
部署控制器
Webサーバやアプリケーションサーバのようなサービス提供を継続するサーバに適しています。理由としては、ポッドの稼働数や不要なポッドの後始末をするので負荷が増えたり減ったりアクセス変化が激しい機能に向いているのかと。
首先,我们尝试创建一个部署控制器。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl create deployment --image=hello-world hello-world
deployment.apps/hello-world created
確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get all
NAME READY STATUS RESTARTS AGE
pod/hello-world-7fd49b7477-rgl9v 0/1 Completed 2 40s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.32.0.1 <none> 443/TCP 2d23h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hello-world 0/1 1 0 40s
NAME DESIRED CURRENT READY AGE
replicaset.apps/hello-world-7fd49b7477 1 1 0 40s
4つオブジェクトができました。
pod/hello-world-7fd49b7477-rgl9vは、ポッド
service/kubernetesは、サービス
deployment.apps/hello-worldは、デプロイメントコントローラ
replicaset.apps/hello-world-7fd49b7477は、レプリカセット
です。
服务是独立学习的复制品吗?
仿制品套装 zhì
这是一个控制使得Pod运行数量达到目标数量的对象。
默认情况下,Pod的运行数量被设置为仅限一个。让我们尝试增加它。
確認します。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-7fd49b7477-5pm66 0/1 CrashLoopBackOff 4 2m55s
3つに増やします。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl scale --replicas=3 deployment/hello-world
deployment.extensions/hello-world scaled
確認します。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-7fd49b7477-5pm66 0/1 CrashLoopBackOff 5 3m51s
hello-world-7fd49b7477-dkxzv 0/1 CrashLoopBackOff 1 11s
hello-world-7fd49b7477-tzqjh 0/1 CrashLoopBackOff 1 11s
增加了!!!在控制这个的是复制集。
※顺便说一句,STATUS没有变成Completed是有原因的,请忽略。如果在describe中确认,最后状态:的退出代码是0。
恢复原样。
1つになーれ。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl scale --replicas=1 deployment/hello-world
deployment.extensions/hello-world scaled
2つ抹殺されていっています。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-7fd49b7477-5pm66 0/1 CrashLoopBackOff 7 16m
hello-world-7fd49b7477-dkxzv 0/1 Terminating 7 12m
hello-world-7fd49b7477-tzqjh 0/1 Terminating 7 12m
1つ生き残りました。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-7fd49b7477-5pm66 0/1 CrashLoopBackOff 8 20m
职位控制器
在部署控制器中使用的镜像是一个输出消息后就结束的处理过程,因此容器也是进行消息输出然后结束的批处理,容器结束→副本集变成目标数量的1!生成!!所以出现了CrashLoopBackOff错误。根据describe命令查看的内容也是这种情况。
批处理有作业控制器。
首先,让我们尝试创建一个作业控制器。
ジョブコントローラ作成
D:\Repository\kubernetes\vagrant-kubernetes>kubectl create job hello-world --image=hello-world
job.batch/hello-world created
確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get all
NAME READY STATUS RESTARTS AGE
pod/hello-world-b6wg6 0/1 Completed 0 105s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.32.0.1 <none> 443/TCP 3d
NAME COMPLETIONS DURATION AGE
job.batch/hello-world 1/1 5s 105s
pod/hello-world-b6wg6は、ポッド
job.batch/hello-worldは、ジョブコントローラですね。
ジョブコントローラのCOMPLETIONSが1/1になっているので、ジョブが完了していますね。
取消工作。
ジョブさようなら
D:\Repository\kubernetes\vagrant-kubernetes>kubectl delete job hello-world
job.batch "hello-world" deleted
確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.32.0.1 <none> 443/TCP 3d
关于术语
・REST
REST(REpresentational State Transfer)はWebサービスの設計モデルです。このモデルで作ったサービスのURIにHTTPメソッドでアクセスすることでデータの送受信を行います。
・サイドカーコンテナ
主となるコンテナと共にそれを補助する役割を果たすコンテナです。
附言
由于我在理解架构的同时进行工作,所以花了相当多的时间。我一直在调查原因,因为使用Hello-world的图像,状态没有变为完成。通过各种调查,我亲身体验了控制器的使用差异,我认为这是一件好事。 下次,我打算学习健康检查。
文献资料
程序员的YAML入门指南(初级篇)
从学习Docker到进阶Kubernetes的15步骤
API概述