はじめてのKubernetes その1

  • 巷では、Kubernetesを使い始めているのでそろそろ勉強する。Dockerは使ったことあるけど、Kubernetesはじめてです。ゆくゆくはGKEで運用するが、まずはMinikubeを使いローカルで勉強する。

  • 環境

    • Mac(mojave)
    • minikube v0.35.0
    • kubernetes v1.13.4

Minikube、kubectl のインストール

# brewを使ってkubernetes-cliをインストール
brew install kubernetes-cli

# Minikubeをインストールする
brew cask install minikube

# minikubeのバージョン確認
minikube version
 minikube version: v0.35.0

# kubectlのバージョン確認
kubectl version --client
 Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.4", GitCommit:"c27b913fddd1a6c480c229191a087698aa92f0b1", GitTreeState:"clean", BuildDate:"2019-03-01T23:34:27Z",  GoVersion:"go1.12", Compiler:"gc", Platform:"darwin/amd64"}

# Minikubeを起動
minikube start

# Minikubeを起動 オプションでcpuのコア数、メモリ、Kubernetesのバージョン、VMなどが指定もできる
minikube start --cpus 2 --memory 4096 --kubernetes-version v1.13.4 --vm-driver virtualbox

# KubernetesのGUIコンソールを起動
minikube dashboard

# ノードを確認
kubectl get nodes

# Minikubeを停止
minikube stop

Pod を作成

  • Manifest を使って Pod を作成する
pod-nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx

apiVersion

  • Object の Group と Version

kind

  • kind は作成する Object 名を指定する。指定については対象の Object の Kind を参照する。今回は Pod を作成するために Pod を指定

metadata

  • metadata は Object の Metadata を指定す
  • matadata.name には今回 nginx のイメージを使った Pod ということで nginx

spec

  • spec はオブジェクトの期待する状態を定義

Container フィールド

  • Container を新しいファイルpod-nginx-container.yamlに設定してみる
pod-nginx-container.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-container
spec:
  containers:
  - name: nginx
    image: nginx:alpine
    imagePullPolicy: Always
    command: []
    args: ["nginx", "-g", "daemon off;"]
    env:
    - name: HOGEHOGE
      value: fugafuga
    ports:
    - containerPort: 80
      protocol: TCP
    workingDir: /tmp

Container を追加した Pod を作成する

# podを作成
kubectl apply -f pod-nginx-container.yaml

# podを確認
kubectl get all
 NAME                  READY   STATUS    RESTARTS   AGE
 pod/nginx-container   1/1     Running   0          68s

# kubectl exec コマンドで指定のPodの中のコンテナ内のプロセスを確認
kubectl exec nginx-container ps
 PID   USER     TIME  COMMAND
     1 root      0:00 nginx: master process nginx -g daemon off;
     6 nginx     0:00 nginx: worker process
     7 root      0:00 ps

# 環境変数を確認`HOGEHOGE=fugafuga`
kubectl exec nginx-container env
 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 HOSTNAME=nginx-container
 HOGEHOGE=fugafuga
 KUBERNETES_PORT_443_TCP_PROTO=tcp
 KUBERNETES_PORT_443_TCP_PORT=443
 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
 KUBERNETES_SERVICE_HOST=10.96.0.1
 KUBERNETES_SERVICE_PORT=443
 KUBERNETES_SERVICE_PORT_HTTPS=443
 KUBERNETES_PORT=tcp://10.96.0.1:443
 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
 NGINX_VERSION=1.15.9
 HOME=/root

# ワーキングディレクトリを確認
kubectl exec nginx-container readlink /proc/1/cwd
 /tmp

command

  • Entrypoint の配列を指定。要はコンテナで起動させたいプロセスを指定する。

args

  • 引数の配列を指定。このフィールドを省略すると、Docker イメージの CMD が使用される。

env

  • コンテナ内の環境変数を指定する。

image

  • コンテナイメージ名を指定する。

imagePullPolicy

  • コンテナイメージを Pull するポリシーを指定する。以下の 3 つから選択する。
    • Always: 常にコンテナイメージを Pull する
    • IfNotPresent: 既にコンテナイメージがあれば Pull を実行しない
    • Never: Pull を実行しない。ローカルにコンテナイメージがあることを期待する

name

  • コンテナ名を指定する

ports

  • コンテナから expose するポートを指定。
    • containerPort : Pod の IP から Expose するポート番号を指定
    • name : Named Port として利用する際の名前を指定。Pod 内でユニークである必要がある
    • protocol : ポートのプロトコルを指定。 TCP / UDP / SCTP から指定する。デフォルトは TCP
ports:
- name: http
  containerPort: 8080

workingDir

  • コンテナのワーキングディレクトリを指定