VirtualBox(vagrant) + k8s单节点(只有master)

前言:在生产环境中,建议k8s使用至少三个节点的集群,以确保高可用性。不过也可以在单节点上安装和运行集群,方便用于学习和测试目的。但因为所有组件都在同一个节点上运行,它不具备高可用性和故障恢复功能。
由于内存资源分配不够等原因,本博客记录单节点k8s部署流程。

一、实验环境

操作系统

Windows 10

涉及版本

Docker 19.03.6
Kubernetes 1.17.3
kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
Kubesphere 3.0.0

一些工具

VirtualBox-6.0.10-132072-Win
Vagrant_2.2.19_x86_64
Git for Windows
Xshell7
Xftp7

二、准备工作:Win10下基于VirtualBox+Vagrant的Linux环境搭建

1、下载并安装Virtualbox

Download_Old_Builds_6_0 – Oracle VM VirtualBox
版本选择:VirtualBox-6.0.10-132072-Win
VirtualBox(vagrant) + k8s单节点(只有master)_第1张图片

2、下载并安装Vagrant

Install Vagrant Install or update to v2.2.19 of Vagrant to get started.
版本选择:vagrant_2.2.19_x86_64
VirtualBox(vagrant) + k8s单节点(只有master)_第2张图片
下载后安装,没有太多问题
唯一可能遇到的问题:CPU需要开启虚拟化

3、编写Vagrantfile

文件命名为Vagrantfile,放在全英文路径文件夹下

Vagrant.configure("2") do |config|
  # 设置虚拟机的Box
  config.vm.box = "centos/7"
  
  config.vm.define "k8s-node" do |node|
    # 设置虚拟机的主机名
    node.vm.hostname = "k8s-node"
    node.vm.provider "virtualbox" do |vb|
      # 设置虚拟机的内存大小
      vb.memory = 4096
      # 设置虚拟机的CPU个数
      vb.cpus = 4
    end
 # 设置虚拟机的IP   
    node.vm.network "private_network", ip: "192.168.56.100"
  end
end

注意:IP不是随意设置,需要ipconfig查询VirtualBox IP配置
VirtualBox(vagrant) + k8s单节点(只有master)_第3张图片

4、Git Bash中使用vagrant up命令

在Vagrantfile的文件夹右键选择Git Bash Here
VirtualBox(vagrant) + k8s单节点(只有master)_第4张图片

执行vagrant up命令
VirtualBox(vagrant) + k8s单节点(只有master)_第5张图片

打开virtualbox可以看到正在运行的虚拟机
VirtualBox(vagrant) + k8s单节点(只有master)_第6张图片
文件夹中会生成.vagrant文件
VirtualBox(vagrant) + k8s单节点(只有master)_第7张图片
除了Vagrantfile,其它文件都是目前阶段暂时不需要的

可能遇到的问题

1、需要在非中文无空格目录下
2、没有Gitbash直接在文件目录使用cmd命令行也可以
3、其实 vagrant 完全可以一键部署全部 k8s 集群。参考下面两个链接
kubernetes-vagrant-centos-cluster
k8s-playground

5、vagrant ssh连接至k8s-node

使用vagrant ssh k8s-node连接
su root切换到root
密码是vagrant
VirtualBox(vagrant) + k8s单节点(只有master)_第8张图片
6、开启root的密码访问权限
修改文件vi /etc/ssh/sshd_config
找到PasswordAuthentication并将no修改成yes

i进入insert模式
esc :wq 退出并保持

VirtualBox(vagrant) + k8s单节点(只有master)_第9张图片
重启服务service sshd restart
重启服务

6、使用Xshell7连接到k8s-node

使用两次exit;即可退出
VirtualBox(vagrant) + k8s单节点(只有master)_第10张图片
打开Xshell7,连接192.168.56.100
VirtualBox(vagrant) + k8s单节点(只有master)_第11张图片
输入用户名root密码vagrant
记住用户名密码
VirtualBox(vagrant) + k8s单节点(只有master)_第12张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第13张图片

