
6月6日、ロシアのインターネットテクノロジーフェスティバル(RIT ++ 2017)の一環として開催されたRootConf 2017カンファレンスで、「継続的な展開と展開」セクションで「小規模プロジェクトでのKubernetesの経験」というレポートが作成されました。 デバイス、操作の原則、Kubernetesの主な機能、および小規模プロジェクトでのこのシステムの使用方法について説明しました。
伝統的に、私たちはレポート (約1時間、記事よりもはるかに有益)とテキスト形式での主な絞り込みのビデオを提示して喜んでいます。
背景
最新のインフラストラクチャ(Webアプリケーション用)は、1台のサーバーにDBMSを備えたバックエンドから、使用されるサービスの大幅な増加、仮想マシン/サーバーへの分離、負荷分散と水平スケーラビリティを備えたクラウドソリューションへの移行、そしてマイクロサービスへと長い道のりを歩んできました。
最新のマイクロサービスインフラストラクチャの運用では、アーキテクチャ自体とそのコンポーネントの数に起因する多くの困難があります。 以下とそれらを区別します。
- ログの収集。
- メトリックのコレクション。
- 監督(サービスの状態を確認し、問題が発生した場合にサービスを再起動します);
- サービス発見(サービスの自動発見);
- インフラストラクチャコンポーネントの構成の更新の自動化(新しいサービスエンティティを追加/削除する場合);
- スケーリング
- CI / CD(継続的インテグレーションと継続的デリバリー);
- ベンダーロックイン(選択した「ソリューションプロバイダー」への依存について話している:クラウドプロバイダー、ベアメタル...)。
レポートのタイトルから簡単に推測できるように、Kubernetesシステムはこれらのニーズに対する答えとして登場しました。
Kubernetesの基本
Kubernetesアーキテクチャは全体として、マスター(複数ある場合もあります)と多くのノード(最大5000)のように見え、それぞれにインストールされます:
- Docker、
- kubelet(Dockerが管理)
- kube-proxy(iptablesを管理)。
マスターには:
- APIサーバー
- etcdデータベース
- スケジューラー(コンテナーを開始するノードを決定します)
- コントローラーマネージャー(フォールトトレランスを担当)。
これらすべてに加えて、kubectl管理ユーティリティとYAML(宣言型DSL)形式で記述された設定があります。

使用に関しては、Kubernetesはこれらすべてのマスターとノードを組み合わせたクラウドを提供し、インフラストラクチャの「ビルディングブロック」を実行できるようにします。 このようなプリミティブには次のものが含まれますが、これらに限定されません。
- コンテナ -イメージ+起動されたコマンド。
- under (ポッド;文字通り「ポッド」と翻訳) -共通のネットワーク、1つのIPアドレス、および他の共通の特性(共有データストア、ラベル)を持つコンテナのセット(1つ) 注: Kubernetesを実行できるのは(個々のコンテナではなく)囲炉裏です。
- ラベルとセレクター (ラベル、セレクター) -ポッドおよびその他のKubernetesプリミティブに割り当てられた任意のキー値のセット。
- ReplicaSet-多くのポッド。その数は自動的にサポートされます(構成内のポッドの数を変更するとき、ポッド/ノードが落ちるとき)。これにより、スケーリングが非常に簡単になります。
- 展開 -ReplicaSet + ReplicaSetの古いバージョンの履歴+バージョン間の更新プロセス(継続的な統合の問題を解決するために使用-展開);
- サービス (サービス) -DNS名+仮想IP +セレクター+ロードバランサー(セレクターに適したポッドで要求を分散させるため);
- タスク (ジョブ) -ポッドの成功と成功のロジック(移行に使用);
- cronタスク (CronJob)-crontab形式のジョブとスケジュール。
- ボリューム (ボリューム) -サイズ、アクセスの種類(ReadWrite Once、ReadOnly Many、ReadWrite Many)、ストレージの種類(19の実装方法がサポートされています:鉄、ソフトウェア、クラウド)を使用してデータストアを(囲炉裏、ReplicaSetまたはDeploymentに)接続します;
- StatefulSet-多くのポッドはReplicaSetに似ていますが、厳密に定義された名前/ホストを使用して、これらのポッドが常に相互に通信できるようにし(ReplicaSetの名前は毎回ランダムに生成されます)、別々のボリューム(ReplicaSetの場合のように1つではありません) ;
- Ingressは、外部ユーザーがアクセスできるサービスであり、ルールに従って(ホスト名やURLに応じて)すべてのサービスリクエストを分散します。
YAML形式の囲炉裏とReplicaSetの説明の例:
apiVersion: v1 kind: Pod metadata: name: manual-bash spec: containers: - name: bash image: ubuntu:16.04 command: bash args: [-c, "while true; do sleep 1; date; done"]
apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: backend spec: replicas: 3 selector: matchLabels: tier: backend template: metadata: labels: tier: backend spec: containers: - name: fpm image: myregistry.local/backend:0.15.7 command: php-fpm
これらのプリミティブは、いくつかの例外を除いて上記のすべての呼び出しに応答します:構成の更新の自動化は、Dockerイメージのアセンブル、新しいサーバーの注文、それらへのノードのインストールの問題を解決しません。CI/ CDでは、準備作業(CIインストール、アセンブリルールの説明Dockerイメージ、KubernetesでのYAML設定の展開)。
私たちの経験:アーキテクチャとCI / CD
小規模プロジェクトとは、小規模(最大50ノット、最大1,500炉床)および中規模(最大500ノット、最大15,000炉床)を意味します。 次のような3つのハイパーバイザーで最小のベアメタルプロジェクトを作成します。

