高可用性クラスタの展開の実践をKubernetes

序文

その優れたインフラストラクチャ、柔軟な拡張機能、豊富なオーケストレーションアプリケーションモデルのおかげでKubernetes(K8S)は、容器装置の分野でデファクトスタンダードとなっています。ますます多くの企業が、インフラのコンテナアプリケーションとして選択K8Sをこのトレンドを取り入れ、徐々にK8S上に自社のコアサービスを移行します。

可用性は、インフラストラクチャのために非常に重要です。主要なクラウド・コンピューティング・ベンダーがホスティングサービスを高可用性、拡張性のK8Sを導入して、より多くの代表があるアマゾンEKSAzureのKubernetesサービス(AKS) グーグルKubernetesエンジンアリクラウドコンテナサービスKubernetesバージョンようにと。

一方で、パブリッククラウドサービスは繁栄K8Sを開催しましたが、多くの企業はまだ自作のクラスタを求めています。それは、優れたK8Sクラスタ展開シナリオの多数の誕生を促進するために、このような理由のためである、それらの特性は以下のとおりです。

導入シナリオ 機能
Kubeadm 1.公式は、ドメイン知識のK8Sクラスタのライフサイクル管理を提供して展開ツールを制作しました。
2.ツールは、より高いレベルのビルディング・ブロックを組み合わせることが可能であることが意図されています。
Kubespray ベアメタルとAWS、GCE、アズールや他のクラウドプラットフォーム上で展開1.サポートK8S。
2. Ansible脚本に基づくK8Sクラスタデプロイメントタスクを定義します。
3.最も人気のあるLinuxディストリビューションをサポートしています。
コップス 1.だけAWS、GCEおよびその他のいくつかのクラウドプラットフォーム上で展開K8Sをサポートしています。
2.同期状態モデルに基づいて、およびドライラン自動冪等のため。
3.テラフォームが自動的に設定を生成することができます。
ランチャーKubernetesエンジン(RKE) 1.よく知られたオープンソースのエンタープライズ管理プラットフォームコンテナランチャー軽量K8Sは、インストールツールを提供しています。
ベアメタル、仮想マシン、およびパブリッククラウドの管理に配備2.サポートは、クラスタをK8S。

上記溶液中に、使用および柔軟性の容易さという利点をRKE。この記事では、本明細書で使用されるRKE、RKEのバージョンによって高可用性クラスタK8Sを展開する方法を教えてv0.2.2

高可用性クラスタアーキテクチャのK8S

まず、高可用性アーキテクチャのK8Sクラスターの特性を理解する必要があり、次の図は、高可用性クラスタアーキテクチャ図の公式推奨です。

k8s_arch

核となるアイデアは、単一障害点を排除し、構成要素の様々なタイプのK8Sマスタノード高可用性を作ることです。

  • apiserver-KUBE -外国さらさK8SのAPIは、クラスタ全体の入り口を訪問することです。apiserverステートレス自体ので、ロードバランサと一緒に、高可用性の複数のインスタンスを開始することができます。
  • ETCD -オブジェクト、データセンター全体のクラスタの設定およびステータス情報を格納するためのネットワーククラスタK8S。これは、奇数etcd、信頼性のデータ記憶層の冗長なインスタンスを起動することによって確立することができます。
  • スケジューラ-KUBE - PODは、彼らのための実行を作成し、新規ノードを選択します。クラスタが一つだけアクティブKUBE-スケジューラインスタンスを持つことができ、あなたは、同時に複数のKUBE-スケジューラを起動して、高可用性を実現するためにリーダー選挙の機能を使用してすることができます。
  • コントローラManagerのKUBE -内部クラスタ管理コントロールセンター。クラスタが一つだけアクティブKUBE-コントローラ・マネージャーのインスタンスを持つことができ、あなたは、高可用性を実現するために複数の同時KUBE-コントローラマネージャと選挙関数の使用のリーダーを開始することができます。

また、Shihaiは、以下の質問に注意することは、クラスタを構築します。

  • 信頼性は、ノード上のプロセスをK8S。kubeletする必要があり、KUBE-スケジューラ、KUBE-コントローラマネージャおよび他のプロセスが失敗した後、自動的に再起動することができます。
  • プロセスにおける非ポッドワーカーノードのための予約リソース、リソースノードの不足につながるポッドとリソースの競合からそれらを防ぎます。

