(失敗)kubeadmでFedora CoreOS preview 31.20191217.2.0にKubernetes 1.17

[kubeadmでFedora CoreOSにKubernetes1.18を入れる場合はこちら](https://qiita.com/rururu_kenken/items/6d79fab49a05e6d8851c)
[kubeadmでFedora CoreOSにKubernetes1.17を入れる場合はこちら](https://qiita.com/rururu_kenken/items/25ef311e379c3be6bd95)

**Master Node**

|    EC2　　 |    OS         | Kubernetes | Docker    |
|:----------:|:-------------:|:----------:|:---------:|
| t3.xlarge   | Fedora CoreOS preview 31.20191217.2.0| 1.17.0|18.09.8 |

Fedora CoreOS preview AMI のユーザー名は core です

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

Master NodeとWorker Nodeは同じVPC
Master NodeのIPアドレスは172.31.30.253

## 課題

・/etc/docker/daemon.jsonを使用しない場合の設定方法の調査
・Flannelが正しくデプロイできない原因調査
・Calicoが正しくデプロイできない原因調査

## Fedora CoreOS preview 31.20191217.2.0 とCore Container Linux 2303.3.0との違い(あくまで気づいたところのみ)

・Dockerのバージョンが18.06.3-ceではなく18.09.8
・Podman 1.6.2が入っている
・SELinuxがデフォルト有効
・ファイルシステムが「ext4」ではなく「xfs」
・ログインしているユーザーがdockerグループに追加されていなかった
・/etc/docker/daemon.jsonを追加してDocker再起動時にエラーになった
・/opt/binにパスが通ってなかった。
・kubelet、kubectl、kubeadmのインストールは「sudo rpm-ostree install kubelet kubectl kubeadm -r」

## 発生したエラー

・/etc/docker/daemon.jsonを追加してDocker再起動時にエラー
　→ファイル削除＆サービス再起動して先に進んだ
[dockerをdaemon.json追加すると起動できない問題を解決する方法](https://qiita.com/ButtonPJ/items/4861b6ffc345d51cc6a1)
・Flanelのデプロイ後にcorednsが「Pending」から変わらない
・CPU 2つのt3.smallでは、kubeadm init実行時に以下のエラーが出る。
　CPU 4つのt3.xlargeは問題なし。

```
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
```

[CoreOS incorrectly reports CPU info via /proc/cpuinfo #413](https://github.com/coreos/fedora-coreos-tracker/issues/413)
**Google翻訳**
>（AWS上の）Fedora CoreOSの最新の安定リリースを実行していて、/ proc / cpuinfoの内容が正しくない。
>
>[core@ip-10-36-176-20 ~]$ rpm-ostree status ・・・
>2つのCPUを備えたt3.smallは1を示します。4を備えたt3.xlargeは2を示します。これは、Kubernetes（正確にはcadvisor）が/ proc / cpuinfoを使用して容量用のCPUの数を決定するため、問題を引き起こします。 これにより、ノードの容量が必要な半分になると報告されます。
>
> Fedora CoreOS: [core@ip-10-36-176-20 ~]$ cat /proc/cpuinfo ・・・

>@jlebon
>FCOSが必要に応じてSMTを無効にしている可能性があります ： https : //github.com/coreos/fedora-coreos-tracker/blob/master/Design.md#automatically-disable-smt-when-needed-to-address-vulnerabilities 。 EC2インスタンスタイプで引用されているvCPU数はハイパースレッディングを想定していると思います。
>
>@ cyrus-mc
>それはそれのようです。 迅速な対応に感謝します。
>
>を使用してカーネルオプションを更新しました
>
> rpm-ostree kargs --replace="mitigations=auto" 
>
>nosmtを削除します

[Fedora CoreOSで/proc/cpuinfoの内容をEC2インスタンスのvCPU数と同じにする設定する場合はこちらを参照してください](https://qiita.com/rururu_kenken/items/2d7a2f50190940d99ac2)

・kube init時にエラー発生したため、CoreOS Container Linuxと同じ対応を実施
　[kubernetes 1.17.0 - kubeadm init - kube-controller-manager status is ContainerCreating #86961](https://github.com/kubernetes/kubernetes/issues/86961)

## SELinux設定確認

```
# 現在の状態確認
#・Enforcing ･･･ SELinuxは有効で、アクセス制限も有効。
#・Permissive ･･･ SELinuxは有効だが、アクセス制限は行わず警告を出力。
#・Disabled ･･･ SELinux機能は無効。
$ getenforce

Enforcing

# Permissive に変更
$ sudo vi /etc/selinux/config
```

```:/etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted
```

```
# 再起動
$ sudo systemctl reboot

# 再起動後に再度sshで接続
$ getenforce

Permissive
```


## swap確認

```
$ free

# ないので何もしない
              total        used        free      shared  buff/cache   available
Mem:        1996164      121616     1658356         600      216192     1730984
Swap:             0           0           0
```

## Podman確認

```
$ podman -v

podman version 1.6.2
```

## Docker設定

```
# Dockerサービスの状態確認
$ systemctl status docker

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://docs.docker.com

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

# ログインしているユーザーがdockerグループの追加されているか確認
# デフォルトでは設定されていない
$ cat /etc/group | grep docker

docker:x:982:

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

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

docker:x:993:core

# ログアウト
# exit

# 再度sshで接続
$ docker -v

Docker version 18.09.8, build 0dd43dd
```

## daemon.json追加

追加してDockerサービス再起動時にエラーになったので
「daemon.json」は設定しませんでした。

```
$ uname -r

5.3.16-300.fc31.x86_64

$ df -T

ファイルシス   タイプ   1K-ブロック    使用  使用可 使用% マウント位置
devtmpfs       devtmpfs      963588       0  963588    0% /dev
tmpfs          tmpfs         998080      84  997996    1% /dev/shm
tmpfs          tmpfs         998080     508  997572    1% /run
tmpfs          tmpfs         998080       0  998080    0% /sys/fs/cgroup
/dev/nvme0n1p4 xfs          7853036 2241356 5611680   29% /sysroot
tmpfs          tmpfs         998080       0  998080    0% /tmp
/dev/nvme0n1p1 ext4          372607   77448  271403   23% /boot
/dev/nvme0n1p2 vfat          129774    3412  126362    3% /boot/efi
tmpfs          tmpfs         199616       4  199612    1% /run/user/1000

$ docker info

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.09.8
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: /usr/libexec/docker/docker-init
containerd version: 
runc version: ce97911e3cd37a5ce3ef98f7f1d4add21a3ac162
init version: v0.18.0 (expected: fec3683b971d9c3ef73f284f176672c44b448662)
Security Options:
 seccomp
  Profile: default
 selinux
Kernel Version: 5.3.16-300.fc31.x86_64
Operating System: Fedora CoreOS preview 31.20191217.2.0
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.904GiB
Name: ip-172-31-30-253
ID: 4XMK:I3XD:LAFC:5JZO:H6H6:GKW7:FB3L:5UU2:VKEF:O76J:QESO:2DUE
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: true

$ sudo tee /etc/docker/daemon.json <<EOF
{
 "exec-opts": ["native.cgroupdriver=systemd"],
 "log-driver": "json-file",
 "log-opts": {
   "max-size": "100m"
 },
 "storage-driver": "overlay2"
}
EOF

# ディレクトリ作成＆サービス再起動
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

# overlay2をoverlayに変えてみる
$ sudo vi /etc/docker/daemon.json

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

# サービス再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

# storage-driverの設定を消してみる
$ sudo vi /etc/docker/daemon.json

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

# サービス再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

# "exec-opts": ["native.cgroupdriver=systemd"]だけにしてみる
sudo vi /etc/docker/daemon.json

{
 "exec-opts": ["native.cgroupdriver=systemd"]
}

# サービス再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

# /etc/docker/daemon.jsonを消してサービス再起動
$ sudo rm /etc/docker/daemon.json

# サービス再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```

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

```
$ sudo tee /etc/yum.repos.d/kubernetes.repo <<EOF
[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
exclude=kube*
EOF

# kubelet kubectl kubeadmインストール
$ sudo rpm-ostree install kubelet kubectl kubeadm -r

# IPアドレスのところは「xx」にしてます
Checking out tree fd3a3a1... done
Enabled rpm-md repositories: updates fedora kubernetes
Updating metadata for 'updates'... done
rpm-md repo 'updates'; generated: 2020-01-13T01:56:31Z
Updating metadata for 'fedora'... done
rpm-md repo 'fedora'; generated: 2019-10-23T22:52:47Z
Updating metadata for 'kubernetes'... done
rpm-md repo 'kubernetes'; generated: (invalid timestamp)
Importing rpm-md... done
Resolving dependencies... done
Will download: 10 packages (46.3 MB)
Downloading from 'fedora'... done
Downloading from 'kubernetes'... done
Importing packages... done
Checking out packages... done
Running pre scripts... done
Running post scripts... done
Running posttrans scripts... done
Writing rpmdb... done
Writing OSTree commit... done
Staging deployment... done
Connection to ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com closed by remote host.
Connection to ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com closed.
```
## kubelet 起動

再度sshで接続後

```
$ kubeadm version

kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:17:50Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl version

Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:20:10Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

# 以下の設定は不要だったかも
$ sudo modprobe overlay && sudo modprobe br_netfilter
 
$ sudo tee /etc/modules-load.d/crio-net.conf <<EOF
overlay
br_netfilter
EOF
 
$ sudo tee /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
 
$ sudo sysctl --system

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

## Masterノードのセットアップ

[kubernetes 1.17.0 - kubeadm init - kube-controller-manager status is ContainerCreating #86961](https://github.com/kubernetes/kubernetes/issues/86961)

```
$ cat <<EOF > ./kubeadm-custom.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.17.0
controllerManager:
  extraArgs:
    flex-volume-plugin-dir: "/etc/kubernetes/kubelet-plugins/volume/exec"
networking:
  podSubnet: 10.244.0.0/16
EOF

$ sudo kubeadm init --config kubeadm-custom.yaml
```

## 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 all --all-namespaces

NAMESPACE     NAME                                           READY   STATUS    RESTARTS   AGE
kube-system   pod/coredns-6955765f44-6bxg9                   0/1     Pending   0          4s
kube-system   pod/coredns-6955765f44-lzlr9                   0/1     Pending   0          4s
kube-system   pod/etcd-ip-172-31-30-253                      1/1     Running   0          20s
kube-system   pod/kube-apiserver-ip-172-31-30-253            1/1     Running   0          20s
kube-system   pod/kube-controller-manager-ip-172-31-30-253   1/1     Running   0          19s
kube-system   pod/kube-proxy-gxh5l                           1/1     Running   0          3s
kube-system   pod/kube-scheduler-ip-172-31-30-253            1/1     Running   0          19s

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  22s
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   20s

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
kube-system   daemonset.apps/kube-proxy   1         1         1       1            1           beta.kubernetes.io/os=linux   20s

NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/coredns   0/2     2            0           20s

NAMESPACE     NAME                                 DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/coredns-6955765f44   2         2         0       4s
```

## [失敗]Flannelデプロイ

FlanelのPodは「Running」
しかし、corednsは「Pending」のまま

```
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

[core@ip-172-31-30-253 ~]$ kubectl get all --all-namespaces
NAMESPACE     NAME                                           READY   STATUS    RESTARTS   AGE
kube-system   pod/coredns-6955765f44-7qh8m                   0/1     Pending   0          4m18s
kube-system   pod/coredns-6955765f44-8cw6n                   0/1     Pending   0          4m17s
kube-system   pod/etcd-ip-172-31-30-253                      1/1     Running   0          4m34s
kube-system   pod/kube-apiserver-ip-172-31-30-253            1/1     Running   0          4m34s
kube-system   pod/kube-controller-manager-ip-172-31-30-253   1/1     Running   0          4m34s
kube-system   pod/kube-flannel-ds-amd64-n8jct                1/1     Running   0          3m37s
kube-system   pod/kube-proxy-drzhr                           1/1     Running   0          4m17s
kube-system   pod/kube-scheduler-ip-172-31-30-253            1/1     Running   0          4m34s

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  4m36s
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   4m35s

NAMESPACE     NAME                                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
kube-system   daemonset.apps/kube-flannel-ds-amd64     1         1         1       1            1           <none>                        3m37s
kube-system   daemonset.apps/kube-flannel-ds-arm       0         0         0       0            0           <none>                        3m37s
kube-system   daemonset.apps/kube-flannel-ds-arm64     0         0         0       0            0           <none>                        3m37s
kube-system   daemonset.apps/kube-flannel-ds-ppc64le   0         0         0       0            0           <none>                        3m37s
kube-system   daemonset.apps/kube-flannel-ds-s390x     0         0         0       0            0           <none>                        3m37s
kube-system   daemonset.apps/kube-proxy                1         1         1       1            1           beta.kubernetes.io/os=linux   4m34s

NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/coredns   0/2     2            0           4m35s

NAMESPACE     NAME                                 DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/coredns-6955765f44   2         2         0       4m18s
[core@ip-172-31-30-253 ~]$ kubectl get node
NAME               STATUS     ROLES    AGE     VERSION
ip-172-31-30-253   NotReady   master   4m59s   v1.17.0 

# Flannel削除
$ kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```

## [失敗]Calicoデプロイ

[Calico 3.8 fails to install under CoreOS stable #2712](https://github.com/projectcalico/calico/issues/2712)
[Kubernetes 日記 2019/10/07](https://blog.net.ist.i.kyoto-u.ac.jp/2019/10/11/kubernetes-%E6%97%A5%E8%A8%98-2019-10-07/)

Calicoデプロイ後に以下の問題と同じことが発生していた。

[pod calico-node on worker nodes with 'CrashLoopBackOff' #2720](https://github.com/projectcalico/calico/issues/2720)

```
$ curl -L -O https://docs.projectcalico.org/v3.11/manifests/calico.yaml

# /etc/kubernetes/kubelet-plugins/volume/exec
# 192.168.0.0/16を10.244.0.0/16に変更
# 「/usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds」を
# 「/etc/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds」に変更
$ vi calico.yaml
$ kubectl apply -f calico.yaml 
```

# 参考URL

[Fedora CoreOS](https://getfedora.org/en/coreos/)
[fedora-coreos-tracker](https://github.com/coreos/fedora-coreos-tracker/issues)
[Container Linuxの後継となる新たなコンテナ向けOS「Fedora CoreOS」](https://knowledge.sakura.ad.jp/23287/)
[Fedora CoreOSを使う](https://tech.virtualtech.jp/entry/2019/11/26/181622)
[Installing Kubeadm on Fedora CoreOS](https://jebpages.com/2019/02/25/installing-kubeadm-on-fedora-coreos/)

[kubeadmのインストール](https://kubernetes.io/ja/docs/setup/independent/install-kubeadm/)
[Dockerのストレージドライバを理解する](https://qiita.com/NaotoHanaue/items/b9f395a63f7aae2a41b7)