Ingressコントローラーは3つの仮想マシンに
kube-front-X
ています(
kube-front-X
):

(図に示されているPacemakerの代わりに、VRRP、ucarp、またはその他のテクノロジーが存在する可能性があります。特定のデータセンターに依存します。)
継続的デリバリーチェーンは次のようになります。

説明:
- 継続的な統合には、GitLabを使用します。
2019年8月16日更新 :GitLabの使用方法に関するフォローアップ資料もご覧ください:
- 「本番環境での継続的な統合と配信のためのGitLab CI」: パート1:パイプラインとパート2:困難を克服する 。
- 「 KubernetesとGitLabによるCI / CDのベストプラクティス(レビューとビデオレポート) 。」
- Kubernetesでは、各回路の環境を設定します(生産、ステージング、テストなど。その数は特定のプロジェクトによって異なります)。 同時に、異なるループを異なるKubernetesクラスター(異なるハードウェア上および異なるクラウド内)で処理でき、GitLabではデプロイが構成されます。
- Gitでは、Dockerfile(または、代わりにdappを使用)とYAML設定の.kubeディレクトリを配置します。
- コミットするとき( ビルド段階)、Dockerレジストリに送信されるDockerイメージを作成します。
- 次に(ステージテスト )このDockerイメージを取得し、テストを実行します。
- .kubeディレクトリからYAML構成をリリース(リリース段階)すると、kuberctlesがそれらをKubernetesに送信します。その後、Dockerイメージがダウンロードされ、YAMLから構成によってデプロイされたインフラストラクチャで起動されます。 以前はHelmを使用していましたが、現在はdappツールを完成させています。
2019年8月16日更新 :現在、dappプロジェクトは実稼働で使用されており、 werfと呼ばれています。 - したがって、Kubernetesは最後の段階( 操作 )を完全に担当します。

小規模プロジェクトの場合、インフラストラクチャは、構成されたストレージ(Ceph、AWS、GCE ...)とIngressコントローラーを備えたコンテナークラウド(実装はセカンダリ-利用可能なハードウェアとニーズに依存)のように見え、(このクラウドに加えて)追加の仮想マシンを起動して実行できますKubernetes内に配置しないサービス:

おわりに
私たちの観点からすると、Kubernetesはあらゆる規模のプロジェクトで使用するために成熟しています。 さらに、このシステムは、フォールトトレランスと水平スケーリングを備えたプロジェクトを非常にシンプルで信頼性の高いものにする非常に最初からの絶好の機会です。 主な落とし穴は人的要因です。小さなチームにとっては、必要なすべての問題を解決するスペシャリストを見つけることは困難です(広範な技術的知識が必要です)、または彼は高価すぎます(すぐに退屈します)。
ビデオとスライド
パフォーマンスのビデオ(約1時間)がYouTubeに公開されました 。
レポートのプレゼンテーション:
継続
このレポートに関する最初のフィードバックを受け取ったので、開発者向けに、このシステムのデバイスについて詳しく説明するKubernetesに関する特別な一連の紹介記事を準備することにしました。 今後数週間以内に開始します-ブログの更新をお楽しみに!
PS
以下のブログだけでなく、CI / CDについてもお読みください。
- 「 WerfはKubernetesのCI / CDツールです(レビューおよびビデオレポート) 」 (Dmitry Stolyarov、2019年5月27日、DevOpsConf) 。
- “ データベースとKubernetes ” (Dmitry Stolyarov; 2018年11月8日HighLoad ++) ;
- 「 KubernetesとGitLabでのCI / CDのベストプラクティス 」 (Dmitry Stolyarov; 2017年11月7日HighLoad ++) ;
- 「 小規模プロジェクトでのKubernetesでの経験 」 (Dmitry Stolyarov、2017年6月6日、RootConf)
- 「 手頃な価格のサービスとしてKubernetesを使用したインフラストラクチャ 」
- 「 CI / CDのDockerイメージをdappで迅速かつ便利に収集します 」 (Dmitry Stolyarov、2016年11月8日、HighLoad ++) 。
- 「 Dockerによる継続的デリバリーの実践 」 (Dmitry Stolyarov、2016年5月31日、RootConf) 。