kubeadmでAmazon Linux2にKubernetes1.16

[kubeadmでAmazon Linux2にKubernetes1.18を入れる場合はこちら](https://qiita.com/rururu_kenken/items/0a7434969ff2c28576eb)
[kubeadmでAmazon Linux2にKubernetes1.17を入れる場合はこちら](https://qiita.com/rururu_kenken/items/2e924eb085fe4bc2edd4)
[kubeadmでAmazon Linux2にKubernetes1.15を入れる場合はこちら](https://qiita.com/rururu_kenken/items/298b2f09450a2ecc35fb)

**Master Node**

|    EC2　　 |    OS         | Kubernetes | Docker    | ホスト名  |
|:----------:|:-------------:|:----------:|:---------:|:---------:|
| t3.small　| Amazon Linux2 | 1.16.2       |18.06.1-ce |k8s-master|

2CPU、メモリ2GB以下の場合、kubeadm init実行時にエラーになります。
ディスクサイズはデフォルトの8G
Master NodeとWorker Nodeは同じVPC
Master NodeのIPアドレスは172.31.39.74

**Worker Node**

|    EC2　　 |    OS         | Kubernetes | Docker    | ホスト名  |
|:----------:|:-------------:|:----------:|:---------:|:---------:|
| t3.small   | Amazon Linux2 | 1.16.2       |18.06.1-ce |k8s-worker|

ディスクサイズは20G
Master NodeとWorker Nodeは同じVPC
Worker NodeのIPアドレスは172.31.34.50

## SELinux設定確認

```
$ getenforce

# 無効になっている
Disabled

```

## ホスト名の設定

```
$ sudo hostnamectl set-hostname k8s-master
```

## hostファイル編集

sudo vi /etc/hosts

```/etc/hosts.
# 以下の設定を追加
172.31.39.74 k8s-master
172.31.34.50 k8s-worker
```

## swap確認

```
$ free

# ないので何もしない
              total        used        free      shared  buff/cache   available
Mem:        2002400       59664     1581528         360      361208     1783540
Swap:             0           0           0
```

## Dockerインストール・設定

```
# amazon-linux-extras install -y docker=18.03.1のようにバージョン指定でインストールも可能
$ sudo amazon-linux-extras install -y docker

$ docker -v

Docker version 18.06.1-ce, build e68fc7a215d7133c34aa18e3b72b4a21fd0c6136

# dockerサービス起動
$ sudo systemctl start docker

# ログインしているユーザーをdockerグループに追加
$ sudo usermod -a -G docker $USER

# 確認コマンド
$ cat /etc/group | grep docker

docker:x:993:ec2-user

# ログアウトして、すぐに再ログイン
# exit

# Dockerの自動起動有効化
$ sudo systemctl enable docker

# cgroupdriverをsystemdに設定など
$ sudo vi /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

$ sudo mkdir -p /etc/systemd/system/docker.service.d

# Restart Docker
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```
## ルーティング設定など

```
$ lsmod |grep  br_netfilter

br_netfilter           24576  0
bridge                172032  1 br_netfilter

$ lsmod | grep overlay

overlay                86016  0

$ sudo vi /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1

# カーネルパラメータを手動で反映
$ sudo sysctl --system

kernel.printk = 8 4 1 7
kernel.panic = 30
net.ipv4.neigh.default.gc_thresh1 = 0
net.ipv6.neigh.default.gc_thresh1 = 0
net.ipv4.neigh.default.gc_thresh2 = 15360
net.ipv6.neigh.default.gc_thresh2 = 15360
net.ipv4.neigh.default.gc_thresh3 = 16384
net.ipv6.neigh.default.gc_thresh3 = 16384
* Applying /usr/lib/sysctl.d/00-system.conf ...
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/99-amazon.conf ...
kernel.sched_autogroup_enabled = 0
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
* Applying /etc/sysctl.conf ...
```

## kubelet、kubeadm、kubectlインストール

「repo_gpgcheck=1」は「repo_gpgcheck=0」にする
[Got "repomd.xml signature could not be verified for kubernetes" error when installing Kubernetes from yum repo on Amazon Linux 2 #60134](https://github.com/kubernetes/kubernetes/issues/60134)

```
$ sudo sh -c "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=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
"
$ sudo yum install -y kubelet-1.16.2-0.x86_64 kubeadm-1.16.2-0.x86_64 kubectl-1.16.2-0.x86_64 --disableexcludes=kubernetes
```

## kubelet 起動

```
$ sudo systemctl enable kubelet && sudo systemctl start kubelet
```

## Master の初期化

```
# tcインストール
$ sudo yum install -y tc

# --apiserver-advertise-address
#  API Server のListen IPアドレス
#  Master ノードの NIC eth0 の IP アドレスを指定
# --pod-network-cidr
#  Pod に割り当てる内部 IP アドレスの CIDR、後述の Flannel を 
#  CNI に採用する場合は 10.244.0.0/16 を指定
# --service-cidr
#  Service に割り当てる内部 IP アドレスの CIDR
#  デフォルトは 10.96.0.0/12 
# メッセージの最終行 kubeadm join ... は、Node を クラスタへ
# 参加させる際に利用するコマンドが出力されます(※)
$ sudo kubeadm init \
    --apiserver-advertise-address 172.31.39.74 \
    --pod-network-cidr 10.244.0.0/16 \
    --service-cidr 172.16.130.0/24
```

トークンには有効期限があり、通常は24時間で利用できなくなる。
トークンが失効した場合や分からなくなった場合、マスターノードで「kubeadm token create --print-join-command」コマンドを実行するとトークンが再生成されて表示される。

## kubectl 接続設定

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

```
$ docker images

REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.16.2             8454cbe08dc9        11 days ago         86.1MB
k8s.gcr.io/kube-apiserver            v1.16.2             c2c9a0406787        11 days ago         217MB
k8s.gcr.io/kube-controller-manager   v1.16.2             6e4bffa46d70        11 days ago         163MB
k8s.gcr.io/kube-scheduler            v1.16.2             ebac1ae204a2        11 days ago         87.3MB
k8s.gcr.io/etcd                      3.3.15-0            b2756210eeab        7 weeks ago         247MB
k8s.gcr.io/coredns                   1.6.2               bf261d157914        2 months ago        44.1MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        22 months ago       742kB

$ docker ps

CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
01ecfb1358b2        8454cbe08dc9           "/usr/local/bin/kube…"   2 minutes ago       Up 2 minutes                            k8s_kube-proxy_kube-proxy-vv96z_kube-system_f5f98a6b-52a8-4d0a-ab1a-84ded7eac8b4_0
4612ea6d6f4a        k8s.gcr.io/pause:3.1   "/pause"                 2 minutes ago       Up 2 minutes                            k8s_POD_kube-proxy-vv96z_kube-system_f5f98a6b-52a8-4d0a-ab1a-84ded7eac8b4_0
13fc761019bc        b2756210eeab           "etcd --advertise-cl…"   2 minutes ago       Up 2 minutes                            k8s_etcd_etcd-k8s-master_kube-system_ffdde4238901ee511286a47ff743cfb6_0
9216814850ea        ebac1ae204a2           "kube-scheduler --au…"   2 minutes ago       Up 2 minutes                            k8s_kube-scheduler_kube-scheduler-k8s-master_kube-system_74dea8da17aa6241e5e4f7b2ba4e1d8e_0
c7ec706879ef        6e4bffa46d70           "kube-controller-man…"   2 minutes ago       Up 2 minutes                            k8s_kube-controller-manager_kube-controller-manager-k8s-master_kube-system_508983a8473a31027712ecfa3d936e03_0
458c7033f991        c2c9a0406787           "kube-apiserver --ad…"   2 minutes ago       Up 2 minutes                            k8s_kube-apiserver_kube-apiserver-k8s-master_kube-system_84bd757366d85c9a4985961b9cfc3151_0
b12bb506cc1a        k8s.gcr.io/pause:3.1   "/pause"                 2 minutes ago       Up 2 minutes                            k8s_POD_kube-scheduler-k8s-master_kube-system_74dea8da17aa6241e5e4f7b2ba4e1d8e_0
6433412edbf4        k8s.gcr.io/pause:3.1   "/pause"                 2 minutes ago       Up 2 minutes                            k8s_POD_kube-controller-manager-k8s-master_kube-system_508983a8473a31027712ecfa3d936e03_0
850c35237fc1        k8s.gcr.io/pause:3.1   "/pause"                 2 minutes ago       Up 2 minutes                            k8s_POD_kube-apiserver-k8s-master_kube-system_84bd757366d85c9a4985961b9cfc3151_0
f3b0313897a1        k8s.gcr.io/pause:3.1   "/pause"                 2 minutes ago       Up 2 minutes                            k8s_POD_etcd-k8s-master_kube-system_ffdde4238901ee511286a47ff743cfb6_0
```

## Flannelインストール

```
$ kubectl get node

NAME         STATUS     ROLES    AGE     VERSION
k8s-master   NotReady   master   3m37s   v1.16.2

$ kubectl get pod --all-namespaces

NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-5644d7b6d9-54c4w             0/1     Pending   0          3m39s
kube-system   coredns-5644d7b6d9-xvhwk             0/1     Pending   0          3m39s
kube-system   etcd-k8s-master                      1/1     Running   0          2m52s
kube-system   kube-apiserver-k8s-master            1/1     Running   0          2m52s
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          2m46s
kube-system   kube-proxy-vv96z                     1/1     Running   0          3m39s
kube-system   kube-scheduler-k8s-master            1/1     Running   0          2m35s

# ダウンロード
$ curl -L -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# デプロイ
$ kubectl apply -f ./kube-flannel.yml

$ kubectl get pod --all-namespaces

NAMESPACE     NAME                                 READY   STATUS     RESTARTS   AGE
kube-system   coredns-5644d7b6d9-54c4w             0/1     Pending    0          5m5s
kube-system   coredns-5644d7b6d9-xvhwk             0/1     Pending    0          5m5s
kube-system   etcd-k8s-master                      1/1     Running    0          4m18s
kube-system   kube-apiserver-k8s-master            1/1     Running    0          4m18s
kube-system   kube-controller-manager-k8s-master   1/1     Running    0          4m12s
kube-system   kube-flannel-ds-amd64-x444v          0/1     Init:0/1   0          12s
kube-system   kube-proxy-vv96z                     1/1     Running    0          5m5s
kube-system   kube-scheduler-k8s-master            1/1     Running    0          4m1s
```

# Worker Node

## 以下はMaster Nodeの手順を参照

Firewalld停止
SELinux設定確認
ホスト名の設定・・・sudo hostnamectl set-hostname k8s-worker
hostファイル編集
swap確認
Dockerインストール・設定
ルーティング設定
kubelet、kubeadm、kubectlインストール
kubelet 起動


## クラスタに参加

```
# tcインストール
$ sudo yum install -y tc

# 「kubeadm token create --print-join-command」はMaster Nodeで実行
$ kubeadm token create --print-join-command

# 実行結果の例
kubeadm join 172.31.39.74:6443 --token kuyzfs.ofwts569uk28p72t     --discovery-token-ca-cert-hash sha256:18166bd6a8378c9fb6a66bec0373a1b1327833b6829c6d79929db34b575d097b 

$ sudo kubeadm join 172.31.39.74:6443 --token kuyzfs.ofwts569uk28p72t     --discovery-token-ca-cert-hash sha256:18166bd6a8378c9fb6a66bec0373a1b1327833b6829c6d79929db34b575d097b 
```

トークンには有効期限があり、通常は24時間で利用できなくなる。
トークンが失効した場合や分からなくなった場合、マスターノードで「kubeadm token create --print-join-command」コマンドを実行するとトークンが再生成されて表示される。

# Master Node

## kubectl コマンドで Node と Pod の状態を確認

```
$ kubectl get node

NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   91m   v1.16.2
k8s-worker   Ready    <none>   22s   v1.16.2

$ kubectl get pod --all-namespaces -o wide

NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
kube-system   coredns-5644d7b6d9-54c4w             1/1     Running   0          91m   10.244.0.2     k8s-master   <none>           <none>
kube-system   coredns-5644d7b6d9-xvhwk             1/1     Running   0          91m   10.244.0.3     k8s-master   <none>           <none>
kube-system   etcd-k8s-master                      1/1     Running   0          91m   172.31.39.74   k8s-master   <none>           <none>
kube-system   kube-apiserver-k8s-master            1/1     Running   0          91m   172.31.39.74   k8s-master   <none>           <none>
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          91m   172.31.39.74   k8s-master   <none>           <none>
kube-system   kube-flannel-ds-amd64-9w6wt          1/1     Running   0          54s   172.31.34.50   k8s-worker   <none>           <none>
kube-system   kube-flannel-ds-amd64-x444v          1/1     Running   0          87m   172.31.39.74   k8s-master   <none>           <none>
kube-system   kube-proxy-4dh2l                     1/1     Running   0          54s   172.31.34.50   k8s-worker   <none>           <none>
kube-system   kube-proxy-vv96z                     1/1     Running   0          91m   172.31.39.74   k8s-master   <none>           <none>
kube-system   kube-scheduler-k8s-master            1/1     Running   0          90m   172.31.39.74   k8s-master   <none>           <none>
```

## Master 以外のノードに Role 設定

```
$ kubectl get node

NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   92m   v1.16.2
k8s-worker   Ready    <none>   80s   v1.16.2

$ kubectl label node k8s-worker node-role.kubernetes.io/worker=

$ kubectl get node

NAME         STATUS   ROLES    AGE    VERSION
k8s-master   Ready    master   93m    v1.16.2
k8s-worker   Ready    worker   110s   v1.16.2
```
## 参考URL

[kubeadmのインストール](https://kubernetes.io/ja/docs/setup/independent/install-kubeadm/)