Kind + Docker 一鍵部署K8s集群

2020-12-13 蟲蟲搜奇

時下網際網路最火的技術無非是容器雲和AI,而虛擬雲技術方面最火則是docker和K8S。docker學習和實踐都很容易,但是K8S的由於集群化,部署需要較多的機器,環境搭建學習實踐比較費勁這一度影響了K8S技術的普及。所以業界也除了一些簡易版的K8s集群環境,比如K3S(5 less than k8s),本文蟲蟲給大家介紹也是這樣一個項目Kind,一鍵部署的單機K8S環境,可以用於學習、本地開發和CI環境。

概述

kind是主要是為了測試和簡化K8S而設計的,項目基於Golang開發依賴極少,只需要Golang 1.11版本以上和docker既可。

kind由以下組件構成:

Go 實現集群創建,映鏡像構建等的軟體包。

kind命令行界面。

運行systemd,Kubernetes等的Docker 鏡像

基於這些軟體包(WIP)kubetest 集成。

安裝

kind的安裝也很簡單,只需下載kind在github上發布的包,然後把他移動到安裝目錄即可。另外kind操作依賴docker,需要先安裝docker。

macOS/Linux安裝:

curl -Lo kind github /kubernetes-sigs/kind/releases/download/v0.7.0/kind-$(uname)-amd64

chmod +x ./kind

mv kind /usr/sbin/kind

通過Homebrew方式安裝

如果系統有Homebew包管理器,也可以用brew命令一鍵安裝:

brew install kind

Windows安裝

Window下的安裝也類似,直接從github發布頁面下載Window版本的發布包即可

curl.exe -Lo kind-windows-amd64.exe github/kubernetes-sigs/kind/releases/download/v0.7.0/kind-windows-amd64

Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

Chocolatey包管理器方式安裝

Windows如果有Chocolatey包管理器,則可以直接一鍵安裝

choco install kind

go get源碼安裝

也可以使用go get下載源碼編譯安裝:

go get sigs.k8s.io/kind。

該命令會自動在$(go env GOPATH)/bin下安裝kind。如果安裝報錯,

比如報:kind: command not found

則需要將該執行目錄添加到系統PATH中:

基本使用

kind是一個單文件二進位運行程序,使用也非常簡單,基本命令如下:

create、delete 創建、刪除集群

export是將內部所有容器的日誌拷貝到宿主機的某個目錄下。

get 查看當前有哪些集群,哪些節點,以及 kubectl 配置文件的地址

load 可以從宿主機向 k8s 容器內導入鏡像。

version 顯示kind的版本

創建集群

創建Kubernetes集群非常簡單,可以一鍵創建:

kind create cluster

該命令使用預構建的節點鏡像引導Kubernetes集群,默認為從docker hub獲取kindest/node鏡像,也支持自定義鏡像來源,使用--image指定其他鏡像。

默認情況下,集群名稱為kind。可使用--name制定特定的名稱。

刪除集群

刪除同樣簡單,可以使用下面命令一鍵刪除

kind delete cluster

如果--name未指定該標誌,則kind將使用默認的群集上下文名稱kind並刪除該群集。

加載docker鏡像

可以使用以下命令將Docker鏡像加載到集群節點中:

kind load docker-image my-custom-image

注意:如果使用命名集群,則需要指定要將鏡像加載到的集群的名稱:

kind load docker-image my-custom-image --name kind-2

此外,鏡像archive也可以加載:

kind load image-archive /my-image-archive.tar

所以從docker創建鏡像到加載流程為:

docker build -t my-custom-image:unique-tag ./my-image-dir

kind load docker-image my-custom-image:unique-tag

kubectl apply -f my-manifest-using-my-image:unique-tag

鏡像編譯

kind通過使用Docker容器作為"節點"來運行本地Kubernetes集群。使用node-image來運行K8S工件,比如kubeadm或kubelet。node-image會依次創建base-image,並加載容器中運行所需要的docker和K8S的依賴層。

當前,支持兩種編譯node-image的方法。如果主機中存在K8S源,則可以使用docker或bazel來構建。如果要指定構建類型,需要使用—type參數。

如果要使用bazel源(--type=bazel)由於Kubelet,使用的CGO需要依賴Linux GCC/glibc,因此當前無法在Windows或MacOS上使用。

docker如果未指定,則kind默認使用構建類型。

kind build node-image --type bazel

與集群交互

創建集群後,可以使用kubectl 通過與它交互的一種生成的配置文件。默認情況下,如果未設置$KUBECONFIG環境變量,則群集訪問配置存儲在~/.kube/config中。

如果設置了$KUBECONFIG環境變量,那麼它將用作路徑列表。修改值後,將在定義節的文件中對其進行修改。創建值後,將在存在的第一個文件中創建該值。如果鏈中沒有文件,那麼它將創建列表中的最後一個文件。

