【图解】初步了解在GKE中开始使用Kubernetes(k8s)的基础知识
首先
以前からコンテナオーケストレーションツールに興味はあったものの、触る機会が無かったのでこちらの書籍を元に学習してみたので、kubernetesの仕組みを理解するための要点だけを図にまとめてみました。
ハンズオンで分かりやすく学べる Google Cloud実践活用術 データ分析・システム基盤編 Google監修
本記事ではネットワーク、Docker等の前提知識は割愛します。
画像については、引用はせずdraw.ioで描いてるので、見づらい部分があればコメントいただければ幸いです。
1. Kubernetes的特点
kubernetesはコンテナオーケストレーションツールであり、主に以下のような特徴があります。
-
- コンテナを動かすホストである
-
- コンテナをどこに配置するか等のスケジューリングが行える
-
- コンテナ間のサービスディスカバリー(名前解決と通信)
-
- コンテナ間のロードバランシング
-
- オートスケーリング(コンテナ数や1台あたりの性能増減)
- ローリングアップデート(少しずつ新しいコンテナへ入れ替えていく)
2.kubernetesの内部アーキテクチャ
次項のネットワーキング、デプロイフローを見る前に、まずはkubernetesの内部を見ていきます。

ControlPlanes
上図ControlPlanes内の機能は以下の通りです。
Control plane
後述のNodeを制御するための基盤であり、kube-apiserver、kube-controller-manager、kube-scheduler、etcdの4つのコンポーネントで構成されています。
kubectl 命令行工具
kube-apiserverにリクエストを送信するためのCLIツール。
Kubernetesクラスターは、このCLIツールを使うか、マニフェストと呼ばれるyaml形式のファイルによって設定できます。
Kubernetes API服务器
提供Kubernetes各个API的组件,能够被kubectl的API请求以及其他组件访问。
Kubernetes的API资源包括以下内容。
-
- Workload Resources
-
- Service Resources
-
- Config and Storage Resources
-
- Authentication Resources
-
- Authorization Resources
-
- Policy Resources
-
- Extend Resources
-
- Cluster Resources
-
- Common Definitions
- Common Parameters
请将以下内容用中文本地化,只需要一个选项:
参考资料:https://kubernetes.io/docs/reference/kubernetes-api/
参考链接:https://kubernetes.io/docs/reference/kubernetes-api/
Kube控制器管理器
将Deployment控制器和ReplicaSet控制器等按API资源分别执行实际处理的控制器合并到一个二进制文件中。
kube-scheduler 调度器.
向kube-apiserver发送请求,在新创建的Pod中尚未分配节点的Pod上进行调度并分配一个节点。
etcd 可以进行同义替换为:分布式键值存储系统。
Key-Value Store(KVS)用于存储Kubernetes集群的所有信息。
节点
Nodes内的功能如下所示:
节点
Podを実行できる環境、ワーカーマシン。
クラスター内に複数配置でき、NodeごとにNICが割り当てられるため、Node間の通信も可能です。
kube-proxy:Kube 代理
在每个节点上运行的网络代理。当集群IP或节点端口收到来自其他节点或外部的请求时,将其转发到每个Pod。
kubelet是一种用于管理和监控Kubernetes集群中节点的组件。
与Docker或containerd等容器运行时进行配合,来启动或停止Pod。
荚果
基于Kubernetes构建的基本资源是由一个或多个容器组成的。如果在一个Pod中部署多个容器,它们会共享网络接口,并拥有一个IP地址。
附加组件
在 Node 上运行的典型插件包括以下内容:
-
- kube-dns: ServiceリソースのDNS名〜PodのIPアドレスの名前解決をするコンポーネント
- Reconciliation loop: マニフェストの定義と現在の状態を比較して、差分を是正するコンポーネント
理解kubernetes的网络技术
ここでは4つの図からkubernetesのネットワークを見ていきます。
但し、プロキシモードの設定によって図の構成は変わってくるのでご注意ください。
https://kubernetes.io/ja/docs/concepts/services-networking/_print/#virtual-ips-and-service-proxies
こちらのサイトも分かりやすかったので参考になると思います。
https://www.netone.co.jp/knowledge-center/netone-blog/20210715-01/
服务资源
群集内部通信(ClusterIP)
kubernetesはServiceリソースに対してIPアドレスを割り当てており、これをClusterIPと呼びます。
ClusterIPを使うことで、クラスター内部での通信を実現できます。例えばPod間の通信です。

