【Kubernetes】Kubernetes 用語やコマンドの調査メモ
はじめに
業務で Kubernetes
を使った環境構築が必要となったため
調べたことをメモっていたら記事にできる量になっていたので
ブログに掲載します。
環境
前提条件
- 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
, yum
や rpm
, 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 | エンコードされた文字列を表示 |