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

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

Docker安装步骤如下:

  1. //添加yum源
  2. yum-config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo
  3. //安装
  4. wget -qO- https://get.docker.com | sh

安装Kubernetes

禁用SELinux

  • 临时关闭:命令行执行 setenforce 0
  • 永久关闭:修改/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled

关闭防火墙

  1. systemctl disable firewalld && systemctl stop firewalld

关闭交换分区

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

更改iptables的设置

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

添加国内yum源

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

添加docker镜像

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

安装kubectl、kubeadm、kubelet

  1. yum -y install kubectl kubeadm kubelet

启动docker、kubelet

  1. systemctl enable docker && systemctl start docker
  2. systemctl enable kubelet && systemctl start kubelet

clone虚拟机

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

  1. hostnamectl set-hostname kube1.vm

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

  1. vi /etc/hosts
  2. # 追加以下内容(ip自行替换)
  3. 192.168.1.98 kube0.vm
  4. 192.168.1.99 kube1.vm
  5. 192.168.1.100 kube2.vm

初始化master、添加node

在kube0.vm上执行 kubeadm init

安装成功后在kube0.vm执行以下命令,以便于使用kubectl

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

在kube1.vm、kube2.vm中执行以下命令加入集群(具体参数自行替换)。

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

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

  1. -> [root@kube0.vm] [~] kubectl get node
  2. NAME STATUS ROLES AGE VERSION
  3. kube0.vm NotReady master 21h v1.17.3
  4. kube1.vm NotReady <none> 21h v1.17.3
  5. kube2.vm NotReady <none> 21h v1.17.3

执行:kubectl describe node/kube0.vm ,发现是未配置容器网络。

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

配置容器网络(flannel)

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

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

kubectl describe 查看原因:

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

众所周知的原因,使用镜像拉取,然后docker tag 设置别名。

具体操作可以查看Kubernetes搭建过程中使用k8s.gcr.io、quay.io、docker.io的镜像加速

查看pod状态依然有问题:

  1. -> [root@kube0.vm] [~] kubectl get pod -A|grep flannel
  2. kube-system kube-flannel-ds-amd64-6kbdj 0/1 CrashLoopBackOff 5 11m
  3. kube-system kube-flannel-ds-amd64-k29d4 0/1 Error 5 11m
  4. kube-system kube-flannel-ds-amd64-kftn9 0/1 CrashLoopBackOff 6 11m

查看logs:

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

解决方法:

编辑 /etc/kubernetes/manifests/kube-controller-manager.yaml ,在spec -> containers -> -command 下加入两行:

  1. - --allocate-node-cidrs=true
  2. - --cluster-cidr=10.244.0.0/16

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

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

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

  1. -> [root@kube0.vm] [~] kubectl delete -n kube-system pod coredns-6955765f44-dr5wg coredns-6955765f44-zmxft
  2. pod "coredns-6955765f44-dr5wg" deleted
  3. pod "coredns-6955765f44-zmxft" deleted

搭建完成

