kubeadmでFedora CoreOSにKubernetes1.18を入れる場合はこちら
kubeadmでFedora CoreOSにKubernetes1.17を入れる場合はこちら
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追加すると起動できない問題を解決する方法
・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
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数と同じにする設定する場合はこちらを参照してください
・kube init時にエラー発生したため、CoreOS Container Linuxと同じ対応を実施
kubernetes 1.17.0 - kubeadm init - kube-controller-manager status is ContainerCreating #86961
SELinux設定確認
# 現在の状態確認
# ・Enforcing ・・・ SELinuxは有効で、アクセス制限も有効。
# ・Permissive ・・・ SELinuxは有効だが、アクセス制限は行わず警告を出力。
# ・Disabled ・・・ SELinux機能は無効。
$ getenforce
Enforcing
# Permissive に変更
$ sudo vi /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
$ 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
Kubernetes 日記 2019/10/07
Calicoデプロイ後に以下の問題と同じことが発生していた。
pod calico-node on worker nodes with 'CrashLoopBackOff' #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
fedora-coreos-tracker
Container Linuxの後継となる新たなコンテナ向けOS「Fedora CoreOS」
Fedora CoreOSを使う
Installing Kubeadm on Fedora CoreOS