可以--kubeconfig在創建集群時使用該標誌,然後僅加載該文件。該標誌只能設置一次,並且不會發生合併。

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"

查看集群信息,可以用用kubectl cluster-info

查看節點信息用kubectl get node

對於多個集群,可以用可以使用get clusters 命令。

例如,假設創建了兩個集群:

kind create cluster --name kind-2

當列出kind群集時,結果會顯示:

kind get clusters

kind

kind-2

與特定集群交互,需要使用—context參數在kubectl中指定集群名稱:

kubectl cluster-info --context kind-kind

kubectl cluster-info --context kind-2

Docker Desktop

如果要kind build node-image在MacOS或Windows上構建K8S,則需要至少6GB的RAM專門運行Docker引擎的虛擬機(VM),建議使用8GB。

Mac設置Docker內存設置方法如下:

打開"Preferences"菜單:

轉到Advanced頁籤,可以在此處設置。

要更改Windows Docker的資源限制,需要右鍵單擊任務欄上的Moby圖標,然後選擇"Settings"。如果看到"切換到Linux容器",則需要先執行此操作,然後再打開"Settings"

現在,轉到" Advanced"頁面,然後在此處更改設置,請參閱更改Docker的資源限制。

如果要清理Docker內容,可以使用prune命令

docker system prune

多節點集群

kind中也支持創建多多節點群集。創建多節點集群需要配置,配置格式為yaml,比如我們創建一個三節點(兩個wokers)的配置(config.yaml):

kind: Cluster

apiVersion: kind.x-k8s.io/v1alpha4

nodes:

- role: control-plane

- role: worker

kind create cluster --config=kind-config.yaml

也可以設置多個控制節點的集群:

配置好後,使用kind create cluster --config=config.yaml

代理

可以使用以下一個或多個環境變量(大寫優先)將kind配置為使用代理:

HTTP_PROXY 或者 http_proxy

HTTPS_PROXY 或者 https_proxy

NO_PROXY 或者 no_proxy

配置代理後,所有連接將使用它。可以通過配置NO_PROXY來制定本地不需要代理的網段:

NO_PROXY=172.17.0.0/16

日誌

kind可以導出所有種類的相關日誌瀏覽。導出日誌使用export命令:

kind export logs

Exported logs to: /tmp/396758314

如果要制定日誌路徑可以直接在其後制定路徑::

kind export logs ./logs

日誌的結構大致如下所示:

.

├── docker-info.txt

└── kind-control-plane/

├── containers

├── docker.log

├── inspect.json

├── journal.log

├── kubelet.log

├── kubernetes-version.txt

└── pods/

日誌包含有關Docker主機,容器運行類型,Kubernetes集群本身等信息。

總結

本文我們介紹了一個在本地單機部署K8S集群的方法,使用kind可以一鍵建立一個K8S實驗環境供我們學習熟悉K8S架構,當然這只是作為一個初步的指導,更多的功能和實踐需要大家動手去探索。