6、设置linux环境

关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld

关闭 selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

关闭 swap:
swapoff -a 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab 永久
free -g 验证,swap 必须为 0;

添加主机名与 IP 对应关系
vi /etc/hosts
10.0.2.15 k8s-node

将桥接的 IPv4 流量传递到 iptables 的链:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

VirtualBox(vagrant) + k8s单节点(只有master)_第14张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第15张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第16张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第17张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第18张图片

一些问题

1、开启CPU虚拟化

VirtualBox(vagrant) + k8s单节点(只有master)_第19张图片
具体开启方法需要确认你的计算机型号和CPU、BIOS的型号
过老的计算机是不支持虚拟化技术的
一般虚拟化都是开启的

2、虚拟机名称过长

虚拟机名称过长
解决方法:VirtualBox(vagrant) + k8s单节点(只有master)_第20张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第21张图片

3、vagrant up时一直卡在 SSH auth method: private key

报错信息如下:

Timed out while waiting for the machine to boot. This means that Vagrant was unable to communicate with the guest machine within the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that Vagrant had when attempting to connect to the machine. These errors are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly working and you're able to connect to the machine. It is a common problem that networking isn't setup properly in these boxes. Verify that authentication configurations are also setup properly, as well.

If the box appears to be booting properly, you may want to increase the timeout ("config.vm.boot_timeout") value.

这个错误表示 Vagrant 在配置的超时时间内无法与虚拟机通信
一般是因为VirtualBox和Vagrant版本不适配
可以尝试升级 Vagrant 版本或VirtualBox版本

三、所有节点安装docker、kubeadm、kubelet、kubectl

1、安装Docker -CE

卸载系统之前的 docker
sudo yum remove docker \
		docker-client \
		docker-client-latest \
		docker-common \
		docker-latest \
		docker-latest-logrotate \
		docker-logrotate \
		docker-engine

VirtualBox(vagrant) + k8s单节点(只有master)_第22张图片

安装必须的依赖
sudo yum install -y yum-utils \
	device-mapper-persistent-data \
	lvm2

VirtualBox(vagrant) + k8s单节点(只有master)_第23张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第24张图片

设置 docker repo 的 yum 位置
sudo yum-config-manager  --add-repo \
		https://download.docker.com/linux/centos/docker-ce.repo
安装 docker,以及 docker-cli
yum install docker-ce-19.03.6 docker-ce-cli-19.03.6 containerd.io

VirtualBox(vagrant) + k8s单节点(只有master)_第25张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第26张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第27张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第28张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第29张图片
安装

2、配置镜像加速

配置 docker 加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ke9h1pt4.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

VirtualBox(vagrant) + k8s单节点(只有master)_第30张图片

3、启动Docker && 设置docker开机启动

启动 docker & 设置 docker 开机自启
systemctl enable docker

启动 docker & 设置 docker 开机自启

4、添加阿里云Yum源

添加阿里云 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

添加阿里云 yum 源

5、安装kubeadm,kubelet和kubectl

安装 kubeadm,kubelet 和 kubectl
yum list|grep kube
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
systemctl enable kubelet

安装 kubeadm,kubelet 和 kubectl
VirtualBox(vagrant) + k8s单节点(只有master)_第31张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第32张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第33张图片

6、开机启动

开机启动
systemctl start kubelet

开机启动

7、查看kubelet的状态

检查kubelet服务
systemctl status kubelet.service

VirtualBox(vagrant) + k8s单节点(只有master)_第34张图片

三、部署k8s-master

直接执行kubeadm init,会由于墙的网络原因失败,如下图
因此先执行master_images.sh文件
VirtualBox(vagrant) + k8s单节点(只有master)_第35张图片

1、创建并执行master_images.sh

#!/bin/bash

