KubeadmでKubernetesのクラスタ環境をCentOS7.X 上に作る(Single Master)

# 工事中になります。

# ◆目的/ゴール、やりたい結果
 * kubernetes のクラスタ環境を構築する
 * kubeadm で環境を作る

# ◆インストール対象バージョン
 * Kubernetes：1.9.X

# ◆実行環境の整備
※※CentOS をmarketplace から選んでくださーい！！

 * プラットフォーム：AWS
    * Masterノード
      * OS : CentOs7.4
      * スペック：t2.small
      * タグ： Name:k8s-master
      * ホスト名：k8s-master01
    * Workerノード 1号機
      * OS : CentOs7.4
      * スペック：t2.medium
      * タグ： Name:k8s-worker
      * ホスト名：k8s-worker01
    * Workerノード 2号機
      * OS : CentOs7.4
      * スペック：t2.medium
      * タグ： Name:k8s-worker
      * ホスト名：k8s-worker02 

Mater ノードは、AWS セキュリティグループを編集し以下ポートの解放
↓インバウンドを編集

| プロトコル | ポート範囲 | 説明 |
|:-----------:|------------:|:------------|
| TCP        |6443         | Kubernetes API server|
| TCP        |2379-2380    | etcd server client API|
| TCP        |10250        | Kubelet API|
| TCP        |10251        | kube-scheduler|
| TCP        |10252        | kube-controller-manager|
| TCP        |10255        | Read-only Kubelet API|

Woker ノードは、AWS セキュリティグループを編集し以下ポートの解放
↓インバウンドを編集

| プロトコル | ポート範囲 | 説明 |
|:-----------:|------------:|:------------|
| TCP        |10250         | Kubelet API|
| TCP        |10255    | Read-only Kubelet API|
| TCP        |30000-32767    | NodePort Services|


# ◆Mater ノードの構築
## 事前準備

### SELinux を無効化

```file:/etc/selinux/config
SELINUX=enforcing
↓
SELINUX=disabled
```

### 時刻設定
```
# yum -y install chrony
# systemctl start chronyd.service
# systemctl enable chronyd.service
# chronyc sources
```

### タイムゾーン設定
```
# timedatectl set-timezone Asia/Tokyo
```

### hostsファイルを編集
```file:/etc/hosts
172.31.XX.XX k8s-master01
172.31.XX.XX k8s-worker01
172.31.XX.XX k8s-worker02
```

### ホスト名 変更
```
# hostnamectl set-hostname k8s-master01
```

### サーバ再起動
```
# reboot
```

## Materノードの環境構築
### カーネル設定
・カーネルモジュール読み込み

```
# modprobe br_netfilter
# lsmod |grep  br_netfilter
```

・カーネルパラメータ 変更

```file:/etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.default.router_solicitations = 0
net.ipv6.conf.default.accept_ra_rtr_pref = 0
net.ipv6.conf.default.accept_ra_pinfo = 0
net.ipv6.conf.default.accept_ra_defrtr = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.dad_transmits = 0
net.ipv6.conf.default.max_addresses = 1
```

・設定を反映

```
# sysctl --system
```

## docker パッケージのインストール
・リポジトリファイル編集

```file:/etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```

・インストールとサービス起動

```
# yum -y install docker-engine-17.03.0.ce docker-engine-selinux-17.03.0.ce
# systemctl enable docker.service
# systemctl start docker.service
```
※2018年2月現在、17.03.0以上は警告が表示される

## kubeadm とMaster に必要なパッケージのインストール
・リポジトリファイルの編集

```file:/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
```

```
# yum install -y kubelet kubeadm flannel
# systemctl enable kubelet && systemctl start kubelet
```
※この時点では、サービスは上がらなくてもOK

## cgroupドライバを変更する

```file:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
↓
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
```

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

## kubeadmを使ったMasterノードの構築
```
kubeadm init --apiserver-advertise-address=172.31.XX.XX --pod-network-cidr=10.244.0.0/16
```

※apiserver-advertise-addressにmaster のIPアドレスを書く必要あり！
※flannel ネットワークを使う場合、pod-network-cidr指定する必要あり！

成功したら、コンソールに表示される「kubeadm join --token **** 」の一文をメモっておく
※※※※ Sample ※※※※※※※※※※※※
kubeadm join --token xxxxxx.8f60cbe6c2e49xxx 172.31.XX.XX:6443 --discovery-token-ca-cert-hash sha256:963f0fb2ec45588c26a1ab80a67576d29acf1e9d1c601674a7b6091e3533142f
※※※※※※※※※※※※※※※※

