kubernetes-cli インストールします

$ choco install kubernetes-cli
$ kubectl version

Install and Set Up kubectl - Kubernetes

Dashboard をデプロイします

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

kubernetes/dashboard: General-purpose web UI for Kubernetes clusters

ダッシュボードへのプロキシサーバーを立ち上げます

$ kubectl proxy

概要 - Kubernetes Dashboard

Pod

サンプル pod.yaml を実行してみます

kind: Pod
apiVersion: v1
metadata:
  name: example-app
  labels:
    app: example-app
spec:
  containers:
  - name: example-app
    image: nginx:1.7.9
    ports:
    - containerPort: 80

上記 Pod をローカル Kubernetes クラスタ に反映してみます。

$ kubectl apply -f pod.yaml

コンテナが実行状態になったか確認してみます。

$ kubectl get pod
NAME          READY     STATUS    RESTARTS   AGE
example-app   1/1       Running   0          1m

Running になっていますね!

Pod の詳細も見てみましょう。

$ kubectl describe pods/example-app
Name:         example-app
Namespace:    default
Node:         docker-for-desktop/192.168.65.3
Start Time:   Wed, 31 Oct 2018 16:03:20 +0900
Labels:       app=example-app
Annotations:  kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"app":"example-app"},"name":"example-app","namespace":"default"},"spec":{"contai...
Status:       Running
IP:           10.1.0.65
Containers:
  example-app:
    Container ID:   docker://5c6c97e5529785740c06abea2e407d569938f5250b4b12127436b7eb82a0f0cd
    Image:          nginx:1.7.9
    Image ID:       docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 31 Oct 2018 16:03:32 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-8jjjx (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          True
  PodScheduled   True
Volumes:
  default-token-8jjjx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-8jjjx
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason                 Age   From                         Message
  ----    ------                 ----  ----                         -------
  Normal  Scheduled              3m    default-scheduler            Successfully assigned example-app to docker-for-desktop
  Normal  SuccessfulMountVolume  3m    kubelet, docker-for-desktop  MountVolume.SetUp succeeded for volume "default-token-8jjjx"
  Normal  Pulling                3m    kubelet, docker-for-desktop  pulling image "nginx:1.7.9"
  Normal  Pulled                 3m    kubelet, docker-for-desktop  Successfully pulled image "nginx:1.7.9"
  Normal  Created                3m    kubelet, docker-for-desktop  Created container
  Normal  Started                3m    kubelet, docker-for-desktop  Started container

ログを標準出力します

$ kubectl logs -f example-app

オブジェクトを削除します

$ kubectl delete pods/example-app

直後に get pod すると、 Terminating 状態になりました。

$ kubectl get pod
NAME          READY     STATUS        RESTARTS   AGE
example-app   0/1       Terminating   0          9m

しばらくすると、

$ kubectl get pod
No resources found.

削除されました!

Deployment

サンプル deployment.yaml を実行してみます

kind: Deployment
apiVersion: apps/v1
metadata:
  name: example-app-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example-app
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - name: example-app-deploy
        image: nginx:1.7.9
        ports:
        - containerPort: 80
「ラベルが **app: example-app** と一致するポッドが、レプリカ数 **3** で展開される」

Kubernetes API サーバに Deployment マニフェストを送信します。

$ kubectl apply -f deployment.yaml

replicas: 3 のとおり、 3 つ作られていそうです。

$ kubectl get deployments
NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
example-app-deploy   3         3         3            3           1m

Pod も見てみましょう。

example-app-deploy-xxxx というのが 3 つ作られていますね!

$ kubectl get pods
NAME                                  READY     STATUS    RESTARTS   AGE
example-app                           1/1       Running   0          12m
example-app-deploy-576bfb99df-8vtp7   1/1       Running   0          1m
example-app-deploy-576bfb99df-z7twc   1/1       Running   0          1m
example-app-deploy-576bfb99df-zqggg   1/1       Running   0          1m

以下のように情報をまとめて見ることもできます。

このコマンドは今後すごく使いそうです。

$ kubectl get pod,replicaset,deployment
NAME                                      READY     STATUS    RESTARTS   AGE
pod/example-app                           1/1       Running   0          16m
pod/example-app-deploy-576bfb99df-8vtp7   1/1       Running   0          5m
pod/example-app-deploy-576bfb99df-z7twc   1/1       Running   0          5m
pod/example-app-deploy-576bfb99df-zqggg   1/1       Running   0          5m

NAME                                                  DESIRED   CURRENT   READY     AGE
replicaset.extensions/example-app-deploy-576bfb99df   3         3         3         5m

NAME                                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/example-app-deploy   3         3         3            3           5m

Service

サンプル service.yaml を実行してみます

デフォルトの ClusterIP ベースになります。

kind: Service
apiVersion: v1
metadata:
  name: example-service
spec:
  selector:
    app: example-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
$ kubectl apply -f service.yaml
$ kubectl get svc
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
example-service   ClusterIP   10.102.217.235   <none>        80/TCP    35s

svcservices のエイリアスです。

$ kubectl get services

なので、これでも動きます。

Service にアクセスしてみます

Service には Kubernetes クラスタの内部からしかアクセスできません。

なので、プロキシでサービスにアクセスしてみましょう。

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

Welcome to nginx!

nginx の画面が出ればアクセス成功です!

サンプル nodeport-service.yaml を実行してみます

上記の service.yaml に type: NodePort を追加しただけです。

kind: Service
apiVersion: v1
metadata:
  name: example-service
spec:
  type: NodePort
  selector:
    app: example-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
$ kubectl apply -f nodeport-service.yaml
$ kubectl get service
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
example-service   NodePort    10.102.217.235   <none>        80:32342/TCP   18m```

PORT に 80:32342 と書かれており、ホスト側と Service がポートフォワードされています。

Welcome to nginx!

1 つのファイルにまとめて記述してみます

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: example-app-k8s
spec:
  replicas: 1
  selector:
    matchLabels:
      app: example-app-k8s
  template:
    metadata:
      labels:
        app: example-app-k8s
    spec:
      containers:
      - name: example-app-k8s
        image: "example-app:latest"
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: example-app-k8s
spec:
  type: NodePort
  selector:
    app: example-app-k8s
  ports:
  - protocol: TCP
    port: 3000
    targetPort: 3000

ローカルの image を使う場合は、 imagePullPolicy: IfNotPresent を指定します。

読んだ記事

Kubernetesを始めよう! - DMM inside

Kubernetes の Pod / ReplicaSet / Deployment について、ようやく整理できた (入門k8s 読書メモ) - えいのうにっき

Docker for Mac [Edge] で Kubernetes を試してみる - Qiita