您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么搭建本地K8s開發環境”,在日常操作中,相信很多人在怎么搭建本地K8s開發環境問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么搭建本地K8s開發環境”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
開始之前需要先檢查一下
1.是否已經安裝好了 Docker 環境
如果還沒安裝 Mac/Windows 的用戶可以直接安裝 Docker Desktop
Windows 用戶推薦使用 WSL2
2.是否已經安裝好了 Golang 環境, Go 版本最好 >= 1.15
如果沒有可以參考官方文檔進行安裝
如果本地存在 Golang 環境可以直接執行下方命令進行安裝
GO111MODULE="on" go get sigs.k8s.io/kind@v0.10.0 && kind create cluster
如果不想通過源碼安裝可以查看官方文檔直接安裝編譯好的二進制文件
執行下方命令可以輸出 kind 的版本就表示安裝好了
? kind version kind v0.10.0 go1.16 linux/amd64
使用下方命令即可創建一個簡單的單節點 K8s 集群
node create clutser
集群的創建時間和你的網絡環境以及機器的性能有關系,kind 會去 docker hub 上拉取 kindest/node 鏡像,這個鏡像大概有 400M 的大小,當出現下方的提示的時候就說明集群創建好了
? kind create cluster Creating cluster "kind" ... ? Ensuring node image (kindest/node:v1.20.2) ? ? Preparing nodes ? ? Writing configuration ? ? Starting control-plane ?? ? Installing CNI ? ? Installing StorageClass ? Set kubectl context to "kind-kind" You can now use your cluster with: kubectl cluster-info --context kind-kind Thanks for using kind! ?
我們可以使用 kind get clusters 獲取我們創建的集群列表,kind 支持創建多個集群,不手動指定集群名稱的時候默認名為 kind ,我們也可以像下面一樣在創建集群的時候使用 --name 指定集群名稱
kind create cluster --name mohuishou
可以看到我們兩個集群都創建好了
? kind get clusters kind mohuishou
現在我們只需要一個集群,所以可以先使用 kind delete clusters mohuishou 將剛剛創建的集群先刪除掉
下面我們來看一下 kubectl 的常用命令是否都可以正常使用,并且部署一個簡單的 web 服務試試
? kubectl cluster-info --context kind-kind Kubernetes master is running at https://127.0.0.1:41801 KubeDNS is running at https://127.0.0.1:41801/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
可以看到我們 k8s master 地址和 dns 的地址,注意一般情況下我們只創建一個集群不需要指定 --context cluster name 但是創建了多個集群時這個基本就是必須的一個命令了。如果不加這個參數可能會報下面的錯誤
The connection to the server localhost:8080 was refused - did you specify the right host or port?
這是因為 kubectl默認連接的 apiserver 地址是 localhost:8080但是我們的 apiserver 地址不是這個所以報錯。
為什么我們使用 --context cluster-name 就可以了呢?
這是因為 kind 在創建集群的時候會修改 $HOME/.kube/config 的配置,將集群的 apiserver 地址,證書等相關信息都自動寫入進去了
每次命令都要加上這個參數好麻煩怎么辦?
我們可以使用 kubectl config use-context context-name 來進行設置,設置好了之后我們后續就不用每次都加上 –context 的參數了,同時還可以通過 kubectl config current-context 查詢我們當前默認操作的集群是哪一個
可以發現我們部署的是一個單節點的 v1.20.2 的集群
? kubectl get no NAME STATUS ROLES AGE VERSION kind-control-plane Ready control-plane,master 20m v1.20.2
使用下方代碼創建一個 nginx.yml 文件,然后使用 kubectl apply -f nginx.yml 就可以完成部署了
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
查看當前 deployment 的狀態
? kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 0/3 3 0 39s
查看 pod 的狀態
? kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-66b6c48dd5-2s5cb 1/1 Running 0 84s nginx-deployment-66b6c48dd5-8wf8b 1/1 Running 0 84s nginx-deployment-66b6c48dd5-zc6vd 1/1 Running 0 84s
由于我們沒有做服務暴露,所以是不能直接訪問對應的服務的,我們可以用 kubectl提供的端口轉發功能來講流量從本地轉發給 k8s 集群
? kubectl port-forward nginx-deployment-66b6c48dd5-2s5cb 30080:80 Forwarding from 127.0.0.1:30080 -> 80 Forwarding from [::1]:30080 -> 80 Handling connection for 30080
我們訪問 http://localhost:30080 就會發現這個熟悉的 nginx 界面
image-20210424210804343
到這里可以發現我們集群已經是可以使用了
2.4.1 創建一個多節點的集群
kind 默認創建的是一個單節點的集群,我們可以通過修改配置創建一個高可用的集群,我們創建一個 3 個 master 節點,兩個 worker 節點的集群
kind create cluster --name mohuishou-ha --config kind-ha.yml
kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: control-plane - role: control-plane - role: worker - role: worker
看一下節點即可驗證
? kubectl --context kind-mohuishou-ha get no NAME STATUS ROLES AGE VERSION mohuishou-ha-control-plane Ready control-plane,master 16m v1.20.2 mohuishou-ha-control-plane2 Ready control-plane,master 14m v1.20.2 mohuishou-ha-control-plane3 Ready control-plane,master 13m v1.20.2 mohuishou-ha-worker Ready <none> 5m52s v1.20.2 mohuishou-ha-worker2 Ready <none> 5m52s v1.20.2
2.4.2 Load Image
一般來說我們在 k8s 內部署應用需要先把容器鏡像推送到到鏡像倉庫當中,這樣在本地開發的時候相對來說會比較麻煩,特別是鏡像比較大的時候,往返會有兩次網絡消耗,為了解決這個問題我們可以使用 kind load 鏡像的功能直接把鏡像。
kind load docker-image my-custom-image-0 my-custom-image-1 --name kind
排坑指南:load image 成功,但是部署 pod 報錯
Failed to pull image "controller:latest": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/controller:latest": failed to resolve reference "docker.io/library/controller:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
這個問題之前卡了我很久,還是有點坑
1.進入節點查看: 鏡像是否存在
獲取節點名
? kubectl get nodes NAME STATUS ROLES AGE VERSION kind-control-plane Ready control-plane,master 2d1h v1.20.2
進入終端
docker exec -it kind-control-plane bash
查看鏡像是否存在,kind 創建的集群使用的是 containerd 所以我們使用 crictl 命令來獲取
crictl img | grep controller docker.io/library/controller latest 421cbf77618ba 72.1MB
2.如果鏡像存在,也就是我們上面看到的情況,這時候就要檢查一下我們部署的 yaml 文件
kubectl -n node-pool-operator-system get deployment -o yaml | grep imagePullPolicy
是否存在: imagePullPolicy: Always 如果我們沒有改 yaml 的話默認會是這個配置,這個配置會導致每次都去鏡像倉庫拉取鏡像,改成 imagePullPolicy: IfNotPresent 就可以了
3.如果鏡像不存在:這時候要檢查一下有沒有指定 cluster-name,在存在多個集群的情況下可能沒有加載到我們想要的集群,加上 --name cluster-name 即可
kind 在創建集群的時候實際上使用的是 kubeadm 所以還可以修改 kubeadm 的配置來修改默認的鏡像地址,節點標簽污點等信息,除此之外還可以配置 PV/PVC CNI 插件等配置,如果有需求的話可以查閱 kind 的官方文檔
不過要注意的是 kind 不支持給運行的集群添加節點,如果需要多節點集群的話得提前規劃好節點數量
到此,關于“怎么搭建本地K8s開發環境”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。