images=(
	kube-apiserver:v1.17.3
    kube-proxy:v1.17.3
	kube-controller-manager:v1.17.3
	kube-scheduler:v1.17.3
	coredns:1.6.5
	etcd:3.4.3-0
    pause:3.1
)

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
#   docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName  k8s.gcr.io/$imageName
done
查看创建的master_images.sh权限
ls
ll

VirtualBox(vagrant) + k8s单节点(只有master)_第36张图片

添加权限chmod 700 master_images.sh

VirtualBox(vagrant) + k8s单节点(只有master)_第37张图片

执行master_images.sh文件
./master_images.sh

VirtualBox(vagrant) + k8s单节点(只有master)_第38张图片

2、初始化kubeadm

查看IP
ip route show

VirtualBox(vagrant) + k8s单节点(只有master)_第39张图片
我的IP是10.0.2.15,如果不一样需要更改下面命令中的IP地址

master 节点初始化
kubeadm init \
  --apiserver-advertise-address=10.0.2.15 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.17.3 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

VirtualBox(vagrant) + k8s单节点(只有master)_第40张图片
VirtualBox(vagrant) + k8s单节点(只有master)_第41张图片

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

测试 kubectl
在这里插入图片描述

如果有多个节点需要kubeadm join加入
我这里只有一个节点因此不需要
具体令牌根据初始化给出的提示即可,如下图

kubeadm join

kubeadm join 10.0.2.15:6443 --token 8mldxi.oxlzlcbcc1a35i6j \
>     --discovery-token-ca-cert-hash sha256:67a5bc5efa82acc47f1fb943821ebaa5a9ce698fbf4248511a3d0d365c99d5a7

3、安装POD网络插件(CNI)

网络插件有很多,这里选择flannel
k8s插件集合

获取flannel的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

VirtualBox(vagrant) + k8s单节点(只有master)_第42张图片

查看安装的状态
 kubectl get pods --all-namespaces

一些问题

1、kube-system的coredns一直处于Pending状态

coredns一直处于Pending状态
通过查阅官方文档,发现这是预期之中的
官方文档
VirtualBox(vagrant) + k8s单节点(只有master)_第43张图片
coredns一直pending肯定是网络插件原因
但是我在flannel已经running的情况下,仍然coredns跑不起来
查看coredns的pod日志
kubectl describe pod -n kube-system coredns
报错如下

0/1 nodes are available: 1 node(s) had taints that the pod didn‘t tolerate.

报错
这是因为master有污点
kubectl taint nodes --all node-role.kubernetes.io/master-
污点
继续查看日志,这时正常报错

[failed to find plugin "flannel" in path [/opt/cni/bin]]
network plugin is not ready: cni config uninitialized

VirtualBox(vagrant) + k8s单节点(只有master)_第44张图片
这是因为在1.0.0版本后CNI Plugins中没有flannel,查看 /opt/cni/bin 缺少 flannel
需要下载CNI插件

github下载地址:CNI plugins v0.8.6

下载后上传到Linux解压即可
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz
复制 flannel 到 /opt/cni/bin/
cp flannel /opt/cni/bin/
再次查看节点状态,恢复正常

2、swap只是临时禁用

报错

The connection to the server 10.0.2.15:6443 was refused

报错
查看日志
journalctl -fu kubelet
VirtualBox(vagrant) + k8s单节点(只有master)_第45张图片

running with swap on is not supported. Please disable swap.

发现很明显是swap的问题,因为只是临时禁用了swap,因此下次启动时,需要再次关闭
运行以下命令即可永久禁用swap

# 禁用swap
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

禁用Swap,机器重启后不生效
swapoff -a
cp -p /etc/fstab /etc/fstab.bak$(date '+%Y%m%d%H%M%S')
sed -i "s/\/dev\/mapper\/centos-swap/\#\/dev\/mapper\/centos-swap/g" /etc/fstab
systemctl daemon-reload
systemctl restart kubelet

VirtualBox(vagrant) + k8s单节点(只有master)_第46张图片

你可能感兴趣的:(k8s,kubernetes,docker)