【2021/02】オンプレkubenetesもろもろ構築メモ

オンプレのkubenetesと開発マシンや監視等の環境一式を構築した時のメモ。やったことや見たものをまとめただけのメモになります。

# 構築環境
ESXi上にOSは全てcentos7で構築しています。

# kubenetes(kubeadm)構築

kubeadmで構築をする。公式は若干読みづらいのでQiitaの記事を見比べながら進めました。
ネットワーク部分にはcalicoを使いましたが、calicoのインストールはkubenetesの公式に従って進めています。これは、calicoのバージョンがk8s公式の指示通り入れると古くなりそうな気がしたので、勝手にcalico公式の手順でやろうとしたらうまく上がらなかったためです。

`kubeadm init`を実行するときには以下のようにオプションを指定しました。
この環境ではVMが'10.0.0.0/19'と'192.168.0.0/24'を使っていたのでそれを考慮してCIDRの設定をしています。

```
kubeadm init --apiserver-advertise-address 10.0.0.2 --pod-network-cidr 10.240.0.0/16 --service-cidr=20.96.0.0/12
```

またこれに合わせてcalico.yamlも`CALICO_IPV4POOL_CIDR`を`10.240.0.0/16`に修正しました。


- kubenetes公式
    - https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/
- Install Calico networking and network policy for on-premises deployments
    - https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
- Qiita: ESXi上のCentOS7にKubeadmでKubernetesクラスタを構築する
    - https://qiita.com/yasubehe/items/4f7f95f2a15c4d30022a

# Load Balancer(MetalLB)
k8sのserviceでtype LoadBalancerを使いたいなら、オンプレだとLoad Balancerを自前でなんとかする必要があります。
MetalLBというのを使うと比較的楽に用意できそうなのでこれを使ってみました(L2モード使用)。
install自体はMetalLB公式の手順に従って進めました。MetalLBの仕組みは以下のQiitaがわかりやすかったです。

- MetalLB公式
    - https://metallb.universe.tf/installation/
- Qiita: オンプレK8sで使えるGoogle製External Load Balancer: MetalLB
    - https://qiita.com/tmatsu/items/f45f0ca07b4f8489df85


# 開発マシン
masterノードでは開発をしないので、別途、masterノードにkubectlコマンド投げられる開発マシンを用意します。
開発マシンに公式ドキュメントに従いcurlを使う方法でkubectlをinstall。installしたkubectlコマンドにmasterへの接続設定を行う必要があります。


materノードで

```
kubectl config view --raw
```

表示された内容を開発マシンの`~/.kube/config`を作成し貼り付け。
開発マシンで`kubectl get pod --all-namespaces`とか実行して成功すれば終わりです。

- 公式 kubectlのインストールおよびセットアップ
    - https://v1-18.docs.kubernetes.io/ja/docs/tasks/tools/install-kubectl/


# 動作確認
一通り動くようになったので一旦、動作確認をします。
EKS Workshopというものがありこの中で使われているSampleアプリケーションを動かして確認します。
これを動かすと、ブラウザでデプロイしたecsdemo-frontendからバックエンドと通信している様子がみられる。

- EKS Workshop
    - https://www.eksworkshop.com/beginner/050_deploy/
- sampleアプリ
    - https://github.com/brentley/ecsdemo-nodejs
    - https://github.com/brentley/ecsdemo-frontend
    - https://github.com/brentley/ecsdemo-crystal
    - 各リポジトリの`kubernetes/`ディレクトリ下のマニフェストをapplyして動作確認

# Helmのインストール
HelmはKubernetes用のパッケージマネージャーでこの後のPrometheusの導入にHelmが必要だったので開発マシンにHelmをインストールします。
Helmのリポジトリの初期化も実行。

- 公式 Helmのインストール
    - https://helm.sh/ja/docs/intro/install/
- 公式 Helm チャートリポジトリを初期化する
    - https://helm.sh/ja/docs/intro/quickstart/

# Prometheusで監視

kubernetesの監視はPrometheusが一般的らしいです。今回インストールしているのはPrometheusをOperatorをつかって入れてることになるらしいです(Operatorではない方法もある)。

```
kubectl create namespace prometheus
helm install prometheus stable/prometheus-operator --namespace prometheus
```

grafanaなどのダッシュボードにこのままだとアクセスできません。`kubectl port-forward`を使ってアクセスする方法が紹介されていますが、今回はLoadBalancerがあるので以下のように`kubectl patch`でserviceのtypeをLoadBalancerに変えます。

```
kubectl -n prometheus patch service prometheus-grafana -p '{"spec":{"type": "LoadBalancer"}}'
kubectl -n prometheus patch service prometheus-prometheus-oper-prometheus -p '{"spec":{"type": "LoadBalancer"}}'
kubectl -n prometheus get service # EXTERNAL-IPとPORTを確認。
```

これでブラウザからEXTERNAL-IPとPORTを指定すればダッシュボードが確認できます。grafanaはadmin/prom-operatorでlogin。

- prometheus-operator
    - https://github.com/helm/charts/tree/master/stable/prometheus-operator
- K8sにPrometheus Operatorを導入して監視する
    - http://c.itdo.jp/technical-information/docker-kubernetes/k8s-prometheus-operator/


# 終わり