试着通过清单文件创建Kubernetes对象
首先/起初/一開始
アプリケーションの開発を行うエンジニアであっても、インフラに関する事もある程度は知っておく必要がありそう…。
というわけでコンテナオーケストレーションについて理解を深めておこうと思い、kubernetesのマニフェストファイルについて理解してみたので、その備忘録を残す。
关于Kubernetes。
“Kubernetes是什么?可参考官方文档或以下内容。”
我打算在后续中创建一个实际的清单文件并尝试创建Kubernetes对象。
创建一个初次使用的清单文件来制作一个Hello World容器。
我觉得与其讨论什么是“Manifest文件”,不如先去看一下实物,然后再来了解“Manifest文件”的内容构成等等。
以下是创建Pod的清单文件。
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test
namespace: default
labels:
env: study
spec:
containers:
- name: hello-world
image: hello-world
整个源代码如下。
应用上述清单文件,创建并检查和删除Pod(在下面的“Kubernetes资源(可创建的对象类型)”章节中详细说明)。下面的章节将详细介绍接下来做了什么等细节。
[root@control-plane docker-kubernetes]# kubectl apply -f pod.yaml
pod/test created
[root@control-plane docker-kubernetes]# kubectl get -f pod.yaml
NAME READY STATUS RESTARTS AGE
test 0/1 CrashLoopBackOff 1 11s
[root@control-plane docker-kubernetes]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/test 0/1 Completed 3 63s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d13h
[root@control-plane docker-kubernetes]# kubectl delete -f pod.yaml
pod "test" deleted
[root@control-plane docker-kubernetes]# kubectl get pods
No resources found in default namespace.
[root@control-plane docker-kubernetes]# kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d13h
“什么是清单文件?”
首先,Kubernetes提供了一个名为kubectl的命令行工具,用于操作基于Kubernetes API的Kubernetes(在Kubernetes API的参考文档中,所涵盖的内容可以通过kubectl实现)。

・参考:什么是Kubernetes集群。
配置文件的结构

※ 这个由3个模块组成的部分,作为yaml字段是必需的项目将包括以下4个字段(请参考官方)。
· apiVersion :应用程序接口版本
· kind :类型
· metadata :元数据
· spec :规范
• 参考:必填字段
物体的种类
在原样的基础上,这是一个用于设置想要创建的对象类型的字段。具体来说,可以使用”apiVersion”和”kind”进行指定。
API版本


