VirtualBox上使用kubeadm部署Kubernetes集群

之前一直使用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免密登录。

Copy
//没有 ~/.ssh/id_rsa.pub 文件的,使用ssh-keygen一直回车生成即可。 ssh-copy-id -i ~/.ssh/id_rsa.pub root@kube0.vm

Docker安装步骤如下:

Copy
//添加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

关闭防火墙#

Copy
systemctl disable firewalld && systemctl stop firewalld

关闭交换分区#

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

更改iptables的设置#

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

添加国内yum源#

Copy
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镜像#

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

安装kubectl、kubeadm、kubelet#

Copy
yum -y install kubectl kubeadm kubelet

启动docker、kubelet#

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

clone虚拟机#

clone两个虚拟机,并命名为kube1.vm、kube2.vm

Copy
hostnamectl set-hostname kube1.vm

将三台虚拟机的host写入到宿主机和每一台虚拟机

Copy
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

Copy
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中执行以下命令加入集群(具体参数自行替换)。

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

此时查看node的状态可以看到都是NotReady

Copy
-> [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 ,发现是未配置容器网络。

Copy
runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

配置容器网络(flannel)#

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

安装完成后,等了一会还是NotReday,查看pod状态

kubectl describe 查看原因:

Copy
kubectl describe -n kube-system pod/kube-flannel-ds-amd64-6kbdj

众所周知的原因,使用镜像拉取,然后docker tag 设置别名。
具体操作可以查看Kubernetes搭建过程中使用k8s.gcr.io、quay.io、docker.io的镜像加速

查看pod状态依然有问题:

Copy
-> [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:

Copy
-> [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 下加入两行:

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

然后删除 kube-controller-manager ,它会自动重启,配置就生效了,稍等片刻flannel的状态就变成Running了。

Copy
-> [root@kube0.vm] [~] kubectl delete -n kube-system pod/kube-controller-manager-kube0.vm pod "kube-controller-manager-kube0.vm" deleted

只剩最后一个问题了,还有两个coredns的pod状态是"ContainerCreating"(可以查看前面的截图),也是由于容器网络导致的,删掉后自动重建新的就好了。

Copy
-> [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

搭建完成#

posted @   虾敏四把刀  阅读(1711)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
点击右上角即可分享
微信分享提示
CONTENTS