minikube实践篇(Deprecated!!!)

1.安装minikube

在油管上观看了TechWorld with Nana的频道,发现minikube对开发人员友好,在本地也不用开集群了,其实就像当于是开了一个虚拟机。

我准备直接在vmware中安装。但是安装minikube并不是那么容易。

1.1首先根据官网安装

minikube官网

我使用CentOS-7-x86_64-Minimal-2009,所以使用rpm包安装minikube。

昨天的时候minikube更新到了1.18.1版本,但是minikube官网的下载连接下载的还是1.18.0版本,这里使用最新版,所以在GitHub上下载:GitHub上的rpm包 1.18.1版本

下载完成后安装。这个时候最好先安装一下kubectl,虽然minikube会下载kubectl但是要使用minikube kubectl才能使用minikube下载的kubectl。阿里云提供了kubectl的安装:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install -y kubectl

这里注意一下,由于我是直接将minikube安装在虚拟机中,所以相当于是裸金属服务器。

If you are running within a VM, your hypervisor does not allow nested virtualization. You will need to use the None (bare-metal) driver

按照官网的步骤走:

minikube start --vm-driver=none

这里会提示缺少conntrack,所以要yum install -y conntrack一下,之后接着start。

等一段时间之后提示initialization failed。这就是遇到了网络问题,原因是minikube的组件,类似api-server、etcd和coredns等镜像都在gcr中。此时我们就需要借助到国内的镜像源来拉取镜像了。关闭虚拟机,把快照退回到安装好docker的状态。

1.2设置阿里云镜像安装

https://github.com/AliyunContainerService/minikube

https://yq.aliyun.com/articles/221687

使用命令启动minikube(–registry-mirror的参数xxxxxxxx是个人的镜像仓库地址):

minikube start --vm-driver=none --image-mirror-country cn --registry-mirror=https://xxxxxxxx.mirror.aliyuncs.com

等待一会,显示

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

已经成功!但事实不是如此。

运行kubectl get pods -A之后发现

在这里插入图片描述

其中有个一个pod(storage-provisioner)处于ErrImagePull状态,说明使用阿里源还是没有把镜像完全拉下来,此时使用kubectl describe pods storage-provisioner -n kube-system去kube-system名称空间下查看这个pod的详细信息。

发现确实是ImagePullBackOff,并且拉取的镜像是 registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v4镜像。

然后单独使用docker尝试拉取,发现确实手动拉取也不行。

此时使用docker images查看拉取成功的镜像:

在这里插入图片描述

发现镜像名称都很整齐,开头都是registry.cn-hangzhou.aliyuncs.com/google_containers,代表了镜像仓库的地址。

唯独storage-provisioner镜像的前面多加了一个/k8s-minikube。难道是阿里云的镜像源地址出错了?我尝试拉取registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v4镜像(也就是把/k8s-minikube去掉了)。

在这里插入图片描述

发现拉取成功。这就很无语。。

只能retag把镜像名称替换一下,然后删除替换之前的镜像。(retag奏效的前提是镜像的拉取策略是IfNotPresent,若本地不存在目标镜像,则拉取,若本地存在目标镜像,则不拉取)

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v4 registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v4

docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v4

现在docker中拥有minikube启动所需的全部镜像,此时运行minikube stop minikube start重启minikube,让集群重新配置。

然后再查看所有名称空间下的pod的运行状态:

在这里插入图片描述

minikube集群成功运行。

但是此时。仍然没有完成。

我的集群准备有minikube dashboard、准备使用Ingress这些都需要使用额外的镜像。

接下来我们使用minikube dashboard --url启动dashboard,没有成功,原因可想而知,还是网络问题。。

这次需要pull的镜像是registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetesui/dashboard:v2.1.0@sha256:7f80b5ba141bead69c4fee8661464857af300d7d7ed0274cf7beecedc00322e6 和 registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetesui/metrics-scraper:v1.0.4@sha256:555981a24f184420f3be0c79d4efb6c948a85cfce84034f85a563f4151a81cbf 这两个镜像。

同样把多余出来的/kubernetesui和后面的哈希码去掉,就又可以下载了。

但是这次情况特殊,需要的镜像名称后面有哈希码,retag的时候报错:

refusing to create a tag with a digest reference

经查阅网络资料,好像没有更好的方法了。

1.3使用代理安装

这个方法其实是我的第一选择,但是一直卡在了某一步,初始化失败。

先把上次实验环境回退到配置好docker的快照。

先临时设置代理,按照之前的传统方式(192.168.1.104是宿主机Windows的IP地址):

export http_proxy=192.168.1.104:65530
export https_proxy=192.168.1.104:65530

然后测试是否代理成功,发现已经代理成功。

然后执行minikube start --vm-driver=none,执行过程中命令行提示:

You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP (192.168.174.200).
Please see https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/ for more details

说我没有设置NO_PROXY环境变量把虚拟机的IP排除在代理之外。

然后进入下面的这个网站查看

在这里插入图片描述

发现确实要设置NO_PROXY,并且把许多子网排除在代理之外。

更改我的命令如下:

export http_proxy=192.168.1.104:65530
export https_proxy=192.168.1.104:65530
export no_proxy=192.168.174.200,localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24,192.168.49.0/24

再次执行,再次启动。

发现还是出现上面的报错。然后我发现是环境变量大小写的问题,然后把命令更改成如下所示,继续启动:

export http_proxy=192.168.1.104:65530
export https_proxy=192.168.1.104:65530
export no_proxy=192.168.174.200,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24,192.168.49.0/24

export HTTP_PROXY=192.168.1.104:65530
export HTTPs_PROXY=192.168.1.104:65530
export NO_PROXY=192.168.174.200,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24,192.168.49.0/24

这次执行过程中没有提示报错。但是仍是initialization failed。

