[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上使用代理

十二. 已知的問題

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