虽然有minikube.exe这种快速搭建k8s的仿真学习环境工具,但在使用上和实际k8s作业效果还是有距离,为了更逼近真实k8s环境,本文介绍如何通过vmware创建3个centos7虚拟系统,通过kubeadm快速搭建一主2节点的k8s环境。

一、准备工作

        首先在vmware安装一个干净的centos7系统(安装一个虚拟centos7系统就ok,后面采用拷贝构建节点所需的虚拟系统),系统有以下几点要求:

        1)需要给虚拟系统分配最低2内核总数,2G内存,这是运行k8s的一个基本资源要求

        2)最好安装centos7的最基础版本(无桌面、无开发、调试等工具)

        3)最好安装上vmware-tools,方便主机文件夹挂载,如果遇到vmware-tools对内核有要求,升级内核后安装完vmware-tools,重启选择新内核,删除旧内核,减少系统容量和降低干扰。

【1】命令行安装vmware-tools的挂载问题
#在/mnt目录下新建一个名为cdrom的文件夹
mkdir /mnt/cdrom
#将光盘挂载到/mnt/cdrom目录下
mount -t iso9660 /dev/cdrom /mnt/cdrom
#查看内容,将VMwareTools-***.tar.gz拷贝到~目录进行解压安装,安装完成后删除安装包及解压文件
ls /mnt/cdrom

【2】vmware-tools安装遇到的内核要求不匹配问题
uname -r              #查看当前内核
rpm -qa |grep kernel  #查找已安装内核
yum remove kernel-*** # #删除旧内,如kernel-3.10.0-514.el7.x86_64  

        完成系统安装,并确定主机文件能挂接到系统后,开始进入k8s安装部署环节。

二、k8s安装

        1)更新yum源为阿里源

#安装wget包,用于下载阿里源配置
yum install wget 
#备份旧yum源
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 
cp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak
#下载阿里源repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#清理原来的缓存,重新配置缓存 
yum clean all
yum makecache

        2)安装k8s,可以将下面配置文一个脚本如k8s-install.sh一键安装。

#!/bin/bash
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 修改时区
ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
yum -y install ntpdate
ntpdate cn.pool.ntp.org
#每台主机都关闭防火墙及selinux
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
#关闭swap分区(如果创建主机时删除swap分区,这里不用修改)
swapoff -a
# 修改文件防止下次启动挂载swap
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#<*特*别*注*意*>安装指定版本,本文采用v1.14.2的k8s版本
yum install -y docker kubelet-1.14.2 kubeadm-1.14.2 kubectl-1.14.2 kubernetes-cni-1.14.2 
#docker-ce docker-ce-selinux
systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl start kubelet

        3)配置调整

1.解决kubeadm init时control-plane超时问题
# 修改文件设置selinux永久关闭
vi /etc/sysconfig/selinux
#将SELINUX=enforcing调整为
SELINUX=disabled

#或者
vi /etc/selinux/config
#将SELINUX=enforcing调整为
SELINUX=disabled

2.iptables关闭
#最小安装一般不会有iptables,但谨慎点还是关掉iptables
systemctl disable iptables
systemctl stop iptables

3.解决kubeadm init时[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]的报错问题
#启动bridge-nf方式:编辑文件vim /etc/sysctl.conf 添加:
sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.ipv4.ip_forward=1

/sbin/sysctl -p

        4)拉取镜像

        可以将下面命令配置到一个脚本(k8s-images.sh)一键拉取,记得替换自己想要的版本号,和前面安装的k8s版本号保持一致,类似etcd、puse看k8s具体要求,一般不用调整也能满足,如果你阅读本博文时间,离本博文创建时间太久,镜像源拉取失败,请自行测试新版本号,但记得需要卸载k8s旧版本,重新安装指定k8s版本(如:yum install -y docker kubelet-1.14.2 kubeadm-1.14.2 kubectl-1.14.2 kubernetes-cni-1.14.2)。

#!/bin/bash
#kubeadm  init --kubernetes-version=v1.14.2
docker pull mirrorgooglecontainers/kube-apiserver:v1.14.2
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.2
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.2
docker pull mirrorgooglecontainers/kube-proxy:v1.14.2
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull mirrorgooglecontainers/pause:3.1
docker pull coredns/coredns:1.3.1

