インフラエンジニアのためのKubernetesの基本


Kubernetesって何?をなんとなく理解するために、Kubernetesの動作に焦点を当てて、概要をまとめてみました。

Kubernetesを一言でいうと、

業界標準のOSSのコンテナオーケストレータです。

コンテナ


Kubernetesの理解の為にはコンテナについて知っておく必要があります。
コンテナで何ができるか知ってから、コンテナオーケストレータ(Kubernetes)で何ができるか学びましょう!

コンテナを一言でいうと、

専用のOS上で動いているような分離状態を作り出した、OS上のプロセスです。

このコンテナ上に、開発環境やアプリケーション実行環境、サービスなどを詰め込んで、どこでも実行することができます。

コンテナを動作させる一連の流れ

では実際にコンテナを動作させる一連の流れを見てみましょう!

まずはコンテナ作ってー!とコンテナ係にお願いします。

このコンテナを扱う係の事をコンテナランタイムと言います。

実際には高位ランタイムと中位ランタイム(CRI)と低位ランタイム(OCI)が動作を分担していますが、ここではシンプルに「ランタイム」でまとめて解説します。

よく聞くDockerというのもコンテナランタイムの名前です。
Dockerとはコンテナの事ではなく、コンテナを扱うためのプログラムのことを指すんですね。

コンテナ作成をお願いされたランタイム君は、コンテナの素を探しに展示場に行きます。

このコンテナの素のことをコンテナイメージ、展示場のことをレジストリ(DockerHubなど)と言います。厳密にはレジストリとリポジトリがありますが、ここではシンプルに概念だけつかんでいただけたらと思います。

そしてコンテナイメージを持って帰ってきてコンテナを実行します。

 

もちろんレジストリに無いコンテナイメージも、設計書があれば作成することができます。

この設計書のことをdockerfileと言います。

実際のdockerfileの例です。

FROM centos:7
RUN yum install -y java
RUN touch /tmp/test.txt     # 変更箇所
ADD 

HAなRancherをVirtualBoxで構築しよう

Rancherってなに?


Kubernetes(K8s)を使いやすくするための、OSSのソフトウエアです!

簡単には以下のことができます。

  1. 異なる環境のK8sクラスタの一元管理
  2. K8sクラスタへのアプリの導入
  3. Istio(サービスメッシュ)との連携

うーん、便利そうですけどどうなんでしょう?

という事で、実際に作ってみて触ってみましょう!

Rancherを構築する


Rancherの構築には大きく分けて2種類あります。

  • 単一ノードのRancherをDockerコンテナとして構築する。
  • 高可用性のRancherをKubernetes内に構築する。

Dockerコンテナの方はたくさん記事があり、またIstioなどの機能を試してみたいので、高可用性Rancherの構築を行います!

Rancherの構成


以下の構成でRancherを構築してみようと思います。

  • 基盤: Windows10上のVirtualBox
  • 構成台数:Racher 3台 LB&DNS 1台
  • CPU:3,2,2,1
  • メモリ:4GB x 3, 1GB x 1
  • OS:Ubuntu 18.04
  • Nic:2つずつ(NAT, Internal)
  • ロードバランサ(LB),DNS: LBとDNS用のUbuntuを1台構築します。(cpu=1, memoty =1GB)

Kubeadmで物理・仮想、セグメント跨ぎのハイブリッドクラスタ構築

Kubernetesを学習していて、いくつか疑問が湧いてきました。

  • ネットワークのセグメント跨いだワーカノードの構成は簡単にできるのか
  • GPUを乗せた物理サーバをクラスタに追加して、ポッド上からGPUを使うことはできるのか
  • 仮想サーバと物理サーバを混ぜた構成でクラスタが構築できるのか

これらの疑問を一気に解決するために、新しくKubeadmでクラスタを構築してみました!

結論


思ったより簡単にできます!

難しい内容で、皆様が逃げてしまわないように結論から書きました。

構築支援ツールのkubeadmを使えば比較的簡単に構築できます!
kubeadm偉大ですね。

今回の完成イメージ


