宗教上の理由などにより既存のサービスが使えないのでLinux環境に一からKubernetesを作りたいよって人、書いてある通りにやってるのになぜか動かないよって人向け
検証環境はVirtualBox上のCentOS7.8
k8s-master IP:192.168.100.200 CPU:2 MEM:2GB HDD:16GB
k8s-node01 IP:192.168.100.201 CPU:2 MEM:2GB HDD:16GB
k8s-node02 IP:192.168.100.202 CPU:2 MEM:2GB HDD:16GB
(マスターには2Core以上が必須らしい)
※初回投稿後自分の書いた記事で再現テストを何度かやって何か所か修正しました
##お世話になった記事
・kubeadmでkubernetes v1.14.1のインストール
・CentOS 上 に Kubernetes クラスター を構築する方法
・kubeadm で kubernetes v1.8 + Flannel をインストール
##手順
以下の手順はrootユーザーとして行うものとする
###マスター、ワーカー共通手順
####準備
・システムアップデート
・SELinux無効化
・SWAP無効化
# yum update
# systemctl reboot -i
# setenforce 0
# swapoff -a
-SELINUX=enforcing
+#SELINUX=enforcing
+SELINUX=disabled
-/dev/mapper/centos-swap swap swap defaults 0 0
+# /dev/mapper/centos-swap swap swap defaults 0 0
・hostsの設定
+192.168.100.200 k8s-master
+192.168.100.201 k8s-node01
+192.168.100.202 k8s-node02
####Dockerのインストール
# yum install yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce
# mkdir -m 644 /etc/docker
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
# systemctl enable docker && systemctl start docker
####kubernetesのインストール
[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*
# yum install kubelet kubeadm --disableexcludes=kubernetes
# systemctl enable kubelet && systemctl start kubelet
※VM環境の場合ここで一旦シャットダウンし、クローンを作る
クローン生成後一端起動してIPを再設定する
…
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.100.200 ←OSインストール時に固定IPにした場合ここだけを変更して「systemctl restart network」
PREFIX=24
GATEWAY=192.168.100.1
DNS1=8.8.8.8
環境によってenp0s3の部分が違う場合もあるのでip addrなどで確認すること
###Firewallの設定
####Master側
firewall-cmd --permanent --new-zone=k8s
firewall-cmd --permanent --zone=k8s --add-source=192.168.100.201
firewall-cmd --permanent --zone=k8s --add-source=192.168.100.202
firewall-cmd --permanent --zone=k8s --add-port 6443/tcp
firewall-cmd --permanent --zone=k8s --add-port 2379-2380/tcp
firewall-cmd --permanent --zone=k8s --add-port 10250/tcp
firewall-cmd --permanent --zone=k8s --add-port 10251/tcp
firewall-cmd --permanent --zone=k8s --add-port 10252/tcp
firewall-cmd --reload
####Worker側
firewall-cmd --permanent --new-zone=k8s
firewall-cmd --permanent --zone=k8s --add-source=192.168.100.200
firewall-cmd --permanent --zone=k8s --add-port 10250/tcp
firewall-cmd --permanent --zone=k8s --add-port 30000-32767/tcp
firewall-cmd --reload
##Master設定
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
# kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version v1.18.4
(v1.18.4の部分はインストールしたバージョン)
kubeadm initだけでもいい気もするけどVMのBuild&Scrapしてると
オプション付けてた方がうまくいくような気がするのでとりあえず付ける事にした
実行後以下の様な文字列が実行結果の最終行に表示されるので控えておく
kubeadm join 192.168.100.200:6443 --token .********** --discovery-token-ca-cert-hash sha256:****************************************************************
(*の部分はkubeadm initコマンドを実行する度に生成される)
kubectl get nodesなどのコマンドで正しい応答を得る為に以下を実行
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
###flannelのインストール
これがないとYAMLを実行してもPod生成がペンディングで止まる
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
※古い記事の場合https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
を参照しようとしてエラーが多発する
##Worker設定
上で得られたkubeadm joinを実行
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
# kubeadm join 192.168.100.200:6443 --token ******.**************** --discovery-token-ca-cert-hash sha256:****************************************************************
##Master側で確認
Workerノードを2つ繋げると以下のようになる
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 3h20m v1.18.4
k8s-node01 Ready <none> 3h20m v1.18.4
k8s-node02 Ready <none> 3h20m v1.18.4
##検証用YAMLを実行
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
spec:
replicas: 10
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.18
####YAMLの適用
# kubectl apply -f test.yml
実行してしばらく経つと以下のようになる
nginx-test-74b9fcbbc7-2t2j9 1/1 Running 0 35s
nginx-test-74b9fcbbc7-4776q 1/1 Running 0 35s
nginx-test-74b9fcbbc7-bp92t 1/1 Running 0 35s
nginx-test-74b9fcbbc7-fhv4k 1/1 Running 0 35s
nginx-test-74b9fcbbc7-hfdm4 1/1 Running 0 35s
nginx-test-74b9fcbbc7-hp98l 1/1 Running 0 35s
nginx-test-74b9fcbbc7-ln484 1/1 Running 0 35s
nginx-test-74b9fcbbc7-mqjwl 1/1 Running 0 35s
nginx-test-74b9fcbbc7-nx7vn 1/1 Running 0 35s
nginx-test-74b9fcbbc7-v96rt 1/1 Running 0 35s
##上手くいかないとき
再起動後などkubeadm initやkubeadm joinなどでうまくいかない場合
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
を再度実行すると多分うまくいく
もしくはWorkerの場合
# kubeadm reset
でリセットするなどする必要がある場合も
ゾンビポッドなどが残ってどうしようもないような場合などは
Master、Workerそれぞれで
# kubeadm reset
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
# kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version v1.18.4
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# kubeadm reset
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
# kubeadm join 192.168.100.200:6443 --token ******.**************** --discovery-token-ca-cert-hash sha256:****************************************************************
とやるとまっさらな環境で再度試行できる
##課題
Dashboradの実行がまだ再現できていない