【Kubernetes】Kubernetes 用語やコマンドの調査メモ

はじめに

業務で Kubernetes を使った環境構築が必要となったため
調べたことをメモっていたら記事にできる量になっていたので
ブログに掲載します。

環境

  • macOS Sierra
  • Google Cloud Platform
    • この環境で確認したものもあるため

前提条件

  • Docker, docker-composeにローカル環境が構築できる知識レベルであること

Kubernetes(クーべネティス または クーバーネティス) 略して k8s

一言で言うとコンテナ周りのことをよろしくやってくれるもの。
横文字で言うと「オーケストレーションツール」。

基本構成

  • 複数サーバでのコンテナ統合管理
  • コンテナ間のネットワーク管理(IPアドレスの管理/ルーティング)
  • コンテナに割り当てるストレージの管理
  • コンテナの負荷分散
  • コンテナの監視
  • 無停止でのアップデート

サーバ構成

マスターサーバ(Kubernetes Master)

Kubernetesクラスタ内のコンテナを操作するためのサーバ。
kubectl コマンドを使ってクラスタを構成したりリソースを操作する際は
マスターサーバがコマンドからのリクエストを行って処理を行う。

ノード(Node)

  • Dockerコンテナを動作させる仮想(物理)サーバ
  • ノードを複数用意して、クラスタを構成する
  • ノードの管理は、マスターサーバが行う

バックエンドデータベース(etcd)

etcd と呼ばれる Key-Value Store(KVS) を使って
クラスタの構成情報をまとめて管理する。

レジストリサーバ(Docker Registry)

クラスタ内で起動するDockerコンテナのもとになるDockerイメージを管理するためのサーバ。
Docker Registry を使って構築することもできる。

用語

クラスタリング

複数サーバを束ねて、利用者や外部のシステムに対して
全体で1台のコンピュータであるかようにみせる技術のこと。

ただし、Dockerコンテナでのクラスタリングの考え方は異なる。
コンテナが稼働するサーバを複数用意して、それぞれのサーバで複数のコンテナを並列稼働する。
何らかの理由で、サーバ上のコンテナが正常動作しなくなった場合、他のサーバで該当の
コンテナを起動し直すことで、アプリケーションのフェイルオーバーを行う。
上記のことやヘルスチェックをオーケストレーションツールによって行われる。

Pod

仮装NIC(プライベートIP)を共有するコンテナ郡をまとめたものをPodと呼ぶ。
k8sはPodの単位でコンテナの作成/開始/停止/削除といった操作を行う。
Pod内のコンテナは同一のノード上に配備される。
また、Pod内のコンテナで共有するディレクトリを配置することも可能。
たとえば、アプリケーションが稼働するコンテナとログ収集ツールを導入したコンテナを
1つのPodにまとめて起動すれば、localhost経由での通信、あるいは、共有ディレクトリを介して
ログ情報をやり取りすることが可能。

Replication Controller

同一構成のPodが指定の数だけ起動している状態を作り出す。
Webサーバが稼働するPodを負荷分散用に複数起動するような際に利用する。

Podを起動する際は Pod単体か Replication Controller 経由で起動するか選べるが
Pod単体で起動した場合、Podの数は動的に増やせない。
なので、本番環境で稼働させるときは、Replication Controllerから起動すること。

Deploymentの設定ファイルを通して、Replication Controllerの設定/管理をする。

なお、今は Replica Sets が次世代のものとなっている。

Deployments

Deploymentsはアプリケーションインスタンスの作成と変更を担う。

Service

Podを起動しただけでは、外部からアクセスできない。
起動中のPodに対して、Serviceを定義することで外部からアクセス可能をIPアドレスを用意される。
複数のPodに対して、これらをまとめた1つのServiceを定義する。
Serviceに対応するIPアドレス+ポート番号にアクセスすると、複数のPodに対する負荷分散が行われる。

新規にPodを起動すると、既存のServiceのIPアドレスとポート番号は、環境変数として
参照できるようになる。また、GKEの環境では、クラスタ内部のDNSを用いて、独自のサービス名による名前解決もできるようになっている。

Ingress

通常、ServiceとPodだけでサービスを稼働させることは可能だが
Ingressを定義することによりInternetとServiceの間に入り接続のルールをまとめることができる。
例えば、HTTPSの負荷分散をすることができる。

秘密情報の管理

k8sでID、パスワードなどの秘密情報を管理する場合 Kubernetes Secrets を使って管理する。

例:staging環境のものを確認

# staging環境のクラスターに接続するための準備
gcloud config set project sample-staging
gcloud container clusters get-credentials sample-cluster --zone asia-northeast1-a

# 秘密情報を確認
kubectl get secrets

# 表示結果
NAME                 TYPE                          DATA      AGE
sample               Opaque                        2         174d
sample2              Opaque                        7         202d
以下略

# 秘密情報の内容を確認
# 例:adminの内容を見る
kubectl get secret sample -o yaml

Helm

Helmとはk8sのパッケージングマネージャーという位置づけ。
apt-get , yumrpm, Homebrew と同等です。

よく使う、使ったコマンド

Kubernetes

コマンド 意味
kubectl run [deployment name / pod name prefix] --image=[image]:[tag] [cmd] クラスタ内でコンテナを作成
kubectl expose [deployment name / pod name prefix] [コンテナ名] --type=[サービスタイプ] サービスを外部公開できるようにする
kubectl get [ingress, services, deployments, pods, secret] リソース一覧
kubectl get secret [リソース名] -o yaml リソース内容をyaml形式で表示
kubectl describe [ingress, services, deployments, pods, secrets/[リソース名]] リソースの詳細情報表示
kubectl exec -it [コンテナ名] /bin/bash Podのコンテナ内でコマンド実行
kubectl proxy ローカルプロキシが起動され、現在参照しているk8sの内容を http://localhost:8001/ui/ で確認できる
echo "[エンコードされた文字列]" | base64 --decode エンコードされた文字列を表示

参考文献