从集群外部的通信(NodePort)。
Serviceの公開タイプにNodePortを設定した場合の説明です。
https://kubernetes.io/ja/docs/concepts/services-networking/service/#nodeport
NodePort为集群外部提供每个节点的IP地址,以便进行访问。
当接收到流量时,它将按照kube-proxy的配置将流量转发到Pod。
此外,kube-proxy似乎还具有数据包过滤功能。
详见:https://kubernetes.io/ja/docs/concepts/overview/components/#kube-proxy

通过负载均衡器实现的L4级别的负载均衡。
如果将Service的公开类型设置为LoadBalancer,下面是对此的说明。
https://kubernetes.io/ja/docs/concepts/services-networking/service/#loadbalancer
接收到流量的负载均衡器会将其分发到每个节点的IP地址上实现负载均衡。

Ingress资源
通过Ingress实现L7级别的负载均衡。
通过使用Ingress,您可以在路径级别上设置分配服务和Pod。为了使用它,您需要准备好Ingress控制器。
参考链接:https://kubernetes.io/docs/concepts/services-networking/ingress/

在上面的例子中,
访问https://example.com/video时,根据kube-proxy的设置将流量转发到紫色的Pod;
访问https://example.com/article时,根据kube-proxy的设置将流量转发到黄色的Pod;
访问https://example.com/shop时,根据kube-proxy的设置将流量转发到绿色的Pod。
4. 理解kubernetes的部署流程
首先,我们来介绍一下图中所示的资源。
副本集
Pod的复制品(副本)管理资源。(类似于AWS的AMI)
在负载均衡和水平扩展(HorizontalPodAutoScaler)时,通常会将ReplicaSet与Service资源结合使用。
ReplicaSet很少单独使用,经常作为Deployment的一部分使用。
部署
部署(Deployment)是对于副本集(ReplicaSet)和Pod进行抽象化的工具。
创建部署后,相应的副本集(ReplicaSet)和Pod会被自动创建。
使用部署(Deployment)而不直接操作副本集(ReplicaSet)和Pod的好处在于,
能够轻松进行滚动更新(逐步替换Pod,通过调整新旧副本集中的Pod数量)和回滚操作。
在这里,我们以创建Pod为例,进行图示说明。

Pod的创建过程将按照以下顺序进行。
-
- 当用户使用kubectl请求创建Deployment或更新清单时,
-
- DeploymentController会检测到Deployment的创建并创建ReplicaSet;
-
- ReplicaSetController会检测到ReplicaSet的创建并创建Pod;
-
- kube-scheduler会检测到新的Pod,并指定执行该Pod的节点;
- 被指定的节点的kubelet会检测到并启动Pod(容器)。
5.GKE(Google Kubernetes Engine)の特徴
KubernetesのマネージドサービスであるGKEは次のような特徴があります。
-
- 構築するのが難しいとされるControl planeの管理が不要
-
- OSSであるKubernetesは四半期に一度マイナーバージョンがリリースされるが、これを自動アップデートする機能がある
-
- 上記に加え、Control planeやNodeのソフトウェアを自動でアップデートする機能がある
-
- Node pool(同じ構成のNodeのグループ)という仕組みにより、ダウンタイムを最小限に抑えながらKubernetesのアップデートができる
-
- Node poolのサイズを自動スケールするCluster Autoscaler
- Node auto-repairという、GKEが修復が必要と判断したNodeを検知して、自動的にドレイン(修復が必要なNode上のPodを別の正常なNodeに追い出す)して、Nodeを再作成する機能がある。
最后
下一步我们将总结如何将Rails应用程序部署到GKE。
即将到来