RKEはK8Sを使用して高可用性クラスタを構築します

ノード計画

最初のステップは、ノード機能に応じて分割したサーバのクラスタを構築することです、次の表には、作者の環境内のノードの計画を示しています。

IP 役割
192.168.0.10 ノードの展開
192.168.0.11 K8Sマスター - APIサーバ、etcd、スケジューラ、コントローラマネージャ
192.168.0.12 K8Sマスター - APIサーバ、etcd、スケジューラ、コントローラマネージャ
192.168.0.13 K8Sマスター - APIサーバ、etcd、スケジューラ、コントローラマネージャ
192.168.0.14 K8S労働者 - オムレツ、プロキシ
192.168.0.15 K8S労働者 - オムレツ、プロキシ
192.168.0.16 K8S労働者 - オムレツ、プロキシ
192.168.0.17 K8S労働者 - オムレツ、プロキシ

プランの説明:

  1. 個別に選択したマシン192.168.0.10に配備ノードとして。マシンの数が少ない場合は、ノードの展開はK8Sクラスタに追加することができます。
  2. 可用性を確保するためには、K8Sマスターコンポーネントを展開3台のマシンを選択します。条件がマスタで他の成分をetcdと別々に展開することができる場合は、必要なインスタンスの数を制御することで、より柔軟となるよう。例えば、データの信頼性のためにではなく、圧力下でのアクセス要求が比較的高く、その代わりに、追加の機械3がマスター内の他のコンポーネントを選択し展開、5台のETCDマシンを展開することを選択することができます。
  3. K8Sワーカーノードとして残り4台のマシン。ノードの数は、動的に実際の状況に応じて調整します。資源の不足によるポッドが保留状態にあったとき、それは労働者の拡大かもしれません。ノードのリソース使用率が低く、PODは、別のノードで実行するようにスケジュール変更することができ、このノードに存在する場合、それは労働者の減容かもしれません。

環境の準備

ノードの計画が完了すると、環境の準備作業の必要性は、主に次のものが含まれます。

  1. 安装 RKE - 需要在部署节点(192.168.0.10)上安装 RKE 二进制包,具体安装方法可参考 download-the-rke-binary
  2. 配置 SSH 免密登录 - 由于 RKE 通过 SSH tunnel 安装部署 k8s 集群,需要配置 RKE 所在节点到 k8s 各节点的 SSH 免密登录。如果 RKE 所在节点也需要加入到 k8s 集群中,需要配置到本机的 SSH 免密登录。
  3. 安装 docker - 由于 RKE 通过 docker 镜像rancher/hyperkube启动 k8s 组件,因此需要在 k8s 集群的各个节点(192.168.0.11 ~ 192.168.0.17 这 7 台机器)上安装 docker。
  4. 关闭 swap - k8s 1.8 开始要求关闭系统的 swap,如果不关闭,默认配置下 kubelet 将无法启动。这里需要关闭所有 k8s worker 节点的 swap。

配置 cluster.yml

在完成环境准备后,需要通过 cluster.yml 描述集群的组成和 k8s 的部署方式。

配置集群组成

配置文件 cluster.yml 中的 nodes 配置项用于描述集群的组成。根据节点规划,对于 k8s master 节点,指定其角色为controlplaneetcd。对于 k8s worker 节点,指定其角色为worker

nodes:
  - address: 192.168.0.1
    user: admin
    role:
      - controlplane
      - etcd
  ...
  - address: 192.168.0.7
    user: admin
    role:
      - worker

设置资源预留

K8s 的 worker node 除了运行 pod 类进程外,还会运行很多其他的重要进程,包括 k8s 管理进程,如 kubelet、dockerd,以及系统进程,如 systemd。这些进程对整个集群的稳定性至关重要,因此需要为他们专门预留一定的资源。

笔者环境中的 worker 设置如下:

  • 节点拥有 32 核 CPU,64Gi 内存和 100Gi 存储。
  • 为 k8s 管理进程预留了 1 核 CPU,2Gi 内存和 1Gi 存储。
  • 为系统进程预留了 1 核 CPU,1Gi 内存和 1Gi 存储。
  • 为内存资源设置了 500Mi 的驱逐阈值,为磁盘资源设置了 10% 的驱逐阈值。