別セグメントにある、物理サーバを含めて、Kubernetesクラスタを構築します。
この環境では物理サーバと、その他のVMはルーティングされており、相互に通信ができます。

さて、この環境でKubernetesクラスタを構築していきましょう!

環境

ホスト名cpuメモリGPUOS仮想/物理
controller-002コア2GBなしUbuntu18.04仮想
controller-012コア2GBなしUbuntu18.04仮想
controller-022コア2GBなしUbuntu18.04仮想
worker-00

K8sにPrometheus Operatorを導入して監視する

Prometheusを利用した、kubernetesの監視ってどんな感じなんだろう?
この記事はそんな方にピッタリです!

Prometheusって?


一言でいうと、メトリクスに特化したオープンソースの監視システムです。
 

メトリクスって?

システムの監視には、ロギング、トレーシング、ヘルスチェック、ブラックボックス監視などいろいろなカテゴリがあります。

その中の一つで様々なタイプの情報やイベントを時間の経過とともに管理できる手法が「メトリクス」です。
Prometheusは個別のイベントではなく、システム全体の健全性、挙動、性能などを追跡できます。

 

PrometheusOperatorを構成する


Prometheusを実際にKubernetesと一緒に操作してみようと思うと、Grafanaやexporterのインストール、監視targetの設定など、手を付けなければならないことが多く、途中で挫折してしまうことが多いと思います。

そこで、今回はHelmとPrometheus Operatorを使って、いっぺんに作っちゃいましょう!

 

作業の流れ


作業はkubeadmにて構成済みのkubernetesクラスタで行います。
概要はこんな感じです。

  1. Helmインストール
  2. Prometheusネームスペース作成
  3. Prometheus Operatorインストール
  4. Prometheusダッシュボード表示
  5. Grafanaダッシュボード表示

1.Helmインストール


Helmというのはkubernetesのパッケージ管理ツールです。
RedHatのyum、Debianのaptのようなものです。

helm install を実行すると、K8sクラスタに対してAPIが発行され、K8sクラスタ上にオブジェクトが作成されます。

ここでは、K8sクラスタに対してkubectlでapiを発行することができるノードにて作業を行います。

Helmのtarballをダウンロードして解凍します。

# wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
~
2020-05-20 01:42:31 (59.1 MB/s) - ‘helm-v3.2.1-linux-amd64.tar.gz’ saved 

Kubeadmで構築したクラスタの概要

はじめに


ここでは、オンプレミス環境でkubernetesプロジェクト推奨構成のクラスタを構築できる構築支援ツール[kubeadm]が、どのような動作でクラスタ環境を自動で構築しているのか、

構築支援ツールを利用せずに手動で構築したK8sクラスタと比較して、内部を見てみようと思います。
手動でK8sクラスタを構築した作業は以下の記事で公開しています。
Kubernetes(K8s)を仮想環境でHard Wayに構築してみた

Kubernetesのコンポーネント


K8sは以下のコンポーネントで構成されています。

コントロールプレーン

  • etcd
    クラスタの構成を保存するための分散型キーバリューストア
  • kube-apiserver
    kubectlやほかのコンポーネントとやり取りのためのAPIを提供するコンポーネント
  • kube-controller-manager
    K8s内の様々なコントローラ(DeploymentやDaemonsetなど)を管理しているコンポーネント
  • kube-scheduler
    ポッドをどのノードで起動するか割り当てるコンポーネント
    割り当てだけ行い、各ノードのkubeletがそれぞれ割り当てられたポッドを起動する

ワーカノード

  • kubelet ( + Container Runtime)
    スケジュールされたポッドを起動する
  • kube-proxy
    クラスタ内のサービスと、ポッドネットワーク、クラスタネットワークのルーティングを行う
  • cni plugin
    ワーカノードのポッドネットワークを提供する。

手動で構築したクラスタの場合


Kubernetes The Hard Wayの通りに構築したKubernetesクラスタの場合、各コンポーネントは以下のような構成となっています。

コンポーネント自体は/usr/local/binにバイナリでインストールされていて、systemdのサービスとして起動しています。

コントロールプレーン
#