Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
59
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@mogamin3

Kubernetes入門ハンズオン-WordPressを立ててみよう-

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を外部公開したというわけ。


いちおうこんな感じ。また何かあったら加筆するかも。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
59
Help us understand the problem. What are the problem?