docker tag mirrorgooglecontainers/kube-apiserver:v1.14.2 k8s.gcr.io/kube-apiserver:v1.14.2
docker tag mirrorgooglecontainers/kube-controller-manager:v1.14.2 k8s.gcr.io/kube-controller-manager:v1.14.2
docker tag mirrorgooglecontainers/kube-scheduler:v1.14.2 k8s.gcr.io/kube-scheduler:v1.14.2
docker tag mirrorgooglecontainers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
docker tag mirrorgooglecontainers/etcd:3.3.10  k8s.gcr.io/etcd:3.3.10
docker tag mirrorgooglecontainers/pause:3.1  k8s.gcr.io/pause:3.1
docker tag coredns/coredns:1.3.1  k8s.gcr.io/coredns:1.3.1

        完成后关闭系统。

三、一主master两node部署

        5) 拷贝系统

        在vmware的VM-Machines目录(创建centos7时指定)下拷贝centos7系统文件夹两份作为node节点载体。

        本文实现如下:

         6)master配置

        (如果刚刚关闭些centos7系统有重新命名其文件夹,最好修改虚拟机名称和重新挂载主机文件夹。)

        启动系统,登录后进行以下操作:

【1】
#先设置主机名
hostnamectl set-hostname k8s-master
【2】
#查看系统网络,本文的vmware网关是192.168.174.1,三个系统分配的网址见后面
ifconfig
【3】
#修改/etc/hosts文件,地址根据查看确定
cat /etc/hosts
#本文具体示例如下
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.174.134   k8s-master
#192.168.174.135   k8s-node1
#192.168.174.136   k8s-node2
【4】
#重启
reboot

         可重启查看配置:

        7) 初始化master

        重新进入系统,执行

cd 挂载目录
kubeadm  init > a.out

        如果遇到异常情况,请相应问题点调整配置,然后在执行

kubeadm reset  #重置
kubeadm init > a.out

        正确初始化类似如下输出,最后一句输出是构建node需要的指令,这也是前面将打印定向输出(> a.out)的原因,方便拷贝该指令:

[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.174.134:6443 --token bfb8jh.nbr8uf6oj11yoi8n \
    --discovery-token-ca-cert-hash sha256:962a8b3397912ff1cc9e2d7aeebb1256c153b5d30a2b7df05c4e0b45e050e96e 

        8)配置node1

        在vmware 打开已经拷贝的node1的虚拟vmx文件,编辑虚拟机设置:

        1、修改虚拟机名称

        2、挂载主机文件夹

        作出调整后,启动系统,选择已经复制确认

        进入系统,重设主机名和hosts配置,如下:

【1】
#先设置主机名
hostnamectl set-hostname k8s-node1
【2】
#查看系统网络,本文的vmware网关是192.168.174.1,三个系统分配的网址见后面
ifconfig
【3】
#修改/etc/hosts文件,地址根据查看确定
cat /etc/hosts
#本文具体示例如下
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#192.168.174.134   k8s-master
192.168.174.135   k8s-node1
#192.168.174.146   k8s-node2
【4】
#重启
reboot

        系统重启后,执行master配置输出的的指令,如:

kubeadm join 192.168.174.134:6443 --token bfb8jh.nbr8uf6oj11yoi8n \
    --discovery-token-ca-cert-hash sha256:962a8b3397912ff1cc9e2d7aeebb1256c153b5d30a2b7df05c4e0b45e050e96e 

        9)类似地配置node2

        10)看看node配置情况,在master所在的虚拟系统,执行

        kubectl get nodes

        正确应该显示类似如下,完成k8s的1master+2node配置,后续就可以配置yaml文件进行部署测试:

四、可能遇到问题

        可能会遇到和本文类似下列问题,一并提供参考:

【1】
#The connection to the server localhost:8080 was refused - did you specify the right host or port?
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

【2】
#kubectl get nodes获得的内容全是NotReady,查看日志/var/log/messages,报错
#Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
#使用命令vim /var/lib/kubelet/kubeadm-flags.env,编辑配置文件,删除掉--network-plugin=cni
#KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni

#master节点和node节点都删除掉--network-plugin=cni,然后重启kubelet
systemctl restart kubelet

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