apiVersion: networking.k8s.io/v1
kind: Ingress
友善
どの種類のオブジェクトを作成するか?を設定するもの。指定できるものはリソースタイプ一覧に書かれている(kubectlで”kubectl api-resources”としてもリソース一覧を確認できる)。
我需要创建一个Pod对象,所以指定了Pod。
元数据
オブジェクトを一意に特定するための情報で、”name”、”namespace”、”labels”というフィールドで設定する。
命名空间、名称
API Conventions(GitHubのページ)を読むと、namespace, name, uidのいずれも必須と書かれているが、以下の理由からnamespaceとuidは省略可能。
・命名空间:如果未指定,默认分配一个名为”default”的命名空间(以下为引用自官方)。
默认的命名空间是’default’。
・uid:kubernetesで自動生成するため(以下、公式からの引用)
Kubernetes生成的字符串用于唯一标识对象。
今回は特に意味のある名前を付けなくてもいいのでnameは”test”として、namespaceは”default”とした(namsespaceは何も指定しなければ”default”になるので書かなくてもいいが)。
顺便提一下,根据上述情况,可知名称不能省略,但实际上,如果将名称注释掉并执行”kubectl apply -f pod.yaml”,将会出现以下错误(如下所示的标签是选项中要查看的内容)。
[root@control-plane docker-kubernetes]# kubectl apply -f pod.yaml
error: error when retrieving current configuration of:
Resource: "/v1, Resource=pods", GroupVersionKind: "/v1, Kind=Pod"
Name: "", Namespace: "default"
from server for: "pod.yaml": resource name may not be empty
apiVersion: v1
kind: Pod
metadata:
# name: test
# namespace: default ← 省略可なのでコメントアウト
# labels: ← 省略可なのでコメントアウト
# env: study
spec:
containers:
- name: hello-world
image: hello-world
可以从GitHub页面中的“Kubernetes API Conventions”章节中的“spec(仕様)”和“status(状态)”部分跳转。
spec、status、metadataに関するさらなる情報は、Kubernetes API Conventionsをご確認ください。
labels
ユーザーによる整理を目的としたもので、してしなくも問題ないもの。今回はあえて勉強用のものだよという意味を持たせるために、env(環境)というキーにstudyを設定してみた。
标签是为最终用户的组织目的而设计的。
・参考:ラベル(Labels)とセレクター(Selectors)
定义所创建对象的理想状态。
これは少しわかりにくいが、そもそもkubernetesの思想としては、ある状態を維持するように自動で色々調整する事で、人が何かをしなくても済む=運用を楽にする、というものがある。具体的には公式に以下のように書かれている通り、色々なリソースに対してこうなっていてほしいを設定していく。
実行したいアプリケーションやその他のワークロード、使用するコンテナイメージ、レプリカ(複製)の数、どんなネットワークやディスクリソースを利用可能にするかなど
规格
上記で見てきた、理想の状態を実際に定義するフィールド。どんな設定をするのか?は作成するオブジェクトによって様々だが、例えばPodであればPodSpec v1 coreにどんな設定項目があるか?が書かれている。
今回は初めてのマニフェストファイルという事で、特に複雑な設定はしないのでcontainersだけ設定した(containersの中でもさらに設定ができるが、それはContainer v1 coreに書かれている)。具体的にはhello-worldのDockerイメージを使って”hello-world”という名前のコンテナを構築するという設定をしている。
・参考资料:摘要
Kubernetes的资源(可创建的对象类型)。

可以将以下非Pod Kubernetes对象的创建方式列举出来(资源类型列表)已在官方文档中写明。此外,你还可以使用”kubectl api-resources”命令在kubectl中确认资源列表。
[root@control-plane docker-kubernetes]# kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
...

如果您想从kubectl进行确认,则可以通过以下方式进行确认(本例中,我们使用Pod名称”test”创建了一个Pod(在清单文件中的name字段),因此使用”kubectl describe pod test”命令可以查看Pod的详细信息,实际上可以确认存在名为hello-world的容器)。
[root@control-plane docker-kubernetes]# kubectl describe pod test
Name: test
Namespace: default
Priority: 0
Node: control-plane.minikube.internal/192.168.92.128
Start Time: xxx, xx Mar 2022 13:41:35 +0900
Labels: env=study
Annotations: <none>
Status: Running
IP: 172.17.0.3
IPs:
IP: 172.17.0.3
Containers:
hello-world:
Container ID: docker://71582a78517436640864d6061b7cbf29dd34b95b9d491b2000dd0a209dc034b6
Image: hello-world
Image ID: docker-pullable://hello-world@sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
Port: <none>
Host Port: <none>
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: xxx, xx Mar 2022 13:42:29 +0900
Finished: xxx, xx Mar 2022 13:42:29 +0900
Ready: False
Restart Count: 3
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-jb9bf (ro)
...
※公式にも以下のように書かれているが、コンテナはDockerコンテナとは限らないが、はじめのうちはkubernetesのコンテナ=Dockerコンテナというイメージだと理解がしやすいみたいなのでコンテナ=Dockerコンテナでよさそう。
備考: KubernetesはDockerだけでなく複数のコンテナランタイムをサポートしていますが、Dockerが最も一般的に知られたランタイムであるため、Docker由来の用語を使ってPodを説明するのが理解の助けとなります。
・参考:Pod
・参考资料:Pod
・资料参考:Pod
・引用:Pod
・引用资料:Pod
关于kubectl命令
最後,為了從清單文件中創建實際對象,使用kubectl命令,但需要看看該命令執行了什麼操作?
・”使用 pod.yaml 的定义创建 Pod”
・”以纯文本形式列出所有 Pod”
・”使用 pod.yaml 文件中指定的名称删除 Pod”
・参考:kubectl概述
・参考:kubectl参考文档
・参考:示例:常见操作
总结起来
这次跟着kubernetes的Hello World!之后,尝试通过清单文件来创建实际的kubernetes对象。我希望今后可以进一步加深对kubernetes的理解。
给你一些额外的东西
在Pod中真的可以创建多个容器吗?
创建并应用以下类似的清单文件到Kubernetes中,然后尝试使用”kubectl describe pod test”命令进行确认,确实可以确认已经创建了两个容器。
apiVersion: v1
kind: Pod
metadata:
name: test
namespace: default
labels:
env: study
spec:
containers:
- name: hello-world
image: hello-world:linux
- name: centos
image: centos:7
[root@control-plane docker-kubernetes]# kubectl describe pod test
Name: test
Namespace: default
Priority: 0
Node: control-plane.minikube.internal/192.168.92.128
Start Time: xxx, xx Mar 2022 13:49:13 +0900
Labels: env=study
Annotations: <none>
Status: Running
IP: 172.17.0.3
IPs:
IP: 172.17.0.3
Containers:
hello-world:
Container ID: docker://d39b38bed1c62fe56b138ead0a3efb392bba497f722123bd6ea3f2f93cad3c02
Image: hello-world:linux
Image ID: docker-pullable://hello-world@sha256:19c35675aac535e0f5803f12000ed7ffae510a43f1e3a839e7f4a9942a03dace
Port: <none>
Host Port: <none>
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: xxx, xx Mar 2022 13:49:20 +0900
Finished: xxx, xx Mar 2022 13:49:20 +0900
Ready: False
Restart Count: 1
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-jb9bf (ro)
centos:
Container ID: docker://9aa4c62ddfc46e346627d301deca3bc6cf68c719ef8061ebfb28bb2a47412f07
Image: centos:7
Image ID: docker-pullable://centos@sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Port: <none>
Host Port: <none>
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: xxx, xx Mar 2022 13:49:20 +0900
Finished: xxx, xx Mar 2022 13:49:20 +0900
Ready: False
Restart Count: 1
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-jb9bf (ro)
...
Kubernetes配置的补充说明

以下是引自官方的一段话:“但对于minikube,它是一个单节点环境(网络)且没有主节点和工作节点的区别。”
在个人电脑的虚拟机内运行单节点的Kubernetes集群。
実際にkubectlでノードの中身を見てみると、確かに”control-plane.minikube.internal”というノードが見つかり、そのノードには”test”というPodがある事が分かる(Namespaceが”kube-system”であるものはkubernetesによって作成されたオブジェクト)。
[root@control-plane docker-kubernetes]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
control-plane.minikube.internal Ready control-plane,master 48m v1.20.7
[root@control-plane docker-kubernetes]# kubectl describe nodes control-plane.minikube.internal
Name: control-plane.minikube.internal
Roles: control-plane,master
...
Non-terminated Pods: (8 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default test 0 (0%) 0 (0%) 0 (0%) 0 (0%) 39m
kube-system coredns-74ff55c5b-6jz4p 100m (5%) 0 (0%) 70Mi (1%) 170Mi (4%) 48m
kube-system etcd-control-plane.minikube.internal 100m (5%) 0 (0%) 100Mi (2%) 0 (0%) 48m
kube-system kube-apiserver-control-plane.minikube.internal 250m (12%) 0 (0%) 0 (0%) 0 (0%) 48m
kube-system kube-controller-manager-control-plane.minikube.internal 200m (10%) 0 (0%) 0 (0%) 0 (0%) 48m
kube-system kube-proxy-mmczz 0 (0%) 0 (0%) 0 (0%) 0 (0%) 48m
kube-system kube-scheduler-control-plane.minikube.internal 100m (5%) 0 (0%) 0 (0%) 0 (0%) 48m
kube-system storage-provisioner 0 (0%) 0 (0%) 0 (0%) 0 (0%) 48m
...
※下文是关于Kubernetes整体概念的综述。
・参考:Kubernetes 组件