KubeadmでインストールしたAlibaba CloudにKubernetes Clusterをインストールする

このチュートリアルでは、**Kubernetes**の管理をより簡単にするツールであるKubeadmを使ってインストールした**Alibaba Cloud**に**Kubernetes**クラスタをインストールする方法を紹介します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/use-kubeadm-to-create-a-kubernetes-cluster_595282)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#前提条件
このチュートリアルを開始する前に、以下の項目が揃っていることを確認してください。

- 3台の[Alibaba Cloud ECS](https://www.alibabacloud.com/ja/product/ecs)インスタンスがUbuntu 16.04でインストールされており、最低1GBのRAMを搭載しています。
- 3台のサーバーへのルートアクセス
- Dockerイメージからのコンテナ起動経験があること。


具体的には、以下のように3つのサーバーやホストにkube-1、kube-2、kube-3などの馴染みのある名前をつけておくと良いでしょう。

|Server|	Hostname|
|:-----------|------------:|
|1	|kube-01  |
|2	|kube-02  |
|3	|kube-03  |

このチュートリアルでは、3台のホストにマスターと2台のワーカーとしてロールを作成します。Kubernetes クラスタの設定には必須ではありませんが、以下のことを覚えておいてください。

|Assigned roles|	Hostname|
|:-----------|------------:|
|Master	|kube-01 |
|Worker|	kube-02 |
|Worker|	kube-03 |

それでは、サーバーの準備を進めます。

#手順
以下の手順に従って、Kubernetes クラスタを Kudeadm で Alibaba にインストールしてください。

###サーバーの準備
このステップでは、Kubernetes クラスターの設定のためにサーバーを準備します。サーバーを準備する最初のステップは、仮想サーバーに固有のホスト名を設定することです。このチュートリアルでは、kube-1、kube-2、およびkube-3を使用することをお勧めします。また、MACアドレスやその他のユニークな識別子も必要になります。実際には、Alibaba Cloudが自動的にユニークな識別子をサーバに割り当ててくれるので、ホスト名もユニークなものにしておきましょう。

サーバーを準備する次のステップは、Kubernetes API Server用のポート6443とKubelet API用のポート10250をそれぞれ有効にすることです。要件として、以下のコマンドをrootユーザで実行する必要があります。

コマンドを実行します。

```
firewall-cmd --get-Active-zones
```

次に、以下のコマンドを実行してポートを有効にします。

```
firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --zone=public --add-port=10250/tcp —permanent
```

最後に、以下のコマンドを実行してswapパーティショニングをオフにする必要があります。

```
sudo swapon -s
sudo swapoff -a
```

最初のコマンドはスワップリストをチェックし、次のコマンドはスワップリストを無効にします。3つのサーバーインスタンスのすべてのコマンドを繰り返して、次のステップに進みます。しかし、永久的に無効にするには、お気に入りのエディタで `/etc/fstab` ファイルにアクセスする必要があります。

```
sudo nano /etc/fstab
```

次に、以下の行を見つけて、以下のように `a#`コメントをつけます。

```
#/dev/mapper/hakase--labs--vg-swap_1 none swap sw 0 0 0
```

以下のコマンドで保存して終了し、システムを再起動します。

```
sudo reboot
```

###Dockerのインストール
私たちは、コンテナランタイムのために[Docker](https://www.docker.com/?spm=a2c65.11461447.0.0.41a4221fODTEgH)をステップアップし、将来のプロジェクトのために、そしてもちろん、このチュートリアルのレッスンを実演する目的でコンテナを実行するためにDockerをiinstallします。UbuntuサーバーへのDockerのインストールは、3つのサーバーすべてで以下のコマンドを実行するだけで簡単です。

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add ¨C
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
apt-get install -y docker-ce
```

注意したいのは、Kubernetesは最新のDocker Engineのバージョンをサポートしており、新しいバージョンをインストールした場合に競合が発生する可能性があるということです。そのため、インストールされているKubernetesリリースのサポートされているバージョンを確認するようにしてください。

以下のコマンドでDockerのバージョンを確認します。

```
docker version
```

正しいバージョンがインストールされている場合は、間違って更新されてしまい、結果的にKubernetesとの互換性がなくなってしまうことがないように、ホールドする必要があるかもしれません。

```
sudo apt-mark hold docker-ce
```

以下のコマンドでDockerを有効化して起動します。

```
sudo systemctl enable docker
sudo systemctl start docker
```

これでコンテナランタイムがインストールされ、Kubeadmツールキットをデプロイする準備が整いました。

###Kubeadm、Kubelet、Kubectl のインストール
このステップでは、クラスタを構成する 3 台のサーバに SSH 接続し、3 つのコンポーネントをインストールする必要があります。ここでも、これらのコマンドを実行するためには root でログインする必要があります。

したがって、以下のコマンドを Kube-1, Kube-2, Kube-3 で実行してください。

```
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cd /etc/apt
sudo nano sources.list.d/kubernetes.list
```

下の行をファイルに貼り付けてください。

```
deb http://apt.kubernetes.io/ kubernetes-xenial main
```

そして、以下のコマンドを実行します。

```
apt-get update
apt-get install -y kubelet kubeadm kubectl
```

しかし、KubernetesがDockerと互換性のないバージョンにアップデートされないようにしなければなりません。以下のコマンドを実行して、パッケージマネージャを更新して、Kubernetesを潜在的な更新から除外するようにします。

```
sudo apt-mark hold kubelet kubeadm kubectl
```

パッケージが同期していることを確認したので、cgroup ドライバの設定を行います。

###kube-1 でデフォルトの cgroup Driver を設定する
これは必須のステップではなく、このステップを進めるかバイパスするかは、以下のコマンドの結果に依存します。kube-1サーバでは、以下のコマンドを実行します。

```
sudo docker info | grep -i cgroup
```


このコマンドの出力がこの種のものであれば、cgroup の設定が必要になります。

```
Cgroup Driver: cgroupfs
```

ここで、`kubelet`のデフォルトファイルを修正し、上で見たCgroupドライバをインクルードします。お気に入りのエディタ (私は nano を使用しています) で、以下のコマンドを実行します。

```
sudo nano /etc/default/kubelet 
```

ファイルに以下の行を含めてください。

```
KUBELET_KUBEADM_EXTRA_ARGS= - cgroup-driver=< cgroupfs >
```

ここで、以下のコマンドを実行してKubeletを再起動します。

```
systemctl daemon-reload
systemctl restart kubelet
```

これで、次のステップのマスター設定の準備が整いました。

###マスターノードの初期化
kube-1サーバにSSHしてマスターノードを起動します。必要なコマンドは以下の通りです。

```
kubeadm init --pod-network-cidr=192.168.100.10/6433
```

サーバーの準備中に、ポート6443と10250を有効にしました。ここで、上のコマンドの`10.244.0.0.0/16`をIP/ポートの組み合わせに置き換えてください。

上記の`kubeadm init`コマンドを分解してみましょう。

- `--pod-network-cidr`: クラスタのPodネットワークセグメントを定義します。
- `--apiserver-advertis-address`: この引数はKubernetes APIで使用するIPアドレスを定義します。
- `--apiserver-cert-extra-sans`:この引数は、証明書のsansに含まれるIPやドメインを定義し、ホストマシンのホスト名とIP以外の情報を含むようにします。
実行すると、黒い画面に数字が表示され、最後に`Your Kubernetes master has initialized successfully! `となります。また、あなたがマスターにリンクするためにワーカーノードで実行される行を取得する必要があります。

さて、これらのコマンドを実行するためにrootではないユーザを使用している場合は、以下の手順でユーザシェル環境を変更してください。

```
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

先ほども述べたように、ワーカーノードで実行してマスターと連携させるための行も取得しておきましょう。

```
kubeadm join 192.168.100.10/6433--token bkz1q4.yuevvvhvve90jk --discovery-token-ca-cert-hash sha256. F3409C6C295F87249D5C08DA11791F3452950A0ACE646DF2BAD06514940DF847
```

この行は非常に便利で、これがないとワーカーノードをクラスタに参加させることができません。2つのワーカーをリンクする準備のためにコピーしておきましょう。ただし、生成してから24時間以上経過している場合は、以下のコマンドで再生成する必要があります。

```
kubeadm token create --print-join-command
```

さて、次のステップでクラスタネットワークを展開してみましょう。

###Kubernetesクラスタネットワーキングの展開
クラスタネットワークは、ポッド、コンテナ、外部サービスとノード間の通信を容易にします。選択したモデルはFlannelで、以下のコマンドを実行して適用します。

```
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```

ここまででクラスタネットワークの設定を行いましたが、以下のコマンドを実行することで確認することができます。

```
kubectl get deployments --all-namespaces
```

自分のマスターが一覧表示されているはずです。では、ワーカーを追加していきましょう。

###Workerを追加
マスターノードを起動したところ、初期化コマンドが届きました。残りのサーバ（kube-1とkube-2）では、以下のコマンドを実行してWorkerとして追加します。

```
kubeadm join 192.168.100.10/6433--token bkz1q4.yuevvhvve90jk --discovery-token-ca-cert-hash sha256: F3409C6C295F87249D5C08DA11791F3452950A0ACE646DF2BAD06514940DF847
```

注意点として、このステップの前にワーカーノードにDocker、kubeadm、kubernetesをインストールしておく必要があります。コマンドが実行されると、`This node has joined the cluster` というメッセージが表示されるはずです。

すべてのホストにコマンドを繰り返します。

###クラスタの検証
クラスタは、さまざまな理由でセットアップ時に失敗する可能性があります。そのため、すべてのノードが正常に動作していることを確認することが重要です。以下のSSHコマンドでマスターノードから確認します。

```
ssh ubuntu@master_ip
```

次に、以下のコマンドを実行してクラスタの状態を取得します。

```
kubectl get nodes
```

同じような出力を受けるはずです。

```
Output
NAME      STATUS    ROLES     AGE       VERSION
Kube-1    Ready     master     1d        v1.10.1
Kube-2    Ready     <worker>   1d        v1.10.1 
Kube-3    Ready     <worker>   1d        v1.10.1
```

出力がすべてのノードの準備ができていることを示している場合は、いくつかのワークロードの実行に進むことができます。準備ができていない場合は、5分ほど待ってから再度実行してみてください。失敗した場合は、成功するまでインストールを繰り返します。

#結論
このチュートリアルでは、Kubeadmを使用してUbuntuでKubernetesクラスタをセットアップする方法をご案内しました。クラスタに新しいサービスをデプロイしてみて、Kubernetesでの作業を快適にすることができます。Kubernetesは、[Kubernetes公式ドキュメント](https://kubernetes.io/docs/home/)から学ぶことができる機能や大きなアドバンテージを提供しています。アリババクラウドは、これらのKubernetesで作られたコンテナ化されたアプリケーションを実行するための安定した信頼性の高いクラウドプラットフォームを提供しています。

Alibaba Cloudのアカウントをお持ちですか？アカウントにサインアップして、最大1200ドル相当の[40以上の製品を無料で](https://account.alibabacloud.com/register/intl_register.htm?spm=a2c65.11461447.0.0.41a4221fODTEgH)お試しください。Alibaba Cloudの詳細については、「[Get Started with Alibaba Cloud](https://account.alibabacloud.com/register/intl_register.htm?spm=a2c65.11461447.0.0.41a4221fjU1YlU)」を参照してください。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*