[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.20.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
	[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager:v1.20.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
	[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-scheduler:v1.20.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
	[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-proxy:v1.20.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
	[ERROR ImagePull]: failed to pull image k8s.gcr.io/pause:3.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
	[ERROR ImagePull]: failed to pull image k8s.gcr.io/etcd:3.4.13-0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
	[ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns:1.7.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1

原因是镜像没有pull下来。但是我确实是设置了代理了。经过查找资料,发现需要单独的为docker设置代理。

此处运行一下

systemctl show --property=Environment docker

发现docker确实没有走代理,所以远在Google的k8s.gcr.io/kube-controller-manager:v1.20.2镜像才pull不下来。

此处需要根据Docker官网设置一下HTTP/HTTPS proxy

mkdir -p /etc/systemd/system/docker.service.d

vi /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=192.168.1.104:65530"
Environment="HTTPS_PROXY=192.168.1.104:65530"
Environment="NO_PROXY=localhost,127.0.0.1,https://xxxxxxxx.mirror.aliyuncs.com"

systemctl daemon-reload
systemctl restart docker

systemctl show --property=Environment docker
此时再查看一下代理,发现设置成功

设置完成docker代理之后尝试pull一下gcr里的镜像:

在这里插入图片描述

拉取成功!虽然有时候不稳定,但是这是一个永远可行、一劳永逸的方法!

然后开始minikube start --vm-driver=none

正常启动,minikube dashboard和ingress也正常。

在这里插入图片描述

将拉取好的镜像保存

docker save -o minikube.tar k8s.gcr.io/kube-proxy:v1.20.2 k8s.gcr.io/kube-controller-manager:v1.20.2 k8s.gcr.io/kube-apiserver:v1.20.2 k8s.gcr.io/kube-scheduler:v1.20.2 gcr.io/k8s-minikube/storage-provisioner:v4 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns:1.7.0 k8s.gcr.io/pause:3.2

保存之后的minikube.tar总共695M。minikube-dashboard.tar总共253M。

之后如果再部署就首先可以 docker load < minikube.tar 将镜像导入,然后再安装。

P.S.

部分参考了一位老哥

1.4使用阿里云构建镜像安装

参考 一位老哥另一位老哥

意思是阿里云容器仓库可以帮助我们拉取gcr中的镜像并构建,这样我们就可以使用阿里云来pull镜像然后retag成所需要的镜像了。

# Check version in https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
# Search "Running kubeadm without an internet connection"
# For running kubeadm without an internet connection you have to pre-pull the required master images for the version of choice:

在这里插入图片描述

这里说明使用kubeadm config images list就可以查看所需要的镜像名称以及版本。

k8s.gcr.io/kube-apiserver:v1.20.4
k8s.gcr.io/kube-controller-manager:v1.20.4
k8s.gcr.io/kube-scheduler:v1.20.4
k8s.gcr.io/kube-proxy:v1.20.4
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0

在GitHub上创建镜像仓库,此处要注意仓库的路径命名。

镜像名称->版本号->Dockerfile。

在这里插入图片描述

由所需要的镜像编写Dockerfile,只有一行(因为本质就是利用阿里云容器服务帮助我们完成拉取)。

然后可以拉取下来手动retag、rmi。也可编写shell脚本来完成自动化拉取、retag、rmi。

例如:

#!/bin/bash

set -e

# Check version in https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
# Search "Running kubeadm without an internet connection"
# For running kubeadm without an internet connection you have to pre-pull the required master images for the version of choice:
KUBE_VERSION=v1.10.3
KUBE_PAUSE_VERSION=3.1

GCR_URL=k8s.gcr.io
ALIYUN_URL=此处更换成自己的阿里云容器镜像仓库地址

images=(kube-proxy-amd64:${KUBE_VERSION}
pause-amd64:${KUBE_PAUSE_VERSION})


for imageName in ${images[@]} ; do
  docker pull $ALIYUN_URL/$imageName
  docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
  docker rmi $ALIYUN_URL/$imageName
done

docker images

这里虽然是k8s,不是minikube,但是仍有借鉴意义。

到此为止,搭建好了minikube环境,并且开启了minikube dashboard和ingress。

所有的问题都是由那众所周知的问题导致的。。任何解决网络问题的手段都不一定稳定和完美,并且时刻都可能无效,因为谁都不知道firewall的原理(包含了太多:IP、端口、协议、流量特征、主动嗅探、人工介入等等等等),所以最好的解决办法就是人肉范强。

2.测试minikube

搭建好minikube环境就可以跑一个demo project了,毕竟主要工作是dev。

2.1vscode配置

使用vscode SSH到虚拟机进行远程开发。

需要在vscode上安装三个插件:

在这里插入图片描述

第一个插件主要是用来查看kubernetes cluster,相当于一个嵌入在vscode中的简易UI。可以查看集群信息。

在这里插入图片描述

  • Namespaces

在这里插入图片描述

有四个默认的名称空间和kubernetes-dashboard名称空间。

  • node

在这里插入图片描述

  • workloads

在这里插入图片描述

负载型资源:deployment、有状态型(主要用于部署数据库)statefulsets、类似守护进程的Daemonsets、任务jobs、定时任务cronjobs和最小单元pods。此处是k8s集群的关键,因为这是真正干活的地方,要不为啥叫workloads呢。(相对于开发来说)

  • 其他资源

在这里插入图片描述

然后还有network,其中service就在这里;storage,比如PV、PVC都在这里;configuration,configmap和secrets都在这里,主要用于存储配置信息,并实时更新,可以理解为spring cloud alibaba中的nacos,是管全局配置的;然后还有自定义资源,然后还有包管理器helm。

因为管理k8s集群主要是管理资源清单,而资源清单则是YAML格式的,YAML插件提供了基本的format。然后还有一个Kubernetes Support插件,用于纠错,代码提示、代码片段、编写secret的时候还能使用该插件提供的快捷键迅速转换base64。

2.2创建工程

根据TechWorld with Nana频道在这里插入图片描述

项目架构图如下所示:

在这里插入图片描述

一个非常简单的mongo-express和mongodb组成的CRUD project。使用configmap保存数据库URL、使用secret保存数据库用户名和密码:

在这里插入图片描述

yaml文件就不贴了都在下面的链接里

项目Gitlab地址

都使用kubectl apply -f 配置文件后,就可以访问应用了。如下所示:

在这里插入图片描述

如上图所示,黄色的警告部分就是Kubernetes Support插件的功劳。它提示我们

One or more containers do not have resource limits - this could starve other processes

因为没有限制使用资源。

我打包好的所需镜像在我上传的资源里,可以免费随意下载。

结束了,引用了不少文章和内容,如有侵权请联系我删除。

以后还会有更多有趣的内容分享。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值