天天看點

VirtualBox上使用kubeadm安裝Kubernetes叢集

之前一直使用minikube練習,為了更貼近生産環境,使用VirtualBox搭建Kubernetes叢集。

為了不是文章淩亂,把在搭建過程中遇到的問題及解決方法記在了另一篇文章:安裝Kubernetes叢集時遇到的問題及解決方法

1.軟體版本

  • VirtualBox:6.1
  • CentOS:7
  • Docker:19.03.6
  • Kubernetes:1.17

2.建立虛拟機

主要是設定記憶體和硬碟,記憶體2G,硬碟20G基本夠用

VirtualBox上使用kubeadm安裝Kubernetes叢集
VirtualBox上使用kubeadm安裝Kubernetes叢集

3.虛拟機配置

虛拟機建立完成後,将CPU配置成2個。将網卡模式設定為橋接,這樣虛拟機可以通路外網,與主控端也可以互相通信,友善以後ssh。

VirtualBox上使用kubeadm安裝Kubernetes叢集
VirtualBox上使用kubeadm安裝Kubernetes叢集

4.安裝CentOS

如下圖設定好CentOs鏡像後,在VirtualBox界面點“啟動”,進入安裝界面點“Install CentOS 7”。

VirtualBox上使用kubeadm安裝Kubernetes叢集

進入安裝界面

  • 設定時區。
  • 選擇安裝磁盤。
  • 安裝模式選“Minimal Install”,附加軟體全選
  • "NETWORK & HOST NAME"中打開OnBoot,主機名如果不在這裡設定,在安裝完系統後可以通過“hostnamectl”指令設定。
  • 安裝過程中可以設定root使用者密碼或者添加新使用者。

設定好後,安裝、等待、重新開機,就能進入CentOS了。

VirtualBox上使用kubeadm安裝Kubernetes叢集
VirtualBox上使用kubeadm安裝Kubernetes叢集

5.安裝Docker

直接在虛拟機界面上操作比較費事,使用ssh免密登入。

//沒有 ~/.ssh/id_rsa.pub 檔案的,使用ssh-keygen一直回車生成即可。
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]           

Docker安裝步驟如下:

//添加yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo

//安裝
wget -qO- https://get.docker.com | sh           

6.安裝Kubernetes

6.1 禁用SELinux

  • 臨時關閉:指令行執行 setenforce 0
  • 永久關閉:修改/etc/selinux/config檔案,将SELINUX=enforcing改為SELINUX=disabled

6.2 關閉防火牆

systemctl disable firewalld && systemctl stop firewalld           

6.3 關閉交換分區

swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab           

6.4 更改iptables的設定

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables           

6.5 添加國内yum源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF           

6.6 添加docker鏡像

在 /etc/docker/daemon.json 中加入一行 
"registry-mirrors": ["https://registry.docker-cn.co"]           

6.7 安裝kubectl、kubeadm、kubelet

yum -y install kubectl kubeadm kubelet           

6.8 啟動docker、kubelet

systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl start kubelet           

6.9 clone虛拟機

clone兩個虛拟機,并命名為kube1.vm、kube2.vm

hostnamectl set-hostname kube1.vm           

将三台虛拟機的host寫入到主控端和每一台虛拟機

vi /etc/hosts  

# 追加以下内容(ip自行替換)
192.168.1.98 kube0.vm
192.168.1.99 kube1.vm
192.168.1.100 kube2.vm           

6.10 初始化master、添加node

在kube0.vm上執行 kubeadm init

VirtualBox上使用kubeadm安裝Kubernetes叢集

安裝成功後在kube0.vm執行以下指令,以便于使用kubectl

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config           

在kube1.vm、kube2.vm中執行以下指令加入叢集(具體參數自行替換)。

kubeadm join 192.168.1.98:6443 --token 0m5rnp.6vizjaiowvk4fpkk \
    --discovery-token-ca-cert-hash sha256:8d74f62b11584360d3ab42f7747071c91d103f322e5a52c8a592b77fc2aadb04           

此時檢視node的狀态可以看到都是NotReady

-> [[email protected]] [~] kubectl get node
NAME       STATUS     ROLES    AGE   VERSION
kube0.vm   NotReady   master   21h   v1.17.3
kube1.vm   NotReady   <none>   21h   v1.17.3
kube2.vm   NotReady   <none>   21h   v1.17.3           

執行:kubectl describe node/kube0.vm ,發現是未配置容器網絡。

runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized           
VirtualBox上使用kubeadm安裝Kubernetes叢集

6.11 配置容器網絡(flannel)

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

安裝完成後,等了一會還是NotReday,檢視pod狀态

VirtualBox上使用kubeadm安裝Kubernetes叢集

kubectl describe 檢視原因:

kubectl describe -n kube-system pod/kube-flannel-ds-amd64-6kbdj           
VirtualBox上使用kubeadm安裝Kubernetes叢集

衆所周知的原因,使用鏡像拉取,然後docker tag 設定别名。

具體操作可以檢視Kubernetes搭建過程中使用k8s.gcr.io、quay.io、docker.io的鏡像加速

檢視pod狀态依然有問題:

-> [[email protected]] [~] kubectl get pod -A|grep flannel
kube-system   kube-flannel-ds-amd64-6kbdj        0/1     CrashLoopBackOff    5          11m
kube-system   kube-flannel-ds-amd64-k29d4        0/1     Error               5          11m
kube-system   kube-flannel-ds-amd64-kftn9        0/1     CrashLoopBackOff    6          11m           

檢視logs:

-> [[email protected]] [~] kubectl logs -n kube-system pod/kube-flannel-ds-amd64-6kbdj
I0301 10:13:47.129650       1 main.go:514] Determining IP address of default interface
I0301 10:13:47.211916       1 main.go:527] Using interface with name enp0s3 and address 192.168.1.98
I0301 10:13:47.212141       1 main.go:544] Defaulting external address to interface address (192.168.1.98)
I0301 10:13:47.224287       1 kube.go:126] Waiting 10m0s for node controller to sync
I0301 10:13:47.224340       1 kube.go:309] Starting kube subnet manager
I0301 10:13:48.225108       1 kube.go:133] Node controller sync successful
I0301 10:13:48.225226       1 main.go:244] Created subnet manager: Kubernetes Subnet Manager - kube0.vm
I0301 10:13:48.225236       1 main.go:247] Installing signal handlers
I0301 10:13:48.229661       1 main.go:386] Found network config - Backend type: vxlan
I0301 10:13:48.232685       1 vxlan.go:120] VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false
E0301 10:13:48.238187       1 main.go:289] Error registering network: failed to acquire lease: node "kube0.vm" pod cidr not assigned
I0301 10:13:48.238377       1 main.go:366] Stopping shutdownHandler...           

解決方法:

編輯 /etc/kubernetes/manifests/kube-controller-manager.yaml ,在spec -> containers -> -command 下加入兩行:

- --allocate-node-cidrs=true
- --cluster-cidr=10.244.0.0/16           

然後删除 kube-controller-manager ,它會自動重新開機,配置就生效了,稍等片刻flannel的狀态就變成Running了。

-> [[email protected]] [~] kubectl delete -n kube-system pod/kube-controller-manager-kube0.vm
pod "kube-controller-manager-kube0.vm" deleted           

隻剩最後一個問題了,還有兩個coredns的pod狀态是"ContainerCreating"(可以檢視前面的截圖),也是由于容器網絡導緻的,删掉後自動重建新的就好了。

-> [[email protected]] [~] kubectl delete -n kube-system pod coredns-6955765f44-dr5wg coredns-6955765f44-zmxft
pod "coredns-6955765f44-dr5wg" deleted
pod "coredns-6955765f44-zmxft" deleted           

6.12 搭建完成

VirtualBox上使用kubeadm安裝Kubernetes叢集