隨著容器化、微服務(wù)、服務(wù)網(wǎng)格扎唾、服務(wù)編排饲做、DevOps 等云原生技術(shù)的流行,我們也要跟上時(shí)代的步伐豺妓,那么我們需要怎么上車呢?此時(shí)就需要一個(gè)易于在本地運(yùn)行且 Kubernetes 的工具,可在你的筆記本電腦上的虛擬機(jī)內(nèi)輕松創(chuàng)建單機(jī)版 Kubernetes 集群翎朱,便于我們使用 Kubernetes 進(jìn)行日常開發(fā)與學(xué)習(xí)。那么接下讓我們輕松地搭建一個(gè)更貼近真實(shí)的 K8s 環(huán)境尺铣。
工具推薦
對(duì)于本地實(shí)驗(yàn)拴曲,還可以使用各種 Kubernetes 實(shí)現(xiàn)以運(yùn)行 Kubernetes 群集,如
- Kind (https://kind.sigs.k8s.io/)
- Minikube (https://minikube.sigs.k8s.io/docs/)
- MicroK8s (https://microk8s.io/)
- 在線體驗(yàn) K8s (https://labs.play-with-k8s.com/)
- Dockerized (https://github.com/y0ngb1n/dockerized) 推薦我的個(gè)人項(xiàng)目凛忿,歡迎 Star
使用上面任一工具的目標(biāo)都能快速運(yùn)行一個(gè)本地學(xué)習(xí)的 Kubernetes 群集澈灼,其中我個(gè)人最喜歡的是 Kind。
搭建 K8s 集群
下面分別嘗試 Kind 與 Minikube 創(chuàng)建單機(jī)版 Kubernetes 集群。
先安裝 kubectl
無論使用哪個(gè)工具叁熔,都需要先正確安裝 kubectl
Kubernetes 命令行工具委乌,否則安裝完 Kind、Minikube 等環(huán)境后無法執(zhí)行 kubectl
命令者疤。
使用 Kind 創(chuàng)建 K8s 集群
kind is a tool for running local Kubernetes clusters using Docker container “nodes”.
安裝 kind
Kind 提供了多種安裝方式福澡,支持以下方式:
- On macOS via Homebrew
- On macOS via MacPorts
- On Windows via Chocolatey
- Installing From Release Binaries
- Installing From Source
這里將在 Linux 環(huán)境下以 Installing From Release Binaries 方式進(jìn)行安裝:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
chmod +x ./kind
# mv ./kind /some-dir-in-your-PATH/kind
創(chuàng)建 K8s 集群
kind create cluster
# kind delete cluster
檢驗(yàn)安裝環(huán)境
??? ~ kind get clusters
kind
使用 Minikube 創(chuàng)建 K8s 集群
安裝 minikube
選擇不同環(huán)境下的安裝方式,參考 https://minikube.sigs.k8s.io/docs/start/
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境驹马,使用如下命令將自動(dòng)使用阿里云服務(wù)來支持 minikube
的環(huán)境配置革砸,參考 https://developer.aliyun.com/article/221687
minikube start --image-mirror-country='cn'
# minikube delete
檢驗(yàn)安裝環(huán)境
??? ~ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
啟動(dòng) K8s 控制臺(tái),參考 https://minikube.sigs.k8s.io/docs/handbook/dashboard/
minikube dashboard
# or
minikube dashboard --url
查看 minikube
支持的擴(kuò)展列表糯累,參考 https://minikube.sigs.k8s.io/docs/handbook/deploying/
minikube addons list
檢驗(yàn) K8s 集群
??? ~ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"}
# 查看當(dāng)前指向的 k8s 環(huán)境算利,kind/minikube 安裝時(shí)會(huì)自動(dòng)修改 kubectl 配置
??? ~ kubectl config current-context
kind-kind
# 如本地有多個(gè) k8s 環(huán)境,可手動(dòng)切換
??? ~ kubectl config use-context minikube
Switched to context "minikube".
# 檢查服務(wù)器節(jié)點(diǎn)
??? ~ kubectl get no
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 36m v1.22.3
??? ~ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane,master 15m v1.22.3 192.168.49.2 <none> Ubuntu 20.04.2 LTS 5.4.0-42-generic docker://20.10.8
# 查看 k8s 集群信息
??? ~ kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
K8s 初體驗(yàn)
快速嘗鮮
# 啟動(dòng)單實(shí)例 nginx
??? ~ kubectl create deployment nginx-depl --image=nginx
# 查看運(yùn)行的實(shí)例
??? ~ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-depl-5c8bf76b5b-zw8ms 1/1 Running 0 70s
# 轉(zhuǎn)發(fā)一個(gè)本地 8080 端口到 Pod 80 端口
??? ~ kubectl port-forward nginx-depl-5c8bf76b5b-zw8ms 8080:80
# 本地訪問
??? ~ curl 127.0.0.1:8080
# 清除實(shí)例
??? ~ kubectl delete deployment nginx-depl
小試牛刀
nginx-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
nginx-svc.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- name: http
port: 80
targetPort: 80
nodePort: 31080
selector:
app: nginx
type: NodePort
執(zhí)行命令:
# 一鍵發(fā)布泳姐,啟動(dòng)實(shí)例
??? ~ kubectl apply -f .
# 調(diào)試 Pod
??? ~ kubectl describe pod nginx
??? ~ kubectl port-forward nginx 8080:80
# 調(diào)試 Service
??? ~ kubectl describe svc nginx-svc
??? ~ kubectl port-forward service/nginx-svc 8080:80
# 清除實(shí)例
??? ~ kubectl delete -f .
注意事項(xiàng)
- 需要先正確安裝
kubectl
- 通過 Port-Forward 可本機(jī)訪問 Pod效拭,僅限本地調(diào)試環(huán)境,如
curl 127.0.0.1:8080
- 通過 Service 反向代理時(shí)胖秒,需要使用 K8s 集群的 IP 進(jìn)行訪問缎患,使用
kubectl get nodes -o wide
查看 K8s 集群的 IP - Service 是 K8s 提供反向代理的機(jī)制,負(fù)責(zé)反向路由+負(fù)載均衡
- NodePort 是 Service 的一種類型阎肝,可將 Service 暴露給外網(wǎng)
- NodePort 范圍
30000~32767
- Label 是 K8s 的種打標(biāo)簽機(jī)制
- Selector 是 K8s 中的路由選擇定位機(jī)制
- 使用 Kind 或 Minikube 部署的 K8s 集群挤渔,node 基于容器運(yùn)行而不是宿主機(jī),使用 Service 反向代理時(shí)风题,只在 node 節(jié)點(diǎn)容器中 kube-proxy 生效判导,使用
docker exec -it kind-control-plane bash
驗(yàn)證這一點(diǎn),而不是直接映射在宿主機(jī)上