首次接触Kubernetes,尝试在Kubernetes上实现“Hello World!”并试图理解基本概念

首先

即使是一个从事应用程序开发的工程师,也需要对基础设施有一定的了解。因此,我决定加深对容器编排的理解,尝试理解kubernetes的基本概念,并将其记录下来。

※以下的操作前提是Docker/Minikube/Kubectl都是可用状态。对于环境搭建的详细步骤,请参考今后的文章。

[root@control-plane docker-kubernetes]# docker version
Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 ...

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  ...
[root@control-plane docker-kubernetes]# kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:59:11Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7", GitCommit:"132a687512d7fb058d0f5890f07d4121b3f0a2e2", GitTreeState:"clean", BuildDate:"2021-05-12T12:32:49Z", GoVersion:"go1.15.12", Compiler:"gc", Platform:"linux/amd64"}

[root@control-plane docker-kubernetes]# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

在Kubernetes中实现Hello World!

首先,作为开始,我想尝试一下传统的“你好世界!”。

image.png

在检查命令时,基本上看一下正在做什么。

kubectl run hello-world –image=hello-world –restart=Never指定したイメージをクラスタ上で実行している–restart=Neverは通常のpodを作成するための引数https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#run

kubectl get podps出力形式で全podのリストを表示※pod or podsなのか良く分かっていない…。podでも一覧が表示されるが、https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#get を見る限りkubectl get podsが正しいのかもしれない

kubectl logs pod/hello-worldPodのログをダンプする(標準出力で)これも公式を見る限り、pod/はなくてもkubectl logs hello-worldでログが見れるのでそれでいいのかもしれないhttps://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs

kubectl delete pod/hello-worldkubectl deleteはファイル、標準出力、またはラベルセレクター、リソースセレクター、リソースを指定して、リソースを削除するコマンドで、今回はpodを削除しているこれも公式を見る限り、pod/ではなくkubectl delete pod hello-worldで削除できたのでそれでいいのかもしれないhttps://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#delete

在后续的章节中,我们将详细讨论在执行命令时出现的诸如Pod之类的Kubernetes概念。

    • 参考:status

参考:Operations(日本語はここ)

基本概念 – Fundamental concept

kubernetes是什么

简言之,这是一种用于部署和管理大量容器的机制,针对实际物理资源。如果只用这句话来概括的话,觉得还是需要稍微详细解释一下相关概念。

首先,为什么出现了Kubernetes这样的东西呢?作为背景,在理解到以前系统运营中的问题后,这一点变得更加明显。从这个角度来总结,可以得出以下结论。

#今までは…kuberbetesになると…1:x:
システムのリソースの利用率に無駄がある…:white_check_mark:
複数のコンテナを共存させ、リソースを最大限効率的に利用できるように!2:x:
突発的な大量アクセスでシステムが応答しなくなった…:white_check_mark:
システムを構成するサーバーの台数を増やし、システム全体の処理能力を高める事ができるように!(水平スケール)3:x:
突然、一部のシステムがダウンしてしまいサービスが利用不可になってしまった…:white_check_mark:
システムの稼働状況を監視・必要であれば自動デプロイができるようになり、継続的なサービス運用が可能に!4:x:
リリースのたびにサービス停止が発生してしまう…:white_check_mark:
複数の稼働中サーバーに対して一定数づつ新しいアプリケーションをデプロイ・リリースができるように!(ローリングデプロイ)

请参阅《Kubernetes是什么?》了解更详细的内容。(日语见此处)

它是通过什么样的机制运作的?

image.png
image.png

从上面可以看出,kubernetes的每个节点都是实际的服务器(即服务器的实体)。

Kubernetes资源

上述提到了资源服务器是通过什么样的机制工作的,但是在Kubernetes中有什么样的资源(资源服务器上运行的资源)?在这里我们将了解(通过什么样的机制可以通过 kubectl 对资源进行操作和命令,以下是用于管理这些资源的 kubectl 命令)。

以下是一份列表(似乎是这样)。