在此场景下,节点可分配的 CPU 资源是 29 核,可分配的内存资源是 60.5Gi,可分配的磁盘资源是 88Gi。对于不可压缩资源,当 pod 的内存使用总量超过 60.5Gi 或者磁盘使用总量超过 88Gi 时,QoS 较低的 pod 将被优先驱逐。对于可压缩资源,如果节点上的所有进程都尽可能多的使用 CPU,则 pod 类进程加起来不会使用超过 29 核的 CPU 资源。

上述资源预留设置在 cluster.yml 中具体形式如下。

services:
  kubelet:
    extra_args:
      cgroups-per-qos: True
      cgroup-driver: cgroupfs
      kube-reserved: cpu=1,memory=2Gi,ephemeral-storage=1Gi
      kube-reserved-cgroup: /runtime.service
      system-reserved: cpu=1,memory=1Gi,ephemeral-storage=1Gi
      system-reserved-cgroup: /system.slice
      enforce-node-allocatable: pods,kube-reserved,system-reserved
      eviction-hard: memory.available<500Mi,nodefs.available<10%

关于资源预留更详细的内容可参考文章 Reserve Compute Resources for System Daemons

部署 k8s 集群

当 cluster.yml 文件配置完成后,可以通过命令rke up完成集群的部署任务。下图展示了通过 RKE 部署的 k8s 集群架构图。

rke_arch

该架构有如下特点:

  1. 集群中的各个组件均通过容器方式启动,并且设置重启策略为always。这样当他们出现故障意外退出后,能被自动拉起。
  2. Master 节点上的 kube-scheduler、kube-controller-manager 直接和本机的 API server 通信。
  3. Worker 节点上的 nginx-proxy 拥有 API server 的地址列表,负责代理 kubelet、kube-proxy 发往 API server 的请求。
  4. 为了让集群具有灾备能力,master 节点上的 etcd-rolling-snapshots 会定期保存 etcd 的快照至本地目录/opt/rke/etcd-snapshots中。

配置负载均衡器

クラスタの展開が完了したら、APIサーバーによってK8Sにアクセスすることができます。高い可用性のための環境KUBE-apiserverインスタンスに開始複数のは、これらの実施例にロードバランサを設定する必要があります。ここでは192.168.0.10、次のように展開nginxのnginx.conf特定、負荷分散機能を実現する構成です。

...
stream {
    upstream apiserver {
        server 192.168.0.11:6443 weight=5 max_fails=3 fail_timeout=60s;
        server 192.168.0.12:6443 weight=5 max_fails=3 fail_timeout=60s;
        server 192.168.0.13:6443 weight=5 max_fails=3 fail_timeout=60s;
    }

    server {
        listen 6443;
        proxy_connect_timeout 1s;
        proxy_timeout 10s;
        proxy_pass apiserver;
    }
}
...

この場合、異常が発生し、ロードバランサポートアクセスAPIサーバが提供しますUnable to connect to the server: x509: certificate is valid for xxx, not 192.168.0.10これは、ドメイン名またはPKI証明書のAPIサーバに追加し、ロードバランサのIPアドレスを指定する必要があります、あなたは認証を完了するために、cluster.yml項目でこの機能を設定することができます。

authentication:
  strategy: x509
  sans:
    - "192.168.0.10"

cluster.ymlを変更した後、コマンドを実行しますrke cert-rotate

検証

すべての上記の手順を完了した後、コマンドによりkubectl get nodesノードのステータスを表示します。すべてのノードのステータスが準備されている場合は、クラスタの展開の成功を述べました。

NAME            STATUS    ROLES              AGE    VERSION
192.168.0.11    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.12    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.13    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.14    Ready     worker             1d     v1.13.5
192.168.0.15    Ready     worker             1d     v1.13.5
192.168.0.16    Ready     worker             1d     v1.13.5
192.168.0.17    Ready     worker             1d     v1.13.5

概要

牧場主Kubernetesエンジン(RKE)縮小閾値を構成する展開ステップを、簡略化、K8S複雑なディテールを作成したユーザクラスタを遮蔽します。企業の自作K8Sクラスタのニーズを持っている人のために良い選択です。

参考資料

おすすめ

転載: yq.aliyun.com/articles/704946
おすすめ