首次接触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!
首先,作为开始,我想尝试一下传统的“你好世界!”。

在检查命令时,基本上看一下正在做什么。
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这样的东西呢?作为背景,在理解到以前系统运营中的问题后,这一点变得更加明显。从这个角度来总结,可以得出以下结论。

システムのリソースの利用率に無駄がある…

複数のコンテナを共存させ、リソースを最大限効率的に利用できるように!2

突発的な大量アクセスでシステムが応答しなくなった…

システムを構成するサーバーの台数を増やし、システム全体の処理能力を高める事ができるように!(水平スケール)3

突然、一部のシステムがダウンしてしまいサービスが利用不可になってしまった…

システムの稼働状況を監視・必要であれば自動デプロイができるようになり、継続的なサービス運用が可能に!4

リリースのたびにサービス停止が発生してしまう…

複数の稼働中サーバーに対して一定数づつ新しいアプリケーションをデプロイ・リリースができるように!(ローリングデプロイ)
请参阅《Kubernetes是什么?》了解更详细的内容。(日语见此处)
它是通过什么样的机制运作的?


从上面可以看出,kubernetes的每个节点都是实际的服务器(即服务器的实体)。
Kubernetes资源
上述提到了资源服务器是通过什么样的机制工作的,但是在Kubernetes中有什么样的资源(资源服务器上运行的资源)?在这里我们将了解(通过什么样的机制可以通过 kubectl 对资源进行操作和命令,以下是用于管理这些资源的 kubectl 命令)。
以下是一份列表(似乎是这样)。
・ReplicaSet:Podのレプリカ(複製品)の集合
・Deployment:Pod(ReplicaSet)の集合(ReplicaSetを管理するもの)
・StatefulSet:Podの集合。Podの識別子が順序付けされる。サービス・Service:Podの論理的なセットや、そのPodのセットにアクセスするためのポリシー(IPアドレスなど)を定義する。L4ロードバランサー。
・Ingress:L7ロードバランサー。設定・ConfigMap:機密性のない設定情報を保存
・Secret:機密性のある設定情報を保存ストレージ・PersistentVolume:永続データそのもの(実態)
・PersistentVolumeClaim:永続データを要求するもの
-
- 参考:Kubernetesのリソースの一覧と省略形
参考:Kubernetes Components(日本語はここ)
工作负载
Pod直接在中国本土生产。

-
- 参考:Pods(日本語はここ)
- KubernetesのPod機能
复制集合

※ ReplicaSet的存在意义在于,它确保master节点在kubernetes上运行指定数量的副本,即在出现某些故障(如节点故障)导致Pod数量减少时,在其他节点上自动启动Pod以保持副本数,从而增强了容错性(我认为)。
自动维护Pod副本数量,可以说是对Pod进行扩容的一种方式?
-
- 参考:ReplicaSet(日本語はここ)
- 参考:Kubernetesのレプリカセットとデプロイメント
部署

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

※ StatefulSet 与 Deployment 类似,都是 Pod 的集合。它们的区别在于,
-
- DeploymentでReplicaSetを作成(レプリカ)した場合(Deploymentで管理されるPod)→PodにはランダムのIDが付与される
- StatefulSetで管理されるPod→Podには順序付けされた一意の識別子が付与される
这种感觉。
-
- 参考:StatefulSets(日本語はここ)
- 参考:kubernetesのステートフルセットを利用して障害に強いpodを作成する①
服务 (Sā bì sī)
服务

这个服务的必要性是明确指出的,因为Pod本身就散布在各个Node上,所以为了与每个Pod进行通信,需要知道它的IPIP地址。然而,由于Kubernetes的特性,Node的IP地址是不固定的,因此有可能突然无法与Pod通信(需要寻找Pod的IP地址或者持续记录该IP地址)。
因此,为了让客户端能够在意识不到多个Pod和Node的IP地址的情况下通过单一的终端进行通信,需要对Pod和Node进行抽象化,并提供一个单一的终端用于与Pod通信,这就是Service的作用。
-
- 参考:Service(日本語はここ)
- 参考:Kubernetesの Service についてまとめてみた
初始点

-
- 参考:Ingress(日本語はここ)
- L4 L7ロードバランサーの違いを30秒で
设定
配置映射
保存非机密性设置信息的资源。具体包括环境变量、命令行参数以及用于存储在卷内的配置文件。
- 参考:ConfigMaps(日本語はここ)
秘密
用于存储机密情报的资源。具体来说,是用于存储密码、OAuth令牌、SSH密钥等内容。保存规则是使用Base64编码的字符串进行存储。
- 参考:Secret(日本語はここ)
储存
持久卷层

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

-
- 参考:Persistent Volumes(日本語はここ)
- 参考:Kubernetes道場 12日目 – PersistentVolume / PersistentVolumeClaim / StorageClassについて
Kubernetes网络的形象




※kubernetesでHello World!を実行した環境のネットワークとしては、以下のようにマスターノード/ワーカーノードの区別がないシングルノードのネットワークとなる(以下、公式からの引用)。
在PC上的虚拟机内运行单节点的Kubernetes集群

文献引用
-
- Kubernetesとは何かを図でわかりやすく解説!Pod、Namespaceも
- Kubernetes上のコンテナをIngressでインターネットに公開するまで