【2020/06版】今使えるKubernetes on CentOS7設定手順

宗教上の理由などにより既存のサービスが使えないので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のインストール](https://qiita.com/hmdsatoshi/items/48d6e16fcc25e59c667e)
・[CentOS 上 に Kubernetes クラスター を構築する方法](https://garafu.blogspot.com/2019/06/build-k8s-single-master-cluster.html)
・[kubeadm で kubernetes v1.8 + Flannel をインストール](https://qiita.com/hichihara/items/79ef6613026f8c13eb99)

##手順
以下の手順はrootユーザーとして行うものとする

###マスター、ワーカー共通手順

####準備
・システムアップデート
・SELinux無効化
・SWAP無効化

```terminal
# yum update
# systemctl reboot -i
# setenforce 0
# swapoff -a
```

```diff:/etc/selinux/config
-SELINUX=enforcing
+#SELINUX=enforcing
+SELINUX=disabled
```

```diff:/etc/fstab
-/dev/mapper/centos-swap swap                    swap    defaults        0 0
+# /dev/mapper/centos-swap swap                    swap    defaults        0 0
```

・hostsの設定

```diff:/etc/hosts
+192.168.100.200    k8s-master
+192.168.100.201    k8s-node01
+192.168.100.202    k8s-node02
```

####Dockerのインストール

```terminal
# 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
```

```json:/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"
  ]
}
```

```terminal
# systemctl enable docker && systemctl start docker
```

####kubernetesのインストール

```/etc/yum.repos.d/kube-rnetes.repo
[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*
```

```terminal
# yum install kubelet kubeadm --disableexcludes=kubernetes
# systemctl enable kubelet && systemctl start kubelet
```

※VM環境の場合ここで一旦シャットダウンし、クローンを作る
クローン生成後一端起動してIPを再設定する

```conf:/etc/sysconfig/network-scripts/ifcfg-enp0s3
…
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側

```terminal
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側

```terminal
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設定

```terminal
# 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などのコマンドで正しい応答を得る為に以下を実行

```terminal
# 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生成がペンディングで止まる

```terminal
# 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を実行

```terminal
# 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つ繋げると以下のようになる

```terminal
# 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を実行

```test.yml
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の適用

```terminal
# kubectl apply -f test.yml
```

実行してしばらく経つと以下のようになる

```terminal
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などでうまくいかない場合

```terminal
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
```
を再度実行すると多分うまくいく
もしくはWorkerの場合

```terminal
# kubeadm reset
```
でリセットするなどする必要がある場合も

ゾンビポッドなどが残ってどうしようもないような場合などは
Master、Workerそれぞれで

```terminal
# 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
```

```terminal
# 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の実行がまだ再現できていない