kubeadmでCoreOS Container LinuxにKubernetes 1.16

[kubeadmでCoreOS Container LinuxにKubernetes 1.17を入れる場合はこちら](https://qiita.com/rururu_kenken/items/55f5721ba46cc83d73b0)


# CoreOS Container LinuxのEOLが発表されました(2020/02/20追記)

情報の一部

2020/05/26に最終アップデートの公開が開始されます。
その日以降に発見されたバグやセキュリティ脆弱性は修正されません。

2020/09/01以降、CoreOS Container Linuxに関連する公開リソースは削除されるか、読み取り専用になります。 OSダウンロードは削除され、CoreUpdateサーバーはシャットダウンされ、OSイメージはAWS、Azure、Google Compute Engineから削除されます。

全ての内容は以下のサイトをご参照ください
[End-of-life announcement for CoreOS Container Linux](https://coreos.com/os/eol/)

# Master Node

|    EC2　　 |    OS         | Kubernetes | Docker    |
|:----------:|:-------------:|:----------:|:---------:|
| t3.small   | CoreOS Container Linux 2247.5.0| 1.16.2|18.06.3-ce |

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

## SELinux設定確認

```
$ getenforce

# SELinuxは有効だが、アクセス制限は行わず警告を出力
Permissive
```

## swap確認

```
$ free

# ないので何もしない
              total        used        free      shared  buff/cache   available
Mem:         981120       78168      516696      204404      386256      561768
Swap:             0           0           0
```

## Docker設定

```
$ docker -v

Docker version 18.06.3-ce, build d7080c1

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

# Setup daemon.
$ sudo mkdir -p /etc/docker
$ 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

# Dockerを再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```

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

CNI plugins (required for most pod network)

[plugins](https://github.com/containernetworking/plugins)

```
$ CNI_VERSION="v0.8.2"
$ sudo mkdir -p /opt/cni/bin
$ curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" | sudo tar -C /opt/cni/bin -xz

$ ls /opt/cni/bin

bandwidth  dhcp      flannel      host-local  loopback  portmap  sbr     tuning
bridge     firewall  host-device  ipvlan      macvlan   ptp      static  vlan
```

crictl (required for kubeadm / Kubelet Container Runtime Interface (CRI))

[cri-tools](https://github.com/kubernetes-sigs/cri-tools)

```
$ CRICTL_VERSION="v1.16.1"
$ sudo mkdir -p /opt/bin
$ curl -L "https://github.com/kubernetes-incubator/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | sudo tar -C /opt/bin -xz

$ ls /opt/bin

crictl
```

kubeadm, kubelet, kubectl


```
$ RELEASE="v1.16.2"
$ sudo mkdir -p /opt/bin
$ cd /opt/bin
$ sudo curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl}
$ sudo chmod +x {kubeadm,kubelet,kubectl}

$ ls

crictl  kubeadm  kubectl  kubelet

$ cd
$ curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/kubelet.service" | sed "s:/usr/bin:/opt/bin:g" > ./kubelet.service
$ sudo mv ./kubelet.service /etc/systemd/system/

$ sudo mkdir -p /etc/systemd/system/kubelet.service.d
$ curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/10-kubeadm.conf" | sed "s:/usr/bin:/opt/bin:g" > ./10-kubeadm.conf
$ sudo mv 10-kubeadm.conf /etc/systemd/system/kubelet.service.d
```

## kubelet 起動

```
$ sudo systemctl enable --now kubelet
```

## Master Nodeのセットアップ

```
# --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.38.1 \
    --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

$ kubectl get node

# NAMEのip-xxxのxxxは長いので加工しました
NAME     STATUS     ROLES    AGE   VERSION
ip-xxx   NotReady   master   52s   v1.16.2

kubectl get cs  
NAME                 AGE
controller-manager   <unknown>
scheduler            <unknown>
etcd-0               <unknown>
```

## Flannelインストール

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

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

# 参考URL

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