k8sをオンプレで構築する場合（忘備録）

# 概要
##  k8sを一つの`EC2`(オンプレ)に構築する場合(会社の開発環境構築など)
-  例） Aさんは`dev1.xxx`、Bさんは`dev2.xxx`を利用してください

### 簡単手順
1. `golang`、`Docker`と[`k8s`](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)をダウンロードし、手順に沿ってインストールすること
   - [`cri-dockerd`](https://github.com/Mirantis/cri-dockerd)をインストールすること
   - ダウンロード直後にノードが`NotReady`とk8sの状況で`DNS`が動作されてないので[`Calico`](https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart)をインストールすること
   - `kubeadm`を初期化する段階で`--cri-socket=unix:///var/run/cri-dockerd.sock`のオプションが必要になる
1. [`nginx-ingress`](https://kubernetes.github.io/ingress-nginx/deploy/)をダウンロードする、設定を行う
1. `nginx-ingress`をダウンロードしたときに、`nginx-ingress-controller`の`EXTERNAL-IP`は`pending`状況になる
   ```
   NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
   ingress-nginx-controller             LoadBalancer   X.X.X.X          <pending>     80:X/TCP,443:X/TCP           4h59m
   ```
1. [`metallb`](https://metallb.universe.tf/installation/)をダウンロードする、[MetallbのLayer2の設定](https://metallb.universe.tf/configuration/#layer-2-configuration)を行う
1. 設定するときに、昔のバージョンは、IPアドレスの設定をConfigMapですると記載されているが、[バージョンアップで変わった](https://stackoverflow.com/questions/75637481/k3s-metallb-metallb-controller-failed-to-allocate-ip-for-default-nginx-no)ので新しく対応する必要ある
1. layer2モードのため、`IPAddressPool`を作成し、適応する
   ```layer2Conf.yaml
   apiVersion: metallb.io/v1beta1
   kind: IPAddressPool
   metadata:
     name: first-pool
     namespace: metallb-system
   spec:
     addresses:
       - X.X.X.1-X.X.X.2 # こちらのIPアドレスはプライベートIPアドレスの範囲を設定すること
   ```
1. 上記を設定するようになると、EC2に`セカンダリプライベート IPv4 アドレス`を追加する必要がある(ひとつずつ追加する)
1. 上記のIPの設定を行うと、`EXTERNAL-IP`が表示される
1. EC2のユーザを作成(`sudo useradd -G wheel <username>`)し、作成したユーザに交換すること（下記の手順からは各自のユーザから対応です）
1. 上記で作成したユーザでKubeConfigを適応すること
   ```
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
   ```
1. ユーザの権限や設定（Namespaceなど）を各自で設定すること
1. `Deployment`、`Service`を作成する(k8s公式ホームページを参考)
1. `Ingress`を作成する、`Host`と`ALB`と連結する
   - Ingressのホスト欄はRoute53で設定する値と合わせること
   > この段階で、`Aさんはdev1.xxx、Bさんはdev2.xxxを利用してください`などの要件に対応できます
1. ALBのターゲットグループは`IP`を指定`EXTERNAL-IP`を設定すること
1. EC2のユーザ作成し、`Ingress`のところを人によって変える
1. Route53や、ACMの設定もアスタ（*）を活用すること

### ALBの設定で、HTTPポートで入った場合、HTTPSでリダイレクトする
```
HTTPS://#{host}:443/#{path}?#{query}
```

--- 
##### 参考にした記事

https://tech.virtualtech.jp/entry/2022/07/06/120314

https://zenn.dev/vampire_yuta/articles/ccbc57be8e092a

https://stackoverflow.com/questions/75637481/k3s-metallb-metallb-controller-failed-to-allocate-ip-for-default-nginx-no


##### 各自のNsを設定できるようにするKrew

https://krew.sigs.k8s.io/docs/user-guide/setup/install/

https://github.com/ahmetb/kubectx#installation

https://qiita.com/reoring/items/dd4f74dbe09d71929df9

---
# 追記
1. calicoインストール手順として`Taintを削除すること`
   ```
   kubectl taint nodes --all node-role.kubernetes.io/control-plane-
   kubectl taint nodes --all node-role.kubernetes.io/master-
   ```
1. ingress 適応するときに、うまくできてない場合、ログを確認すること
   ```
   kubectl logs ingress-nginx-controller-xxxxx-xxxxx   -n ingress-nginx
   ```
1. [golang最新版](https://discuss.kubernetes.io/t/http-invalid-host-header-error-while-executing-a-command-in-pod/24868)をインストールすると、ダメみたい