Kubernetesハンズオンを私の所属する研究室で行いました。
我ながら入門者にはとっつきやすい資料ができた気がしたので、Qiitaにも軽く解説を交えつつ貼っておこうと思います。
スライド
初心者による初心者のためのKubernetesハンズオン // Speaker Deck
このハンズオンの対象者
- Kubernetesを始めたばかり or 始めてみたいひと
- 他の解説記事で
kubectl run ...
とかやって一通り試したけど、YMLどうやって書くのかわからなくて困っている人たち
このハンズオンでやらないこと
- Clusterの構築手順
- スライドの最後の方で軽く触れていますが、minikubeを使うのが個人的にはおすすめです。
- Install Minikube | Kubernetes ここにインストール手順が書いています。遅めの回線でも10分ちょっとあれば終わると思います。
- 永続化
- こちらもスライドの最後の方とサンプルのマニフェストでは触れていますが、詳しくは触れていません
解説
ハンズオンでは別の人が、 k8sを構成する概念については説明してくれていた状態だったので、このQiita記事では主にスライド上に登場する概念を解説します。スライド見ながらわからない概念がでてきたらちょくちょく参照してみてください。
私自身も初心者なので、誤りがあればコメント等で知らせていただけると幸いです。
namespace
namespaceという名前の通り、名前空間を切るためのリソース。(k8sでは、「リソース」を組み合わせてアプリケーションを構築していく)
他にも、namespaceごとに権限を付与したり、ということもできる。
Deployment
/ReplicaSet
Deploymentは自体はReplicaSetを持っているだけのリソースである。
ReplicaSetはPod(あとで解説するがとりあえずDockerのコンテナだと思っておけばいい)のレプリカ(複製)の数を管理するリソースで3
とか指定しておくと、常にPodの数を3つに保ってくれる。(Nodeの電源喪失やその他の原因でPodが死んだときには自動でReplicaSetで指定した数にPodがなるようにしてくれる)
では、なぜReplicaSetを持っているだけのDeploymentというリソースが存在するのかというと、世代管理を行う為である。
バージョンアップなどで新しいReplicaSetに変更したときに、Deploymentは徐々に古いPodの数を減らして、新しいPodを配備するということを行ってくれる。(ローリングアップデート)
この恩恵にあずかるために、基本的にはDeploymentを作成することがほとんどのようです。
Pod
Podはk8s上の最小単位。中には1つ以上のDockerコンテナを持っている。
Pod内ではネットワークが共有されるので複数のコンテナで同じポートを使ったりということはできない。
今回の例だとWordPressは本体のコンテナ+MySQLのコンテナを使うことでWordPressを立てる事ができるが、それらを一つのPodに押し込むのはアンチパターン。あくまでもPodは同時に起動していないといけないコンテナを束ねることに留めるのがよい。(というかそうでないとk8sの旨味を味わえない)
Service
Podを束ねるロードバランサー。
今回の例だとこんなマニフェストを書いた。
apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
ports:
- port: 80
targetPort: 80
selector:
app: wordpress
role: web
この例でいくとこのServiceに対するアクセスをapp
ラベルの値がwordpress
かつrole
ラベルの値がweb
であるPodへ分散してフォワードするというような役割を担っている。
そして、もう一つServiceには大事な役割があって、これを作成するとClusterIP
というものがServiceに対して割り当てられる(ClusterIPはクラスタ内からアクセスすることができる仮想的なIPアドレス)のに加えてk8sクラスタ内で稼働しているDNSにService名が登録される。
この仕組みを使うことで他のPodからのアクセスを実現することができる 。今回で言えば、WordPress本体とMySQLの通信にあたる。
Ingress
最初聞いた時、ポケGoの祖先かと思った。
これは、HTTP層のロードバランサー。今回のハンズオンでは、特定のホストで立てたWordPressを公開する目的に使っている。
これは、HTTPを抽象化した概念で、実際の実装はClusterによって異なる。例えば、GKE(Google Kubernetes Engine)だとMaglevというのが実際には使われている。これはすごく高性能なロードバランサーらしい。(使ったことないので知らないけど)
HTTP層なので今回のように、Hostを見てアクセス先を変えるということが可能になるので、これを使ってWordPressを外部公開したというわけ。
いちおうこんな感じ。また何かあったら加筆するかも。