使用 Docker 快速搭建單機(jī)版的 Kubernetes 集群

running-local-Kubernetes-clusters-using-docker

隨著容器化、微服務(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 群集,如

使用上面任一工具的目標(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 提供了多種安裝方式福澡,支持以下方式:

這里將在 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ī)上

K8s 故障排查指南

![433f9087ffac4740822ce8cec2943aa.jpg](https://upload-images.jianshu.io/upload_images/2409835-9b199fb633b8f179.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沛硅,一起剝皮案震驚了整個(gè)濱河市眼刃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摇肌,老刑警劉巖擂红,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異围小,居然都是意外死亡昵骤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門吩抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涉茧,“玉大人赴恨,你說我怎么就攤上這事疹娶。” “怎么了伦连?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵雨饺,是天一觀的道長(zhǎng)钳垮。 經(jīng)常有香客問我,道長(zhǎng)额港,這世上最難降的妖魔是什么饺窿? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮移斩,結(jié)果婚禮上肚医,老公的妹妹穿的比我還像新娘。我一直安慰自己向瓷,他們只是感情好肠套,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猖任,像睡著了一般你稚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朱躺,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天刁赖,我揣著相機(jī)與錄音,去河邊找鬼长搀。 笑死宇弛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盈滴。 我是一名探鬼主播涯肩,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼巢钓!你這毒婦竟也來了病苗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤症汹,失蹤者是張志新(化名)和其女友劉穎硫朦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體背镇,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咬展,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞒斩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片破婆。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胸囱,靈堂內(nèi)的尸體忽然破棺而出祷舀,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布裳扯,位于F島的核電站抛丽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏饰豺。R本人自食惡果不足惜亿鲜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冤吨。 院中可真熱鬧蒿柳,春花似錦、人聲如沸漩蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爆安。三九已至叛复,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扔仓,已是汗流浹背褐奥。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翘簇,地道東北人撬码。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像版保,于是被迫代替她去往敵國(guó)和親呜笑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345