kubernetesは神でした

構造の仕組み

kubernetesは、クラスター(全体)という概念の中で、ノードと呼ばれる複数のサーバ(EC2インスタンスとか)が存在し、各ノードの中でPod(dockerコンテナの塊)というアプリケーションの単位が動いています。

まずは、その概念から説明していきます。

ひとまず

kubernetesを軍隊だと考えてみましょう。

それぞれの概念は、

  • Pod: 歩兵
  • Node: 部隊
  • Masternode: 本陣
  • Cluster: 軍全体

に相当します。(細かいことは分かんないけどイメージで喋ってます)

Pod

Podは一つの論理的なアプリケーションが動く単位です。中身はdockerコンテナが複数入っていて、永続ボリュームや、クラスタ内からアクセスできるプライベートIPアドレスを持っています。

例えば、

  • railsコンテナ
  • mysqlコンテナ
  • redisコンテナ

で動いているアプリケーションAがあったとすると、これら3つのコンテナがPodの中身として作られます。ある意味kubernetesにおける最小単位です。

kubernetes軍においては、歩兵です。

Node

ノードはec2インスタンスなどのサーバ1台分を意味しています。クラスタの中にノードを複数作ることができます。Podはノード上に作られますが、どのノードで動いているかはあまり関係なく、ただのPodがいっぱい入った入れ物にすぎません。

kubernetes軍で言うと、第〇〇隊みたいな感じです。

MasterNode

マスターノードはkubernetes全体の管理を行うノードです。他のノードとは違います。

kubernetes軍の本陣です。脳みそです。

Cluster

クラスターはkubernetes全体を意味しています。

kubernetes軍そのものです。

動きの仕組み

Podとしてdockerコンテナのアプリケーションが動いていても、それに外部からアクセスする仕組みがなければシステムが機能しません

kubernetes軍でいうと、歩兵のAさんに会いに行くためには、「そこまで連れて行ってくれる人」が必要だということです。

Service

サービスは、目的のPodにアクセスするための手段です。PodはIPアドレスがありますが、レプリカが増えたり減ったりするので、やはり、いい感じに狙ったPodの種類へアクセスできる手段が必要となります。Serviceはその機能を担っています。

https://kubernetes.io/docs/concepts/services-networking/service/

サービスは「そこまで連れて行ってくれる人」です。

Controller

コントローラーはPodの管理を行います。Deployment Controllerは設定ファイルの変更によってPodをいい感じにいじってくれます。Pod単体で設定ファイルを書くこともできますが、Deploymentで書いた方がいいです。(Deployment > Pod)

サンプル

実際に書くとこうなります。

# Deploymentの設定を書いてPodを作る
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx
spec:
  # 多分、何個同じPodを作るかの設定
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      # コンテナの設定
      containers:
      - name: nginx
        image: nginx:1.9.1
        ports:
        - containerPort: 80

--- # ← 別のオブジェクトを定義するときはこれで区切る

# Serviceの設定を書いてPodまでの道を作る
kind: Service
apiVersion: v1
metadata:
  name: nginx-svc
spec:
  selector:
    # 多分、ここでPodの種類を指定
    app: nginx
  # portとかの設定
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

これで、

多分、こんな感じのアプリケーションを作ることができます。

ちなみに

kubernetesは、Podの負荷が高くなったらnodeの中にもっとレプリカを増やします。逆に有り余ったらPodの数を減らします。(それも設定する必要があるかも) それでも足りなくなって、node(Podが動いているインスタンス)も満杯になってしまったらnodeの数も増やします。

歩兵が足りなくなったら、歩兵Aさんを影分身させて増やし、部隊がAさんでいっぱいになったら別の部隊を新設するというイメージですね。