分類リソースの種別ワークロード・Pod:最小単位。コンテナの集合。
・ReplicaSet:Podのレプリカ(複製品)の集合
・Deployment:Pod(ReplicaSet)の集合(ReplicaSetを管理するもの)
・StatefulSet:Podの集合。Podの識別子が順序付けされる。サービス・Service:Podの論理的なセットや、そのPodのセットにアクセスするためのポリシー(IPアドレスなど)を定義する。L4ロードバランサー。
・Ingress:L7ロードバランサー。設定・ConfigMap:機密性のない設定情報を保存
・Secret:機密性のある設定情報を保存ストレージ・PersistentVolume:永続データそのもの(実態)
・PersistentVolumeClaim:永続データを要求するもの
    • 参考:Kubernetesのリソースの一覧と省略形

参考:Kubernetes Components(日本語はここ)

工作负载

Pod直接在中国本土生产。
image.png
    • 参考:Pods(日本語はここ)

 

    KubernetesのPod機能
复制集合
image.png

※ ReplicaSet的存在意义在于,它确保master节点在kubernetes上运行指定数量的副本,即在出现某些故障(如节点故障)导致Pod数量减少时,在其他节点上自动启动Pod以保持副本数,从而增强了容错性(我认为)。

自动维护Pod副本数量,可以说是对Pod进行扩容的一种方式?

    • 参考:ReplicaSet(日本語はここ)

 

    参考:Kubernetesのレプリカセットとデプロイメント
部署
image.png

创建该部署后,只需定义一个理想状态(目标状态),Kubernetes的部署控制器会按照指定的频率将当前状态变更为目标状态。我认为它通常用于实际应用程序的生产发布。

    • 参考:Deployments(日本語はここ)

 

    参考:Deploymentとは
状态集
image.png

※ StatefulSet 与 Deployment 类似,都是 Pod 的集合。它们的区别在于,

    • DeploymentでReplicaSetを作成(レプリカ)した場合(Deploymentで管理されるPod)→PodにはランダムのIDが付与される

 

    StatefulSetで管理されるPod→Podには順序付けされた一意の識別子が付与される

这种感觉。

    • 参考:StatefulSets(日本語はここ)

 

    参考:kubernetesのステートフルセットを利用して障害に強いpodを作成する①

服务 (Sā bì sī)

服务
image.png

这个服务的必要性是明确指出的,因为Pod本身就散布在各个Node上,所以为了与每个Pod进行通信,需要知道它的IPIP地址。然而,由于Kubernetes的特性,Node的IP地址是不固定的,因此有可能突然无法与Pod通信(需要寻找Pod的IP地址或者持续记录该IP地址)。

因此,为了让客户端能够在意识不到多个Pod和Node的IP地址的情况下通过单一的终端进行通信,需要对Pod和Node进行抽象化,并提供一个单一的终端用于与Pod通信,这就是Service的作用。

    • 参考:Service(日本語はここ)

 

    参考:Kubernetesの Service についてまとめてみた
初始点
image.png
    • 参考:Ingress(日本語はここ)

 

    L4 L7ロードバランサーの違いを30秒で

设定

配置映射

保存非机密性设置信息的资源。具体包括环境变量、命令行参数以及用于存储在卷内的配置文件。

    参考:ConfigMaps(日本語はここ)
秘密

用于存储机密情报的资源。具体来说,是用于存储密码、OAuth令牌、SSH密钥等内容。保存规则是使用Base64编码的字符串进行存储。

    参考:Secret(日本語はここ)

储存

持久卷层
image.png
    • 参考:Persistent Volumes(日本語はここ)

 

    参考:Kubernetes道場 12日目 – PersistentVolume / PersistentVolumeClaim / StorageClassについて
持久卷索取
image.png
    • 参考:Persistent Volumes(日本語はここ)

 

    参考:Kubernetes道場 12日目 – PersistentVolume / PersistentVolumeClaim / StorageClassについて

Kubernetes网络的形象

image.png
image.png
image.png
image.png

※kubernetesでHello World!を実行した環境のネットワークとしては、以下のようにマスターノード/ワーカーノードの区別がないシングルノードのネットワークとなる(以下、公式からの引用)。

在PC上的虚拟机内运行单节点的Kubernetes集群

image.png

文献引用

    • Kubernetesとは何かを図でわかりやすく解説!Pod、Namespaceも

 

    Kubernetes上のコンテナをIngressでインターネットに公開するまで
bannerAds