taka_rock’s blog

エンジニアの勉強記録

はじめてのKubernetes

About

Kubernetesをはじめて触ってみた。
その際の記録。

環境構築

Docker for MacではKubernetesがサポートされている。
Docker for MacのPreferenceを開き、KubernetesタブからEnable Kubernetesにチェックを入れればKubernetesのインストールが始まり、少し待つとKubernetesが使用できるようになる。とても簡単!
f:id:taka_rock:20191110183857p:plain kubectl cluster-infoコマンドを実行し、次のような結果が返って来れば導入成功!

Kubernetes master is running at https://kubernetes.docker.internal:6443
KubeDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

やってみた

Kubernetsでは「マニフェスト」と呼ばれる定義ファイルに「リソース」を記述して登録することで、コンテナを実行する。

  • Word List
    • Pod
      • コンテナの管理に使用するリソース。1つ以上のコンテナのグループを表し、Kubenetsにおけるコンテナ管理の基本単位である。
    • Deployment
      • 実行するPodの数とそのPodの定義テンプレートを含むリソース。複数のPodを管理する為に使用する。

Podの定義例
nginxコンテナを実行するPodの定義

apiVersion: v1
    kind: Pod
    metadata: 
    name: nginx
spec:
    cantainers:
    - name: nginx
        image: nginx:1.15.7
    ports:
    - containerPort: 80

Deploymentの定義例
ngixコンテナを実行するPodを3個起動する定義

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

コンテナを起動してみる

上記Deploymentの定義を記述したマニュフェストファイルをdeployment.yamlとして保存する。 kubectl applyコマンドを実行してKubenetesにマニフェストファイルの内容を実行する。

kubectl apply -f deployment.yaml

kubectl get podsコマンドを実行してKubenetesのクラスタ上にPodが起動しているかを確認する。
下記のような結果が返って来れば実行成功!

NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-6dd86d77d-5sgtm   1/1     Running   0          100m
nginx-deployment-6dd86d77d-cphxc   1/1     Running   0          100m
nginx-deployment-6dd86d77d-k4kkd   1/1     Running   0          100m

Podと通信してみる

Deploymentを用いてPodを起動し、コンテナを建てられたので実際に通信してみる。

  • Word List
    • Service
      • 複数のPodへの負荷分散を実現する為のリソース
        • Serviceの定義を元にロードバランシングできる

Serviceの定義例
先程のngixコンテナを実行するPodへポート8080への通信をPodのポート80へ転送する定義

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80

Deploymentの登録と同様に、上記Serviceの定義を記述したマニュフェストファイルをservice.yamlとして保存し、kubectl applyコマンドを実行してKubenetesにマニフェストファイルの内容を実行する。

kubectl apply -f service.yaml

kubectl get serviceコマンドを実行してServiceの状態を確認する。

NAME             TYPE          CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes      ClusterIP      10.96.0.1      <none>        443/TCP    20h
nginx-service   LoadBalancer   10.105.91.94   localhost     8080:31494 TCP   102m

nginx-serviceがlocalhost:8080で待ち構えている事が分かる。
実際にhttp://localhost:8080へアクセスし、nginxの標準ページが表示されればService経由でのPodとの通信が成功! f:id:taka_rock:20191110193025p:plain

感想

Docker for MacKubernetesがサポートされている為、とても簡単にHello worldができ、コンテナの複数起動&ロードバランシングもとても簡単に行えた。
更に触れ、実用的なメリットも学んでいきたい。