Prometheusでfederationを実現するまで(k8sクラスタ構築編)

# まえがき

* k8sクラスタ内のリソース状況の監視をしたい
* 諸々の事情があり、クラスタ内のprometheusをシステムのリソース状況の監視に使うことが難しい
* そのためクラスタ外部とクラスタ内にそれぞれprometheusを構築し、クラスタ外のprometheusはfederation機能を用いでクラスタ内のprometheusを参照する

![prometheus-fedaration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172922/32a60f32-e20a-6728-56fb-320a732d4537.png)




# k8sクラスタ構築

今回はmaster1台、worker1台の構成でクラスタを構築していきます。
構築にはkubeadmを使用し、公式のインストールガイトを参照しました。

(参照URL)
* https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
* https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

## 使用した環境
* 使用OS: CentOS7.8
* masterノード
 * ノード名: master1
 * ipアドレス: 192.168.10.11
* wokerノード
 * ノード名: woker1
 * ipアドレス: 192.168.10.21

## hots設定
互いのノードを名前解決できるよう`/etc/hosts`を設定します。

```
cat <<EOF >> /etc/hosts
192.168.10.11 master1
192.168.10.21 worker1
EOF
```


## swap無効化
* swapの無効化
 
```
# swapoff -a
```
* swap領域のマウント無効化

```
# vi /etc/fstab
```
swapの項目をコメントアウト

## dockerインストール
docker公式のインストールスクリプトを用います。

```
$ curl https://get.docker.com | sh

# systemctl enable docker
# systemctl start docker
```

## kubeadmのインストール

### nftablesをバックエンド使用しないようにします。
```
# update-alternatives --set iptables /usr/sbin/iptables-legacy
```

### kubeadm、kubelet、kubectlのインストール
以下はroot権限で実行します。(ヒアドキュメントで記載しているのでプロンプトは省略しています)

```
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

#Set SELinux in permissive mode (effectively disabling it)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet
```

## sysctl周りの設定
以下はroot権限で実行(ヒアドキュメントで記載しているのでプロンプトは省略しています)

```
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
```

自分の環境の場合上記コマンドを実行する前に下記コマンドを実施する必要がありました。

```
# modprobe br_netfilter
```

## クラスタ構築(masterノード)
今回の構築ではCNIにflannelを用います。

### クラスタの初期化を実施 

``` 
# kubeadm init --pod-network-cidr=10.244.0.0/16
```

### kubectl設定

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

### flannelのデプロイメントを適用

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

# kubectl -n kube-system get po -o wide
NAME                              READY   STATUS    RESTARTS   AGE     IP              NODE      NOMINATED NODE   READINESS GATES
coredns-66bff467f8-hx5zw          0/1     Running   0          2m15s   10.244.0.3      master1   <none>           <none>
coredns-66bff467f8-mvnzl          1/1     Running   0          2m15s   10.244.0.2      master1   <none>           <none>
etcd-master1                      1/1     Running   0          2m26s   192.168.10.11   master1   <none>           <none>
kube-apiserver-master1            1/1     Running   0          2m26s   192.168.10.11   master1   <none>           <none>
kube-controller-manager-master1   1/1     Running   0          2m26s   192.168.10.11   master1   <none>           <none>
kube-flannel-ds-amd64-qgldq       1/1     Running   0          43s     192.168.10.11   master1   <none>           <none>
kube-proxy-ttxn8                  1/1     Running   0          2m15s   192.168.10.11   master1   <none>           <none>
kube-scheduler-master1            1/1     Running   0          2m26s   192.168.10.11   master1   <none>           <none>

```
すべてのpodがRunningになっていることを確認。

###　ノード確認
master1のSTATUSが`Ready`であることを確認します。

```
# kubectl get node
NAME      STATUS   ROLES    AGE     VERSION
master1   Ready    master   3m18s   v1.18.2
```

## クラスタ構築(masterノード)

### k8sクラスタにjoin
クラスタ構築(masterノード) > クラスタの初期化を実施
のコマンド実行後に表示された`kubeadm join`
から始まるコマンドを実行

```
# kubeadm join ....
```

### ノード確認
master1とworker1のSTATUSが`Ready`であることを確認します。

```
# kubectl get node
NAME      STATUS   ROLES    AGE     VERSION
master1   Ready    master   5m21s   v1.18.2
worker1   Ready    <none>   62s     v1.18.2
```

#最後に
クラスタ構築は以上です!
次回は構築したk8sクラスタ内にPrometheusを構築、Prometheusのfederation設定をしていきます。

【追記】
次回分公開しました。
https://qiita.com/sinnsa233048/items/7fb3ab5591c5eeecd3b4