## API Server接続用設定を作成
```
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
```

# ◆Woker ノードの構築
 
## 事前準備

### SELinux を無効化

```file:/etc/selinux/config
SELINUX=enforcing
↓
SELINUX=disabled
```

### 時刻設定
```
# yum -y install chrony
# systemctl start chronyd.service
# systemctl enable chronyd.service
# chronyc sources
```

### タイムゾーン設定
```
# timedatectl set-timezone Asia/Tokyo
```

### hostsファイルを編集
```file:/etc/hosts
172.31.XX.XX k8s-master01
172.31.XX.XX k8s-worker01
172.31.XX.XX k8s-worker02
```

### ホスト名 変更
```
# hostnamectl set-hostname k8s-workerXX
```

### サーバ再起動
```
# reboot
```

## Workerノード環境構築
### カーネル設定
・カーネルモジュール読み込み

```
# modprobe br_netfilter
# lsmod |grep  br_netfilter
```

・カーネルパラメータ 変更

```file:/etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.default.router_solicitations = 0
net.ipv6.conf.default.accept_ra_rtr_pref = 0
net.ipv6.conf.default.accept_ra_pinfo = 0
net.ipv6.conf.default.accept_ra_defrtr = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.dad_transmits = 0
net.ipv6.conf.default.max_addresses = 1
```

・設定を反映

```
# sysctl --system
```

## docker パッケージのインストール
・リポジトリファイル編集

```file:/etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```

・インストールとサービス起動

```
# yum -y install docker-engine-17.03.0.ce docker-engine-selinux-17.03.0.ce
# systemctl enable docker.service
# systemctl start docker.service
```
※2018年2月現在、17.03.0以上は警告が表示される

## kubeadm とWokerに必要なパッケージのインストール
・リポジトリファイルの編集

```file:/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
```

```
# yum install -y kubelet kubeadm flannel
# systemctl enable kubelet && systemctl start kubelet
```
※この時点では、サービスは上がらなくてOK

## cgroupドライバを変更する

```file:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
↓
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
```

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

## kubeadmコマンドを使って、クラスタに参加
※メモにとっておいたjoin コマンドを実行
※これはサンプルです。

```
# kubeadm join --token xxxxxx.1f803ac4fac16xxx 172.31.XX.XX:6443 --discovery-token-ca-cert-hash sha256:b57cae62551b3cf2d24d481926dcea4d9808ceca0be2bc2cc607532c5f70373d
```

## API Server 接続用設定を作成
```
# mkdir -p $HOME/.kube
```

```file:$HOME/.kube/config
※master の$HOME/.kube/configの記載をコピー
```

```
# chown $(id -u):$(id -g) $HOME/.kube/config
```

# ◆ここで再び Master ノードで作業
```
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
```

# ◆確認作業
```
# kubectl get pods --all-namespaces -o wide
```
以下の様に必要な台数が、STTUS Runningで起動してる事を確認
etcd * 1
kube-apiserve * 1
kube-controller-manager * 1
kube-dns * 3
kube-flannel-ds * 2
kube-proxy * 2
kube-scheduler * 1

【コマンド結果】

```conf:
NAMESPACE     NAME                                   READY     STATUS    RESTARTS   AGE       IP              NODE
kube-system   etcd-k8s-master01                      1/1       Running   0          1h        172.31.XX.XX   k8s-master01
kube-system   kube-apiserver-k8s-master01            1/1       Running   0          1h        172.31.XX.XX   k8s-master01
kube-system   kube-controller-manager-k8s-master01   1/1       Running   0          1h        172.31.XX.XX   k8s-master01
kube-system   kube-dns-6f4fd4bdf-6p8j6               3/3       Running   0          1h        10.244.XX.XX   k8s-worker01
kube-system   kube-flannel-ds-nd6md                  1/1       Running   0          1h        172.31.XX.XX   k8s-worker01
kube-system   kube-flannel-ds-xhfzj                  1/1       Running   0          1h        172.31.XX.XX   k8s-master01
kube-system   kube-proxy-qv2xl                       1/1       Running   0          1h        172.31.XX.XX   k8s-worker01
kube-system   kube-proxy-s8qtt                       1/1       Running   0          1h        172.31.XX.XX   k8s-master01
kube-system   kube-scheduler-k8s-master01            1/1       Running   0          1h        172.31.XX.XX   k8s-master01
```