kubernetes-the-hard-way-on-azureやってみた

# kubernetes-the-hard-way-on-azureってなに？
AzureにおいてKubernetes（以降、k8s）を使いたい時の選択肢の一つとしてネイティブなk8s APIを呼び出すことができるAzure Kubernetes Service（AKS）があります。
そんなAKSはどう動いているかというと、NodeやServiceなどk8sの機能を実現するためにVMSSやLoadBalancerが動いているわけです（詳しくは私の[別記事](https://qiita.com/maplejava/items/f5e9ce8ba21afeb02d4b)を参照）。

すると、理屈的には自分でVMSSやLBのサービスを組み合わせてAKSを構築することも可能なわけですよね…？
そう、まさにこの発想に基づいて自分で一からk8s基盤をAzure上で作っちゃおうというのが、kubernetes-the-hard-way-on-azureです（ちなみにAWSやGCP版もあります）。

以下では、そこで必要になった環境構築の部分と構築の中で躓いたポイント、感想を記載します。

https://github.com/ivanfioravanti/kubernetes-the-hard-way-on-azure

# 環境構築

### Azure CLIのインストール

```
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
az --version
```

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-linux?pivots=apt

### tmuxのインストール

```
sudo apt install -y tmux
```

tmuxの使い方がわからない方は私の[別記事](https://qiita.com/maplejava/items/b6089491fe0ff92545f1)を参照してください。

### 証明書関連（CFSSL）のインストール

CloudFlareが開発したTLS/SSL証明書とキーの生成、管理、配付を容易に行うためのツール。

```
wget -q --show-progress --https-only --timestamping \
  https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64 \
  https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssljson_1.6.3_linux_amd64
chmod +x cfssl_1.6.3_linux_amd64 cfssljson_1.6.3_linux_amd64
sudo mv cfssl_1.6.3_linux_amd64 /usr/local/bin/cfssl
sudo mv cfssljson_1.6.3_linux_amd64 /usr/local/bin/cfssljson
```

### kubectlのインストール

```
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
```

# 以降の構築の流れ

ネットワークリソース作る
→VM作る
→証明書の生成や暗号化などセキュリティ周りの設定
→k8sコントローラリリースバイナリのダウンロード、必要なソフトウェアのインストール
という感じで、サイトに従って進めていけば大丈夫です。

最終的にちゃんとk8sが出来上がると感動ですよ！
```
kubectl get pods —show-labels
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/281e5a9b-9770-47b2-4f9c-bd9c583131d1.png)

```
kubectl get pods -o wide
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/448b3a09-6b21-d48f-5229-0a4c870067be.png)


# 躓きポイント
DNSクラスターの構築に必要なcorednsアドオンのデプロイのところで一点躓きました。
ちなみに、corednsとはk8sクラスタ内でDNS名前解決を提供するためのソフトウェアです。これにより、Podは他のPodやServiceに対してDNS名で通信を行うことが可能となります。

[Deploying the DNS Cluster Add-on](https://github.com/ivanfioravanti/kubernetes-the-hard-way-on-azure/blob/master/docs/12-dns-addon.md)

```
kubectl apply -f https://storage.googleapis.com/kubernetes-the-hard-way/coredns-1.8.yaml
```

上記コマンドを実行するとそのようなファイルがないといわれてしまう。

出力
```
error: unable to read URL "https://storage.googleapis.com/kubernetes-the-hard-way/coredns-1.8.
yaml", server reported 403 Forbidden, status code=403
```

以下にそれっぽいファイルがあった。

https://github.com/ivanfioravanti/kubernetes-the-hard-way-on-azure/tree/master/deployments

```
kubectl apply -f https://github.com/ivanfioravanti/kubernetes-the-hard-way-on-azure/tree/master/deployments/coredns.yaml
```

出力

```
error: error parsing https://github.com/ivanfioravanti/kubernetes-the-hard-way-on-azure/tree/m
aster/deployments/coredns.yaml: error converting YAML to JSON: yaml: line 194: mapping values 
are not allowed in this context
```
またダメ…。
が、ファイルを一度wgetでローカルに保存したらできた（リポジトリ全体ではなくファイル単体でダウンロードしたかったためwgetコマンドを使用した）。

なお、coredns.yamlの中を見たところ、coredns.yamlの中にkube-dns.yamlの定義も入っていたので、coredns.yamlのみをapplyすればよさそう。

coredns.yamlのダウンロード

```
wget https://raw.githubusercontent.com/ivanfioravanti/kubernetes-the-hard-way-on-azure/master/deployments/coredns.yaml
```

coredns.yamlのデプロイ

```
ncbpco129@AZ-foo-pc29:~$ kubectl apply -f coredns.yaml 
serviceaccount/coredns created
clusterrole.rbac.authorization.k8s.io/system:coredns created
clusterrolebinding.rbac.authorization.k8s.io/system:coredns created
configmap/coredns created
deployment.apps/coredns created
service/kube-dns configured
```
これでOK！

# 感想
AKSやAzure Container Apps（ACA）など、Azureには便利なk8sプラットフォームがたくさんありますが、運用時のことを考えて、その内部構造をしっかりと理解しておくことは重要ですよね。
その意味で、Hard Wayは自ら作りながらAKSの内部構造を理解することができるので、非常に有用なコンテンツだなと思いました。
基本的にはサイトの通り進めれば構築できますし、Azureに慣れている人であれば、そんなに時間もかからないと思いますので、是非皆さんもやってみてください！