[Kubernets]使用Minikube安装Kubernets

使用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。

  1. 开启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即可。

  2. 现在你能使用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
    
  3. 为了能够访问hello-minikube,我们将它暴露出来作为一个服务:

    kubectl expose deployment hello-minikube --type=NodePort
    

    –type参数定义了这个服务的类型。

    输出如下:

    service/hello-minikube exposed

  4. 这个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,因此不能成功运行。

  5. 获取该服务的url以检查服务的详细信息。

    minikube service hello-minikube --url
    
    
  6. 要检查你本地集群的详细信息,复制你得到的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-
    
    

    如果你不想服务或者集群运行了,可以删除它们。

  7. 删除hello-minikube服务:

    kubectl delete services hello-minikube
    
    

    输出如下:

    service "hello-minikube" deleted
    
    
  8. 删除hello-minikube部署:

    kubectl delete deployment hello-minikube
    
    

    输入如下:

    deployment.extensions “hello-minikube” deleted

  9. 停止本地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

在可选择的容器运行环境中启动一个集群

你可以在以下2种容器运行环境中启动Minikube。

  1. 使用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

  1. 使用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

九. 私有容器注册

十. Add-ons

十一. 在minikube上使用代理

十二. 已知的问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章