相關焦點

  • 在K8S上部署rabbitmq集群-有狀態服務
    二、rabbitmq集群部署1、版本說明:因為考慮到較早版本rabbitmq在k8s上的集群部署是使用autocluster插件去調用kubernetes apiserver來獲取rabbitmq服務的endpoints,進而獲取node節點信息,並自動加入集群,但是現在
  • K8S集群模式下fluent-bit日誌收集方案設計和實踐
    日誌形式種類更多,不僅業務日誌,更要考慮 docker、Kubernetes 等組件日誌。日誌的動態性更強,Kubernetes 集群中節點宕機導致 Pod 自動轉移、Pod 銷毀、擴容縮容、某些場景提前無法預知。這將導致線上服務出現問題之後,不能集中查看日誌、定位問題所在。
  • Kubernetes 1.14 二進位集群安裝
    Kubernetes 1.14 二進位集群安裝Kubernetes本系列文檔將介紹如何使用二進位部署Kubernetes v1.14集群的所有部署,而不是使用自動化部署(kubeadm)集群。在部署過程中,將詳細列出各個組件啟動參數,以及相關配置說明。在學習完本文檔後,將理解k8s各個組件的交互原理,並且可以快速解決實際問題。
  • 教你一次性成功安裝K8S集群(基於一主兩從模式)
    這不,這次,我總結了如何一次性成功安裝K8S集群的方法。我們今天先來說說如何基於一主兩從模式搭建K8S集群。後面,我們再上如何完全無坑搭建K8S高可用集群的方案。集群中所有K8S所使用的IP位址必須可以互通。Docker安裝分別在三臺伺服器上安裝Docker並配置阿里雲鏡像加速器。1.安裝Docker新建auto_install_docker.sh腳本文件vim auto_install_docker.sh 文件的內容如下所示。
  • 《蹲坑學K8S》之23-1:安裝部署Istio
    Kubernetes群集以後,還有部署以下組件以及功能模塊。[root@k8s-master ~]# kubectl get apiservices |grep metrics-server(4)檢查k8s集群環境是否滿足Istio部署條件[root@k8s-master ~]# istioctl x precheck1、生成安裝清單
  • 初識K8S之理論和搭建
    三、為k8s的應用場景適合於大型分布式,集群,微服務,高可用,負載均衡,如果大型團隊和項目用它,還可以優化開發流程和節約成本。四、k8s部署架構分析1、k8s部署架構圖:2、 圖解etcd:一款開源軟體。
  • 「走進k8s」Docker 簡介和安裝(一)
    關於docker這塊從0開始已經寫了4個系列了,但是針對k8s還是有點怵,因為k8s確實比較麻煩裡面的東西比較複雜,而且針對k8s想走的更遠還是需要實踐
  • Kubernetes持續部署指南
    Kubernetes 能夠讓部署、管理多個項目所需的大量集群變得更加容易。本文我們將詳細介紹如何將應用程式部署到Kubernetes,閱讀完本文之後,你將擁有一個高效的Kubernetes部署和持續交付工作流程。持續集成是在每次應用程式更新時構建和測試的實踐。通過以少量的工作,更早地檢測到錯誤並立即解決。
  • K8S棄用Docker了?Docker 不能用了?別逗了!
    從 DevOps 人員的角度,一面用 kubctl 命令、k8s API 來操作集群,一面在單機用 Docker 命令來管理鏡像、運行鏡像。 單獨用 Docker 的情況,在一些公司的場景裡面也是有的。一種場景是「只分不合」,把一臺機器用 Docker 做資源隔離,但是不需要將多容器「編排」。
  • Docker集群管理之Docker Compose
    前言:在上一篇《Docker集群管理之Docker Machine》中,我們通過源碼分析了解了Docker Machine的工作原理,使用者可以通過Docker Machine的一條命令在任意支持的平臺創建一個Docker主機,並能集中管理這些主機。Docker主機創建好之後,接下來就該考慮Docker容器部署的問題了。
  • 全網最系統、最清晰的Docker和K8s,深入微服務架構,就在今天
    開發者在筆記本電腦上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs (虛擬機)、bare metal、OpenStack 集群和其他基礎應用平臺。內網是走docker0的網橋,互相之間是Ping得通的,但是docker run建立容器時,它的IP位址是不可控制的,所以Docker用link的方式使Web能夠訪問到db中的數據。
  • MacOS上使用K3d和Rancher管理本地K8S集群環境
    現在很多同學都是用MacBook進行開發,但是由於MacOS對docker支持不是很好,創建基於容器的環境也比較費勁。在本文中,我們介紹基於K3D在macOS上本地運行Rancher以進行Kubernetes集群開發和測試。概述K3D是輕量級包裝,可在Docker中運行Rancher Labs的K3S。
  • K8S知識點總結
    Kubernetes是基於容器的分布式資源管理系統:對容器化的應用自動部署、資源的伸縮和管理。如果想用k8s管理應用,首先要把應用打包成容器鏡像(比如Docker鏡像),然後再用k8s管理容器。>k8s集群組件Control Plane/MasterKubernetes裡的Master指的是集群控制節點,在每個Kubernetes集群裡都需要有一個Master來負責整個集群的管理和控制,基本上Kubernetes的所有控制命令都發給它,它負責具體的執行過程。
  • 中小團隊基於Docker的devops實踐
    工程師本地開發,開發完成後提交代碼到代碼倉庫,[自動]觸發jenkins進行持續集成與部署,部署完成會收到結果郵件。項目運行過程中可通過日誌系統查看程序日誌,有異常會觸發監控系統發送報警。  Dockerfile: 通過編寫dockerfile來打包鏡像  harbor: 充當docker hub鏡像倉庫的作用,有web界面和api接口,方便集成  kubernetes: kubernetes(k8s)將一個一個的Docker實例給整合成了集群,方便鏡像下發、升級、回滾、增加或刪除副本數量,同時也提供了ingress外網訪問方式,這一塊比較重
  • OpenYurt 開箱測評|一鍵讓原生 K8s 集群具備邊緣計算能力
    自 OpenYurt 開源以來受到了開發者的關注,今天這篇文章將帶大家快速上手 OpenYurt ,介紹如何使用 OpenYurt 提供的命令行管理工具 Yurtctl, 高效快速地部署 OpenYurt 集群。
  • Docker 搭建 Redis Cluster 集群環境
    ❞通過 docker network create 命令可以創建自定義網絡模式,默認為 bridge 網橋/橋接模式,完整命令如下:docker network create redis-net通過 docker network ls 查看網絡模式: