试着通过清单文件创建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实现)。

image.png

・参考:什么是Kubernetes集群。

配置文件的结构

image.png

※ 这个由3个模块组成的部分,作为yaml字段是必需的项目将包括以下4个字段(请参考官方)。

· apiVersion :应用程序接口版本
· kind :类型
· metadata :元数据
· spec :规范

• 参考:必填字段

物体的种类

在原样的基础上,这是一个用于设置想要创建的对象类型的字段。具体来说,可以使用”apiVersion”和”kind”进行指定。

API版本

image.png
image.png
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的资源(可创建的对象类型)。

image.png

可以将以下非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
...
image.png

如果您想从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配置的补充说明

image.png

以下是引自官方的一段话:“但对于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 组件

bannerAds