Kubernetes初心者がインストールからPodを起動させるまで

@ぱんだまと申します。
web系エンジニア歴半年になり、Kubernetesを用いたマイクロサービス開発に興味がでたためこちらをまとめてみました。

##内容
Kubenetesのざっくりとしたまとめ
Kubernetesをローカル上へインストール
kubectlコマンドを叩いてPodを実際に起動してみる

となっています。まだKubernetesを触った事が無い方や入門中の方向けです。
※もし間違っている部分等ありましたらご指摘いただけると幸いです。


#そもそもKubernetesって？
Kubernetesは自動デプロイ、スケーリング、アプリ・コンテナの運用自動化のために設計されたオープンソースのプラットフォームです。Kubernetesによって要求に迅速かつ効率良く対応ができます。Dockerは単一のサーバ上でコンテナを実行することを目的として開発されたものですが、それとは対照的にKubernetesは複数のサーバ上でコンテナを分散実行し、それを管理するためのコンテナオーケストレーション機能が中心となっています。


#Kubernetesの構成
Kubernetesのクラスタは大きくMasterとNodeの2つのコンポーネントと、Kubernetesのクラスタ管理情報を保存するetcdで構成されています。

・コンポーネントの図
![kubernetes-12-638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599304/4571cdf3-fbd3-1a6c-c3a1-78bbf020287a.jpeg)

##Masterコンポーネントのサービス構成

###kube-apiserver 
Kubernetesを操作するためのAPIが実装されたサービスでありMasterコンポーネントのフロントエンドにあたる

###kube-controller-manager
Kubernetesが扱うコンテナを始めとする様々なリソースの状態を管理するサービス

###kube-scheduler
KubernetesのNodeに対するコンテナの割り当てを管理するサービス

###cloud-controller-manager
Kubernetesが連携するクラウドプロバイダのリソースを管理するサービス

##Nodeコンポーネントのサービス構成
###kubelet
Nodeを管理するエージェントサービスであり、Masterコンポーネントと連携してコンテナ実行を管理する。

###kubeproxy
Masterコンポーネントと連携して複数のコンテナへのトラフィック分散を制御するサービス

###Container Runtime
Docker等のコンテナを実行するランタイムサービス

##Kubernetesのメリット
アプリケーションやバッチなどのワークロードを組み合わせてサービスを構成する場合、複数のコンテナを実行して連携する必要があります。Kubernetesは複数のコンテナを実行するのに必要な様々な機能を備えており、これらの機能を利用することで以下のメリットが得られます。

・アプリを迅速に予定通りにデプロイする (コンテナをサーバー群へ展開する)
・稼働中にアプリをスケールする（稼働中にコンテナ数を変更する）
・新機能をシームレスに提供開始する (稼働中にロールアウトする)
・コンテナを共存させて稼働率を高くする

#実際にDockerからKubernetesをインストールしてみる。
ここからは実際にKubernetesをインストールして使用してみましょう！
今回はローカル環境に開発用のKubernetesをインストールする方法となっています。
より本格的に使用する場合は各クラウドプロバイダが提供するkubernetesのサービスを利用したり複数のサーバにKubernetesをインストールしてクラスタを構築する事が必要です。

DockerはKubernetesをサポートしているため設定を有効化するだけでkubernetesをインストールできるみたいです！
(Kubenetesの設定はデフォルトでは無効化されているため次の手順で設定を有効化する必要があります。)

①ツールバーの「preference」から設定画面を開く

②Kubernetesタブを開き「Enable Kubernetes」のチェックボックスを有効化します。

![スクリーンショット 2021-04-10 15.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599304/8951a946-a99f-d605-f3f1-c2dad6afdf8c.png)

③「Apply」をクリックするとKubernetesのインストールが開始されます

④数分でインストール完了しチェックがつきます。
![スクリーンショット 2021-04-10 15.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599304/fbbf8d2e-3bc1-469d-8ba2-b6946bb2bea7.png)

Kubernetesの操作は、専用のコマンドラインクライアントである「kubectl」を使用します。
DockerではKubernetesをインストールするとkubectlも一緒にインストールされるためすぐにコマンドを使う事ができます！
実際にkubectlを使用してKubernetesのクラスタ情報を取得してみましょう。
クラスタ情報は

```
kubectl cluster-info 
```
↑ このコマンドを実行することで使用できます。
このコマンドを実際に入力してみると、、、

```
$ 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'.
```
上記のようにクラスタ情報が取得できたら成功となります！

#DeploymentによるPodの管理
インストールが完了したらKubernetesを使用してコンテナを起動してみます。
Kubernetesは「マニフェスト」と呼ばれる定義ファイルに「リソース」を記述して登録することでコンテナを実行します。リソースはコンテナの管理や設定ファイルの管理といった用途に合わせて様々な種類が用意されており複数のリソースと組み合わせてコンテナの分散実行を実現しています。
コンテナの管理に使用するリソースとして「Pod」があります。Podは１つ以上のコンテナグループを表し、Kubernetesにおけるコンテナ管理の基本単位になっています。
マニフェストに定義したPodをKubernetesに登録することでコンテナを実行できますが複数のコンテナを分散実行するような場合にはその分だけ複数のPodを定義する事になり管理が複雑化します。そこで複数のPodを管理するために「Deployment」がkubernetesには用意されています。

次にDeploymentの定義をKubernetesに登録してコンテナが起動できるかを確認してみます。
まずマニフェストファイルをdeployment.yamlに保存します。

```deployment.yaml
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.15.7
        ports:
        - containerPort: 80

```
上記yamlファイルはnginxのコンテナを実行する設定を記載しています。

次に下記コマンドを使用してKubernetesにマニフェストファイルの内容を登録します。

```
$ kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
```

これでpodの登録が完了しました！
実際に登録されたPodを確認してみましょう。

```
$ kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7d4d8467d9-4748n   1/1     Running   0          4m27s
nginx-deployment-7d4d8467d9-mc5t6   1/1     Running   0          4m27s
nginx-deployment-7d4d8467d9-ppnkg   1/1     Running   0          4m27s
```
無事Podが起動された事が分かります！
次回はもう少しじっくりとkubectlを使ってKubernetesをいじってみたいと思います！
読んでいただきありがとうございました！

##参考文献・サイト
著者　五十嵐 綾様　「みんなのDocker・Kubernetes」　~技術評論社~

今さら人に聞けない Kubernetes とは？
https://qiita.com/MahoTakara/items/85096f8b2632c802ab22