【图解】初步了解在GKE中开始使用Kubernetes(k8s)的基础知识

首先

以前からコンテナオーケストレーションツールに興味はあったものの、触る機会が無かったのでこちらの書籍を元に学習してみたので、kubernetesの仕組みを理解するための要点だけを図にまとめてみました。
ハンズオンで分かりやすく学べる Google Cloud実践活用術 データ分析・システム基盤編 Google監修

本記事ではネットワーク、Docker等の前提知識は割愛します。
画像については、引用はせずdraw.ioで描いてるので、見づらい部分があればコメントいただければ幸いです。

1. Kubernetes的特点

kubernetesはコンテナオーケストレーションツールであり、主に以下のような特徴があります。

    • コンテナを動かすホストである

 

    • コンテナをどこに配置するか等のスケジューリングが行える

 

    • コンテナ間のサービスディスカバリー(名前解決と通信)

 

    • コンテナ間のロードバランシング

 

    • オートスケーリング(コンテナ数や1台あたりの性能増減)

 

    ローリングアップデート(少しずつ新しいコンテナへ入れ替えていく)

2.kubernetesの内部アーキテクチャ

次項のネットワーキング、デプロイフローを見る前に、まずはkubernetesの内部を見ていきます。

Kubernetes内部アーキテクチャ.drawio.png

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間の通信です。

Kubernetes ClusterIP.drawio.png

从集群外部的通信(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

Kubernetes NodePort.drawio.png

通过负载均衡器实现的L4级别的负载均衡。

如果将Service的公开类型设置为LoadBalancer,下面是对此的说明。
https://kubernetes.io/ja/docs/concepts/services-networking/service/#loadbalancer

接收到流量的负载均衡器会将其分发到每个节点的IP地址上实现负载均衡。

Kubernetes LoadBalancer.drawio.png

Ingress资源

通过Ingress实现L7级别的负载均衡。

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

Kubernetes Ingress.drawio.png

在上面的例子中,
访问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为例,进行图示说明。

Kubernetes デプロイフロー.drawio.png

Pod的创建过程将按照以下顺序进行。

    1. 当用户使用kubectl请求创建Deployment或更新清单时,

 

    1. DeploymentController会检测到Deployment的创建并创建ReplicaSet;

 

    1. ReplicaSetController会检测到ReplicaSet的创建并创建Pod;

 

    1. 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。

即将到来

bannerAds