使用Minikube搭建模拟本机K8s实验环境

[TOC]

前言

由于研究istio需要,准备在本机搭建一套k8s环境,测试完成后再部署到线上。通过搜集了资料,能支持自动化在本机创建实验环境的工具有两套:
+ Minikube + Minishift

本次搭建本人优先选择了开发更成熟的前者Minikube.
工具的原理都相似,主要是以下流程:

启动的内部执行过程: + 创建虚拟机 + 设置boot2docker + 为本地计算机和VM创建证书 + 在本地计算机和虚拟机之间建立网络 + 在VM上运行基于Docker镜像的本地Kubernetes集群

环境: + Centos7 x64 + CPU 2G x 4核 开启虚拟化 Intel VT-x + 内存 8G + 硬盘 SSD 50GB

准备

需要注意:
1.本文章所介绍的方法和指出的问题仅针对当前组件版本,新版本有可能已经解决,若使用新版本请以最新版本文档为准。
2.本文章方法仅推荐用于本机实验环境部署,线上部署请使用二进制部署Kubeadm等其他方式.

组件支持: + VirtualBox (或者Kvm默认使用的是VitualBox) + KubeCtl v1.9.4 + Minikube v0.25.1

VirtualBox安装

Yum安装

step1:卸载老版本,若未安装过可忽略

yum remove VirtualBox-4*

step2:添加VirtualBox安装源

cd /etc/yum.repos.d/
wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo 

step3:安装相关依赖(这部很关键)

yum update
yum -y install binutils qt gcc make patch libgomp glibc-headers glibc-devel kernel-headers kernel-devel dkms

step4:安装VirtualBox 5.1

yum -y install VirtualBox-5.1

step5:重建VirtualBox 5.1内核模块

/usr/lib/virtualbox/vboxdrv.sh setup

step6: 添加组用户

usermod -a -G vboxusers $(whoami)

step7: 登陆组

newgrp vboxusers

step7: 若出现KERN_DIR的错误,则需要设置相应的全局变量

KERN_DIR=/usr/src/kernels/3.10.0-229.7.2.el7.x86_64
export KERN_DIR

KubeCtl安装

https://github.com/kubernetes/kubernetes/release

自动下载编译好的稳定版二进制文件

curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.9.4/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/

Minikube安装

https://github.com/kubernetes/minikube/releases

自动下载编译好的稳定版二进制文件

curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.25.1/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

Kvm2虚拟机环境安装

# 安装kvm
$ sudo yum install libvirt-daemon-kvm qemu-kvm

# 添加当前用户到libvirt组
$ sudo usermod -a -G libvirt $(whoami)

# 登陆组libvirt
$ newgrp libvirt

# 修改文件所属用户
sudo chown -R $(whoami):libvirtd /var/run/libvirt

# 安装kvm2
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 && chmod +x docker-machine-driver-kvm2 && sudo mv docker-machine-driver-kvm2 /usr/local/bin/

# 使用kvm2虚拟机启动Minikube
minikube start --vm-driver=kvm2 --docker-env HTTP_PROXY=http://127.0.0.1:8118  --docker-env HTTPS_PROXY=http://127.0.0.1:8118

运行

由于minikube默认使用的是VirtualBox,若是使用了其他VM需要设置一下。 Minikube支持以下驱动: + virtualbox + vmwarefusion + KVM2 + KVM (deprecated in favor of KVM2) + hyperkit + xhyve + hyperv

# 默认使用VirtualBox
minikube start

# 使用docker代理
minikube start --vm-driver=kvm2 --docker-env HTTP_PROXY=http://127.0.0.1:8118  --docker-env HTTPS_PROXY=http://127.0.0.1:8118

# 使用KVM2
minikube start --vm-driver kvm2

[root@localhost software]# minikube start
Starting local Kubernetes v1.9.4 cluster...
Starting VM...
Downloading Minikube ISO
 142.22 MB / 142.22 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading localkube binary
 163.02 MB / 163.02 MB [============================================] 100.00% 0s
 65 B / 65 B [======================================================] 100.00% 0s
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

# 使用minikube status检查运行状态
[root@localhost software]# minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

首次启动会自动下载镜像和设置集群需要一段时间。

常用指令

# 启动
$ minikube start

# 仪表盘
$ minikube dashboard

踩坑与填坑

VirtualBox无法运行

启动Minikube时候卡在 Starting cluster components

镜像Issue

可能原因: Minikube与K8s版本不匹配
检查方式:

$ minikube version
minikube version: v0.28.0

$ kubectl version

release note上看版本是否对应,并不一定追求最近,搭配稳定最重要

Dashboarh 无法启动

可能原因: 部分容器未启动成功
具体原因: 由于GFW,虚拟机内部Docker无法正常从gcr.io外部源拉取镜像,需要设置代理或采用本地源
检查方式:

# 查看日志
$ minikube logs 

# 根据下表,找到未拉取成功或者启动成功的镜像,手动下载

|序号|依赖镜像名称|源地址| |:-|:-|:-| |1|pause-amd64:3.0|gcr.io/google_containers/pause-amd64:3.0| |2|kube-addon-manager-amd64:v6.5|gcr.io/google-containers/kube-addon-manager-amd64:v6.5| |3|kubernetes-dashboard-amd64:v1.8.1|k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.1| |4|k8s-dns-dnsmasq-nanny-amd64:1.14.5|k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.5| |5|k8s-dns-kube-dns-amd64:1.14.5|k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.5| |6|storage-provisioner:v1.8.1|gcr.io/k8s-minikube/storage-provisioner:v1.8.1|

解决方法: 从可用镜像库拉取镜像,用docker tag功能设置成系统需要的标志 镜像源: + Aliyun: registry.cn-hangzhou.aliyuncs.com/google-containers + DockerHub:https://hub.docker.com/u/mirrorgooglecontainers/

# 从镜像拉取
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0

# 修改tag
docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0


# 镜像pause-amd64
docker pull mirrorgooglecontainers/pause-amd64:3.0
docker tag mirrorgooglecontainers/pause-amd64:3.0 gcr.io/google-containers/pause-amd64:3.0

# 镜像kube-addon-manager
docker pull mirrorgooglecontainers/kube-addon-manager-amd64:v6.5
docker tag mirrorgooglecontainers/kube-addon-manager-amd64:v6.5 gcr.io/google-containers/kube-addon-manager-amd64:v6.5

# 镜像kubernetes-dashboard 
docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.8.1
docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.8.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.1

# 镜像k8s-dns-dnsmasq-nanny
docker pull mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.5 
docker tag mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.5 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.5

# 镜像k8s-dns-sidecar
docker pull mirrorgooglecontainers/k8s-dns-sidecar-amd64:1.14.5 &&
docker tag mirrorgooglecontainers/k8s-dns-sidecar-amd64:1.14.5 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.5

# 镜像k8s-dns-kube-dns
docker pull mirrorgooglecontainers/k8s-dns-kube-dns-amd64:1.14.5
docker tag mirrorgooglecontainers/k8s-dns-kube-dns-amd64:1.14.5 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.5

# 镜像storage-provisioner
docker pull dieudonnecc/storage-provisioner:v1.8.1 &&
docker tag dieudonnecc/storage-provisioner:v1.8.1 gcr.io/k8s-minikube/storage-provisioner:v1.8.1

参考资料

getting-started-guides/minikube

文章目录