Docker/Kubernetes 実践コンテナ開発入門@29日目

Docker/Kubernetes 実践コンテナ開発入門:書籍案内|技術評論社

前回は、主に StatefulSet を使った MySQL アプリケーションを k8s にデプロイしました。

今回は TODO API と Web アプリケーションをデプロイしていきます。

6.4 TODO API を GKE 上に構築する

  • todo-api.yaml
// Serviceは作成されると一意のIPアドレスが割り当てられる
// PodはServiceと通信するように構成でき、Serviceへの通信はServiceのメンバーであるPodに自動的に負荷分散できる
apiVersion: v1
kind: Service
metadata:
  name: todoapi // Serviceの名前
  labels:
    app: todoapi // Serviceのラベル
spec: // Serviceの仕様
  selector:
    app: todoapi // app: todoapiラベルを持つ任意のPodのhttpポート80をターゲットとするサービスを作成
  ports:
    - name: http
      port: 80 // デフォルトではtargetPortフィールドはportフィールドと同じ値で設定される
               // portはServiceのポート => 他のPodがサービスにアクセスする際に使う
               // targetPortはコンテナがトラフィックを受信するポート

---
apiVersion: apps/v1
kind: Deployment // ReplicaSetを管理するリソース
metadata:
  name: todoapi // Deploymentの名前
  labels:
    app: todoapi // Deploymentのラベル
spec:
  replicas: 2 // レプリカ数の指定 nginxとapiのPodがそれぞれ2つ作成される
  selector: // Label Selector
    matchLabels: // 対象とするPodのラベルを指定
      app: todoapi
  template: // Pod Template
    metadata:
      labels:
        app: todoapi // Deploymentの対象となるPod
    spec:
      containers: // 今回のPodはnginxとapiで構成される
      - name: nginx
        image: gihyodocker/nginx:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        env:
        - name: WORKER_PROCESSES
          value: "2"
        - name: WORKER_CONNECTIONS
          value: "1024"
        - name: LOG_STDOUT
          value: "true"
        - name: BACKEND_HOST
          value: "localhost:8080" // APIは同一Pod内に存在するのでlocalhostで名前解決できる
      - name: api
        image: gihyodocker/todoapi:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        env:
        - name: TODO_BIND
          value: ":8080"
        - name: TODO_MASTER_URL
          value: "gihyo:gihyo@tcp(mysql-master:3306)/tododb?parseTime=true"
        - name: TODO_SLAVE_URL
          value: "gihyo:gihyo@tcp(mysql-slave:3306)/tododb?parseTime=true"
  • API アプリケーションを作成
$  kubectl apply -f todo-api.yaml
service/todoapi created
deployment.apps/todoapi created
  • Pod が正常に作成されていることを確認
$  kubectl get pod -l app=todoapi
NAME                       READY   STATUS    RESTARTS   AGE
todoapi-7758d95d4b-kqxpk   2/2     Running   0          61m
todoapi-7758d95d4b-z9ggc   2/2     Running   0          61m

今日の学び

  • リソースが出てくるけど、リソースの概念の大きさとかをイメージできると思い出しやすい。例えば、Deployment は ReplicaSet の上位互換とか、ReplicaSet は Pod の集合体とか。
  • 今までちゃんとマニフェストファイルの書き方とか意味とか調べてなかったけど、kubectl explain が便利。Deployment の metadata の書き方が知りたかったら kubectl explain deployment.metadata で説明が出てくる。
  • また一気に分からない所が出てきて調べてなかったけど、その時点で少しずつ調べながら不足している部分を補填していかないとどんどん分からなくなる。今回はわかる範囲で yaml ファイルにコメントした。
Hugo で構築されています。
テーマ StackJimmy によって設計されています。