之前一直使用minikube練習,為了更貼近生產環境,使用VirtualBox部署Kubernetes集群。
為了不使文章凌亂,把在搭建過程中遇到的問題及解決方法記在了另一篇文章:安裝Kubernetes集群時遇到的問題及解決方法
軟件版本
- VirtualBox:6.1
- CentOS:7
- Docker:19.03.6
- Kubernetes:1.17
新建虛擬機
主要是設置內存和硬盤,內存2G,硬盤20G基本夠用


虛擬機配置
虛擬機新建完成后,將CPU配置成2個。將網卡模式設置為橋接,這樣虛擬機可以訪問外網,與宿主機也可以互相通信,方便以后ssh。


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

進入安裝界面
- 設置時區。
- 選擇安裝磁盤。
- 安裝模式選“Minimal Install”,附加軟件全選
- "NETWORK & HOST NAME"中打開OnBoot,主機名如果不在這里設置,在安裝完系統后可以通過“hostnamectl”命令設置。
- 安裝過程中可以設置root用戶密碼或者添加新用戶。
設置好后,安裝、等待、重啟,就能進入CentOS了。


安裝Docker
直接在虛擬機界面上操作比較費事,使用ssh免密登錄。
//沒有 ~/.ssh/id_rsa.pub 文件的,使用ssh-keygen一直回車生成即可。
ssh-copy-id -i ~/.ssh/id_rsa.pub root@kube0.vm
Docker安裝步驟如下:
//添加yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo
//安裝
wget -qO- https://get.docker.com | sh
安裝Kubernetes
禁用SELinux
- 臨時關閉:命令行執行 setenforce 0
- 永久關閉:修改/etc/selinux/config文件,將SELINUX=enforcing改為SELINUX=disabled
關閉防火牆
systemctl disable firewalld && systemctl stop firewalld
關閉交換分區
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab
更改iptables的設置
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
添加國內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
添加docker鏡像
在 /etc/docker/daemon.json 中加入一行
"registry-mirrors": ["https://registry.docker-cn.co"]
安裝kubectl、kubeadm、kubelet
yum -y install kubectl kubeadm kubelet
啟動docker、kubelet
systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl start kubelet
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
初始化master、添加node
在kube0.vm上執行 kubeadm init
安裝成功后在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
-> [root@kube0.vm] [~] 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
配置容器網絡(flannel)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
安裝完成后,等了一會還是NotReday,查看pod狀態
kubectl describe 查看原因:
kubectl describe -n kube-system pod/kube-flannel-ds-amd64-6kbdj
眾所周知的原因,使用鏡像拉取,然后docker tag 設置別名。
具體操作可以查看Kubernetes搭建過程中使用k8s.gcr.io、quay.io、docker.io的鏡像加速
查看pod狀態依然有問題:
-> [root@kube0.vm] [~] 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:
-> [root@kube0.vm] [~] 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了。
-> [root@kube0.vm] [~] kubectl delete -n kube-system pod/kube-controller-manager-kube0.vm
pod "kube-controller-manager-kube0.vm" deleted
只剩最后一個問題了,還有兩個coredns的pod狀態是"ContainerCreating"(可以查看前面的截圖),也是由於容器網絡導致的,刪掉后自動重建新的就好了。
-> [root@kube0.vm] [~] kubectl delete -n kube-system pod coredns-6955765f44-dr5wg coredns-6955765f44-zmxft
pod "coredns-6955765f44-dr5wg" deleted
pod "coredns-6955765f44-zmxft" deleted