使用Minikube安装Kubernets
译者注: 基本全部是官方文档的翻译,然后还有部分自己遇到的问题和解决方案。另外minikube由于gfw的原因,使用的官方minikube版本在启动时无法翻墙下载相关文件,因此笔者使用的是阿里云的修改版,有国外代理的请忽略。
阿里云参考博客:https://yq.aliyun.com/articles/221687
阿里云修改版git:https://github.com/AliyunContainerService/minikube
k8s官方链接:https://kubernetes.io/docs/setup/learning-environment/minikube/
Minikube是一个可以在本地轻松运行Kubernets的工具。Minikube在你电脑上的虚拟机里运行了一个单节点的K8s集群,以帮助用户学习或开发k8s。
译者注:推荐在有图形用户界面的系统中使用minikube,可以直接在界面上操作。
一. Minikube功能
Minikube支持以下功能:
- DNS
- NodePorts
- ConfigMaps and Secrets
- Dashboards
- Container Runtime: Docker, CRI-O, and containerd
- Enabling CNI (Container Network Interface)
- Ingress
二. 安装
看另一篇Ubuntu安装Kubernets的博客。
三. 快速开始
这个简单的demo教你如何在本地开启使用和删除Minikube。跟随以下步骤开始并探索Minikube。
-
开启minikube并创建一个集群
minikube start
输出类似于:
Starting local Kubernetes cluster... Running pre-create checks... Creating machine... Starting local Kubernetes cluster...
更多操作详见第四章。
译者注:译者使用的阿里云minikube版本,开启命令为
minikube start --registry-mirror=https://whlh0vjn.mirror.aliyuncs.com --kubernetes-version v1.12.1 --vm-driver=none
其中 version为译者当前时间minikube的最新版,可自由使用,–vm-driver解释见另一篇博客,译者这里是在linux虚机里安装的minikube,因此无需再安装到虚机的虚机里了,因此设为none。
问题一. 网络超时time out,卡在minikube start这里。
我之前还是卡在这minikube start这里,一直卡在这里,最后提示无法下载kubeadm和kubelet,超时。
这里的registry-mirror需要读者自己去找几个docker镜像,从阿里云的这篇博客里有个能去注册阿里云docker镜像的链接,也可以在网上找几个其他的例如daocloud的docker镜像,添加到了/etc/docker/daemon.json中,这些你注册完后能够找到自己的镜像ip,不通用,我的如下:
这个registry-mirrors可以随意加多个,但是要注意httpxxx开头,不然重启docker的时候就启动不了了。
添加完后,依次执行
sudo systemctl daemon-reload
,sudo systemctl restart docker
重启docker。这样minikube里已经改了阿里云的镜像,docker也手动改了镜像,应该已经解决了这个问题。
问题二. 提示kubelet未启动。
报错信息如下图:
我们使用
minikube logs
检查他的日志,如下:
可以确定是kubelet和docker的driver不匹配的问题了。
kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"
kubelet可以修改,但是每次启动的时候会被覆盖掉,所以我们需要改docker的配置文件。
打开文件/etc/docker/daemon.json,如下图,将第一样里的的systemd改为cgroupfs:
然后重启docker:
systemctl daemon-reload && systemctl restart docker
在
minikube delete
后再次启动minikube,成功,如下图:以后每次再启动minikube只需要
minikube start --vm-driver=none
即可。 -
现在你能使用kubectl与你的k8s集群进行交互了,更多操作详见第五章。
我们现在使用一个现有的镜像
echoserver
创建一个k8s部署,这个镜像是一个简单的HTTP服务器,使用--port
参数可将其从8080端口暴露出来。kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
输出如下:
deployment.apps/hello-minikube created
-
为了能够访问hello-minikube,我们将它暴露出来作为一个服务:
kubectl expose deployment hello-minikube --type=NodePort
–type参数定义了这个服务的类型。
输出如下:
service/hello-minikube exposed
-
这个
hello-minikube
Pod现在已经启动了,但是在它能够被作为一个暴露出来的服务访问时,你必须等待它准备完成。使用以下命令查看Pod是否已经启动并且运行:kubectl get pod
如果输出中的STATUS显示为
ContainerCreating
,那么说明这个Pod已经被创建了。NAME READY STATUS RESTARTS AGE hello-minikube-3383150820-vctvh 0/1 ContainerCreating 0 3s
如果输出中的STATUS显示为
Running
,那么说明这个Pod已经启动并且运行了。NAME READY STATUS RESTARTS AGE hello-minikube-3383150820-vctvh 1/1 Running 0 13s
译者注:这个地方由于还是墙的原因,笔者卡在了这个地方:
经过查看日志
minikube logs -f
发现,这里还是无法翻墙获取到这个image,因此不能成功运行。 -
获取该服务的url以检查服务的详细信息。
minikube service hello-minikube --url
-
要检查你本地集群的详细信息,复制你得到的url到浏览器中,输出类似如下:
Hostname: hello-minikube-7c77b68cff-8wdzq Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=172.17.0.1 method=GET real path=/ query= request_version=1.1 request_scheme=http request_uri=http://192.168.99.100:8080/ Request Headers: accept=*/* host=192.168.99.100:30674 user-agent=curl/7.47.0 Request Body: -no body in request-
如果你不想服务或者集群运行了,可以删除它们。
-
删除
hello-minikube
服务:kubectl delete services hello-minikube
输出如下:
service "hello-minikube" deleted
-
删除
hello-minikube
部署:kubectl delete deployment hello-minikube
输入如下:
deployment.extensions “hello-minikube” deleted
-
停止本地Minikube集群:
minikube stop
输出如下:
Stopping "minikube"... "minikube" stopped.
点击停止集群获取更多细节。
四. 管理你的集群
启动一个集群
minikube start命令可以用来启动你的集群。这个命令创建并配置了一台虚拟机,这台虚拟机构成了一个单节点的集群。这个命令也配置了你的 kubectl来和这个集群进行交互。
注意:
如果你配置了代理,你需要手动将这个信息传递给
minikube start
命令:https_proxy=<my proxy> minikube start --docker-env http_proxy=<my proxy> --docker-env https_proxy=<my proxy> --docker-env no_proxy=192.168.99.0/24
不幸的是,单独设置这个环境变量是不起作用的。
Minikube也创建了一个"minikube"上下文,并把它设置为kubectl的默认配置。要切换回这个上下文,运行以下命令:
kubectl config use-context minikube
。
明确kubernets版本
你可以通过在minikube start
命令后添加--kubernetes-version
标签来选择一个特定的k8s版本供minikube使用。比如你要运行v1.15.0版本的k8s,运行以下命令:
minikube start --kubernetes-version v1.15.0
明确Vm驱动
你可以通过在minikube start
命令后添加--vm-driver=<enter_driver_name>
标签来改变虚拟机驱动。比如这个命令输入如下:
minikube start --vm-driver=<driver_name>
Minikube支持以下驱动:
注意:如何为支持的驱动安装插件,细节请看DRIVERS。
- virtualbox
- vmwarefusion
- kvm2 (driver installation)
- hyperkit (driver installation)
- hyperv (driver installation) 注意下边的ip是动态的,可以被修改。可以通过
minikube ip
命令检索ip。 - vmware (driver installation) (VMware unified driver)
- none (直接在宿主机而非虚拟机上运行k8s. 使用这个选项需要系统安装Docker(docker install)和linux系统环境。)
在可选择的容器运行环境中启动一个集群
你可以在以下2种容器运行环境中启动Minikube。
- 使用containerd作为容器运行环境,运行以下命令:
minikube start \ --network-plugin=cni \ --enable-default-cni \ --container-runtime=containerd \ --bootstrapper=kubeadm
或者你可以用以下的扩展版本:
minikube start \ --network-plugin=cni \ --enable-default-cni \ --extra-config=kubelet.container-runtime=remote \ --extra-config=kubelet.container-runtime-endpoint=unix:///run/containerd/containerd.sock \ --extra-config=kubelet.image-service-endpoint=unix:///run/containerd/containerd.sock \ --bootstrapper=kubeadm
- 使用CRI-O 作为容器运行环境,运行以下命令:
minikube start \ --network-plugin=cni \ --enable-default-cni \ --container-runtime=cri-o \ --bootstrapper=kubeadm
或者使用以下的扩展版本:
minikube start \ --network-plugin=cni \ --enable-default-cni \ --extra-config=kubelet.container-runtime=remote \ --extra-config=kubelet.container-runtime-endpoint=/var/run/crio.sock \ --extra-config=kubelet.image-service-endpoint=/var/run/crio.sock \ --bootstrapper=kubeadm
通过重新使用Docker的daemon(守护进程?)来使用本地镜像
当使用单个vm作为k8s集群时,复用Docker内置的守护进程是很有用的。复用内置守护进程意味着你不必再在你的宿主机上搭建一个Docker私服来将这个镜像push进去,你可以直接在和Minikube一起用的Docker守护进程中构建,这样加速了本地的操作。
注意:一定要给你的Docker镜像打上tag才能用这个tag拉取镜像。因为
:latest
是默认值,还有一个相对应的默认的镜像拉取策略Always
。如果在默认的Docker仓库(一般是DockerHub)中没有这个Docker镜像,最终将会导致一个镜像拉取错误ErrImagePull
。
要在你的Mac/Linux主机上使用这个Docker守护进程,在shell中运行以下命令:
eval $(minikube docker-env)
现在你可以在你的Mac/Linux宿主机上的命令行窗口中使用Minikube虚拟机里的Docker守护进程了:
docker ps
注意:在Centos7中,Docker也许会报出如下错误:
Could not read CA certificate "/etc/docker/ca.pem": open /etc/docker/ca.pem: no such file or directory
你可以通过更新/etc/sysconfig/docker来修复它,以保证Minikube的环境也会改变。
配置kubernets
Minikube有一个"配置器"的feature,可以让用户使用任意值来配置K8s组件。你可以在minikube start
后添加 --extra-config
标签来使用这个feature。
这个标记会多次出现,你可以在每次都传给他不同的值来设置多种选择。
这个标签会从component.key=value
表单中获取一个字符串,其中component
是以下列表其中一个,key
是配置的结构体中的一个值,value
是要赋的值。
有效的key值可以从k8s文档里对每个组件的componentconfigs
字段中找到。以下是每个支持的配置的文档:
例子
要在kubelet上将MaxPods
设为5,只需要传入--extra-config=kubelet.MaxPods=5
标签。这个特性也支持嵌套结构,比如要将LeaderElection.LeaderElect
设为true,只需传入以下标签:--extra-config=scheduler.LeaderElection.LeaderElect=true
.要将apiserver
中的AuthorizationMode
设为RBAC
,你可以这样:--extra-config=apiserver.authorization-mode=RBAC
。
停止一个集群
minikube stop
命令用来停止一个集群。这个命令会关闭Minikube虚拟机,但保留所有的集群状态和数据。再次启动集群会让它回到当前的状态。
删除一个集群
minikube delete
命令用来删除一个集群。这个命令关闭并删除Minikube虚拟机,不会保留任何的状态和数据。
五. 与你的集群进行交互
Kubectl
minikube start
命令会创建一个叫“minikube”的kubectl context,这个上下文包含与Minikube集群通信的配置。
Minikube会自动把这个上下文设为默认使用的,当你以后需要再切换回这个上下文时,运行kubectl config use-context minikube
,或者在每个运行的命令里都加入一个参数声明,类似这样:kubectl get pods --context=minikube
。
Dashboard
要访问Kubernetes Dashboard,在Minikube启动之后在命令行里输入以下命令以获取url:
minikube dashboard
服务
要访问通过j节点上的端口暴露出来的服务,在Minikube启动之后再运行以下命令以获取地址:
minikube service [-n NAMESPACE] [--url] NAME
六. 网络
Minikube虚拟机通过一个仅限主机本地访问的ip地址向主机系统公开,这个ip可以通过minkube ip
命令来获取。任何NodePort
类型的服务都可通过这些ip地址访问。
要为你的服务配置节点端口,你可以使用如下kubectl
命令:
kubectl get service $SERVICE --output='jsonpath="{.spec.ports[0].nodePort}"'
七. 持久卷(硬盘)
Minikube支持hostPath
类型的持久卷,这些持久卷被映射到了Minikube虚拟机中的目录下。
Minikube虚拟机开机进入tmpfs,所以大多数目录在reboots(minikube stop
)之后不会是持久的。然而,Minikube在以下几个主机目录中是被配置为持久的:
/data
/var/lib/minikube
/var/lib/docker
这里有一个例子来展示一个持久卷配置如何将/data
目录下的数据进行持久化的:
apiVersion: v1 kind: PersistentVolume metadata: name: pv0001 spec: accessModes: - ReadWriteOnce capacity: storage: 5Gi hostPath: path: /data/pv0001/
八. 挂载主机文件夹
一些驱动程序将在vm中装载一个主机文件夹,以便您可以轻松地在vm和主机之间共享文件。这些目前是不可配置的,并且对于您正在使用的驱动程序和操作系统是不同的。
注意:主机文件夹共享还没有在KVM驱动下实现。
Driver OS HostFolder VM VirtualBox Linux /home /hosthome VirtualBox macOS /Users /Users VirtualBox Windows C://Users /c/Users VMware Fusion macOS /Users /Users Xhyve macOS /Users /Users