VirtualBox上使用kubeadm安装Kubernetes集群的更多相关文章

  1. Kubernetes(K8s) 安装(使用kubeadm安装Kubernetes集群)

    背景: 由于工作发生了一些变动,很长时间没有写博客了. 概述: 这篇文章是为了介绍使用kubeadm安装Kubernetes集群(可以用于生产级别).使用了Centos 7系统. 一.Centos7 ...

  2. centos7使用kubeadm安装kubernetes集群

    参考资料:官方文档 一.虚拟机安装 配置说明: windows下使用vbox,centos17.6 min版,kubernetes的版本是1.14.1, 安装如下三台机器: 192.168.56.15 ...

  3. centos7.5下kubeadm安装kubernetes集群安装

    文章是按https://blog.csdn.net/Excairun/article/details/88962769,来进行操作并记录相关结果 版本:k8s V14.0,docker-ce 18.0 ...

  4. Ubuntu上kubeadm安装Kubernetes集群

    一 创建VM 3台VM,其中一台为master节点,2台work node: 二 安装相关软件 在所有节点上运行: apt-get update apt-get install apt-transpo ...

  5. 安装Kubernetes集群时遇到的问题及解决方法

    在搭建Kubernetes集群时遇到一些问题,记录在这里. 搭建过程在另一篇文章:VirtualBox上使用kubeadm安装Kubernetes集群 1. 虚拟机安装完CentOS7登录时遇到war ...

  6. kubeadm搭建kubernetes集群之二:创建master节点

    在上一章kubeadm搭建kubernetes集群之一:构建标准化镜像中我们用VMware安装了一个CentOS7虚拟机,并且打算用这个虚拟机的镜像文件作为后续整个kubernetes的标准化镜像,现 ...

  7. CentOS 7.5 使用 yum 安装 Kubernetes 集群(二)

    一.安装方式介绍 1.yum 安装 目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面,使用 yum 安装,好处是简单,坏处也很明显,需要官方更新 yum 源才能 ...

  8. kubeadm 搭建kubernetes集群环境

    需求 kubeadm 搭建kubernetes集群环境 准备条件 三台VPS(本文使用阿里云香港 - centos7.7) 一台能SSH连接到VPS的本地电脑 (推荐连接工具xshell) 安装步骤 ...

  9. 从0到1使用Kubernetes系列(三):使用Ansible安装Kubernetes集群

    前两期的文章介绍了Kubernetes基本概念和架构,用Kubeadm+Ansible搭建Kubernetes集群所需要的工具及其作用.本篇介绍怎么使用Ansible安装Kubernetes集群. 启 ...

随机推荐

  1. JavaScript 的数据结构与算法

    1数组 1.1方法列表 数组的常用方法如下: concat: 链接两个或者更多数据,并返回结果. every: 对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true. fi ...

  2. 《VSTO开发入门教程》配套资源下载

    <VSTO开发入门教程> 刘永富 著 清华大学出版社 封面截图 购书网址 京东网 淘宝网 配套资源到如下页面寻找: https://www.cnblogs.com/ryueifu-VBA/ ...

  3. 从 0 到 1 到完美,写一个 js 库、node 库、前端组件库

    之前讲了很多关于项目工程化.前端架构.前端构建等方面的技术,这次说说怎么写一个完美的第三方库. 1. 选择合适的规范来写代码 js 模块化的发展大致有这样一个过程 iife => commonj ...

  4. [USACO09MAR]Moon哞哞叫Moon Mooing(模拟)

    链接:https://ac.nowcoder.com/acm/contest/1086/F来源:牛客网 题目描述 A full moon casts some sort of spell on the ...

  5. PAT甲级——1009 Product of Polynomials

    PATA1009 Product of Polynomials Output Specification: For each test case you should output the produ ...

  6. mysql 子查询不支持limit

    mysql执行如下语句 : SELECT * FROM `xxx_base_info` where yn =1 and xxx_keeper_id in (SELECT id FROM `user`w ...

  7. linux文件系统与链接

    Linux的文件属性图1 图1   linux的文件属性 ls -lhi -l 长格式 -h 人性化 -i inodo -d 看目录自己的信息 inode 源自于文件系统 分区 平面设计图 格式化 施 ...

  8. Miller-Rabin素数检测算法

    遇到了一个题: Description: Goldbach's conjecture is one of the oldest and best-known unsolved problems in ...

  9. 磁盘处于脱机状态"解决办法

    由于管理员设置的策略,该磁盘处于脱机状态"解决办法 1.运行:cmd 2.输入:DISKPART.exe 3.DISKPART> san 4.DISKPART> san poli ...

  10. JS中获得指定日期前或后几天对应的日期

    var d = new Date(); d.setDate(d.getDate() - 2); console.log(d.toString()); // First of month var c = ...