Kubernetes 學習筆記(二):本地部署一個 kubernetes 集群


目標是方便快捷地部署一個比較穩定的 k8s 集群(開發/測試用)

前言

前面用到過的 minikube 只是一個單節點的 k8s 集群,這對於學習而言是不夠的。我們需要有一個多節點集群,才能用到各種調度/監控功能。而且單節點只能是一個加引號的“集群”。

kubernetes 安裝方式面面觀

kubernetes 是一個組件化的系統,安裝過程有很大的靈活性,很多組件都有多種實現,這些實現各有特點,讓初學者眼花繚亂。

而且要把這些組件一個個安裝配置好並且能協同工作,也是很不容易的。

因此社區出現了各種各樣的安裝方案。安裝方案如此之多,以致於我不曉得該用哪個好。。於是特地調查了一番。將幾個流行的安裝方案羅列如下:

  1. kops: 只支持 aws/gce,另外 openstack/vsphere 的支持正處於 beta 狀態。不支持裸機部署。
  2. kubeadm: k8s 官方推出的一個 k8s 快速安裝工具,但是仍然有一定的工作量。
  3. kubespray: k8s 社區項目,使用 ansible 部署可用於生產環境的 k8s。(k8s-sigs,即 k8s special interest group)
    • 這個算是官方項目,和后面一些快速部署工具相比,它的門檻更高些——要求用戶熟悉 ansible 的高級用法。但是自建生產環境的話,應該是最推薦的選項。
  4. KubeOperator: 提供 UI 界面的部署工具及集群運維系統(底層用的是 ansible)。對 vshpere 的支持比較好,通過 vCenter 可以動態地伸縮 worker 節點。
  5. kubeasz: 和 kubespray 一樣,都是使用 ansible 進行部署。不過是純中文的,而且是分步部署。還添加了幾個方便的運維功能。
  6. sealos: 一行命令部署 k8s 集群,基於 kubeadm,支持離線安裝。
    • 國人開發的項目,使用方式非常簡單。只是它的離線安裝包是收費的,各版本價格從 0.01-50 元不等。。(代碼開源,因此離線包可以自己制作,但是很麻煩。)
    • 它支持的自定義參數比較少,很多參數都只能在部署完成后,再手動去修改 apiserver/kube-proxy 等組件的配置文件。
    • 基本是個人維護。
  7. rke/rancher: 完全使用容器運行 k8s 自身,配置文件簡單,一行命令部署集群(國內會自動從阿里雲拉鏡像)。另外中文文檔非常詳細。
    • rke 評價:現在在開發環境用了半年 rke 了,體驗上講,安裝配置是相當方便。但是它也存在幾個比較明顯的問題:
      • rke up 經常會健康檢查失敗,需要跑兩三次才能成功。
      • 對修改集群有點語焉不詳,找了半天文檔才知道修改集群就是改 cluster.yaml 然后重新跑 rke up
      • 將 cni 插件從 canal 切換到 calico/flannel 后重新 rke up,集群網絡直接就炸了。rke removerke up 都沒用(清理不干凈)。也沒看到哪里有講網絡插件不能更換。
      • 我們有一部分機器晚上會關機,有時候第二天開機后,nginx_proxy 容器就掛了,導致節點無法訪問 apiserver 而下線。。
    • Rancher 評價:用了一段時間了,文檔我覺得是非常詳細,很受用。但是 rancher 本身感覺不怎么穩定,經常莫名其妙地報錯、卡頓。。也不知道是不是我配置不對。。

此外社區還有 n 種方案可供選擇,五花八門。而且關注度(stars)都不低。貪多嚼不爛,我就不一一介紹了。

一番搜索,我最終確定了用 rancher 來部署我的第一個 kubernetes 多節點集群,怎么簡單怎么來哈哈~

2020.4 更新:半年來在開發環境試用過 rancher/rke/sealos/kubespray/minikube,個人感覺,本地單節點集群可以用 minikube,快速部署測試集群可以用 rke/sealos。
而 kubespray 感覺比較重,適合生產環境部署,當然搞熟悉了的話全部用 kubespray 也行。
要深入學習 k8s,可以用 kubeadm 手動部署一遍集群。

一、准備虛擬機

要部署多節點嘛,自然得先有多台主機。我自己的機器內存夠用,就直接開了一台 Ubuntu 虛擬機,然后克隆了四份。(這個克隆操作導致我后面掉進了坑。。)

主機的操作系統可以用自己熟悉的 Ubuntu/Debian/CentOS 等。這里主要強調一個坑:

  1. 各主機的 hostname 不能相同!!!否則后續的節點永遠部署不上!第一次手動安裝節點很容易被這個問題卡住。(血淚教訓。。)

如果是使用 rke/kubespray 進行批量安裝,可以直接在配置文件里指定節點 hostname,這倆工具會幫你自動修改。

具體的主機配置過程官方文檔寫得非常詳細,請移步 Rancher-基礎環境配置


二、使用 rancher 部署 k8s 集群

1. 部署 rancher server

首先在用做 rancher server 的虛擬機上跑官方給出的 docker 命令啟動 rancher server:

sudo docker run -d -v <主機路徑>:/var/lib/rancher/ --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:stable

不過說實話我覺得用 docker-compose 的方式會更好一點。

部署好后訪問 https://<server-ip> 配置好賬號/密碼/url,這沒啥好說的。

注意事項

  1. 以 docker 方式部署 rancher,顯然是存在單點故障的。生產環境建議查看官方文檔的 HA 部署。
  2. 使用 rancher 部署好的集群,如果你使用 rancher 生成的 kubeconfig 的話,rancher 掛了你就無法使用 kubectl 了。
    • 所以rancher 一定要做好備份,或者在部署時啟用「授權集群訪問地址」,否則 rancher 出了問題就jj了。

2. 部署 kubernetes 集群

現在進入了 rancher 首頁,點擊右上角的「添加集群」,選擇「自定義」來添加本地集群。

當然如果你用的是雲服務,那直接使用 rancher 提供的對應的功能顯然更方便。(在導航欄「工具」-「驅動管理」中可以添加「阿里雲」「騰訊雲」「華為雲」等國內雲服務支持)

然后輸入「集群名稱」,「雲提供商」選擇「無」。

然后就是最后一步——在各個節點上部署 rancher agent——了。

只要你勾選了 worker 選項(其實就是添加了 --worker 參數),rancher agent 在運行時,就會自動在節點上部署 k8s 節點所需要的所有容器。

在多個節點上運行帶 --worker 的 rancher agnet 命令,就能得到多個 k8s worker。而 etcd 和 controller 開發環境各部署一個就好了。

然后就可以愉快地玩耍了hhh~

3. 離線部署 k8s 集群

要使用 rancher 離線部署,首先需要一個 docker 私有鏡像倉庫,推薦使用 harbor.

雖然也可以使用官方的 rancher_save_images.sh 把所有鏡像打包成 tar.gz 進行離線安裝,但是這並沒有使用私有倉庫的方式靈活簡便。(前提是你本來就已經有一個內網私有倉庫。。)

  1. 參照 准備離線鏡像 的腳本,使用 image-list.txt 拉取鏡像到本地,然后批量上傳到私有倉庫
  2. 參照 修改鏡像倉庫地址,讓 rancher 從內網倉庫拉取系統鏡像。

然后參照上一步 2. 部署 kubernetes 集群 就行。


三、使用 kubespray 部署本地 k8s 集群

今天嘗試了一下使用 kubespray 部署一個本地 k8s 集群,總的來說,坑比較多。。主要是我完全沒學過 ansible,用起來磕磕絆絆。

使用 kubespary 部署,難點有二:

  1. 國內網絡問題,gcr.io 和 quay.io 的鏡像都無法拉取,github 的 release 下載也特別慢。
    • 鏡像可以使用 azure 的鏡像源:
      • gcr.io 全都替換成 gcr.azk8s.cn
      • quay.io 全都替換成 quay.azk8s.cn
      • 而 dockerhub 官方鏡像,可以換成 dockerhub.azk8s.cn
    • 但是 github 就沒辦法了
  2. ansible 的配置問題。我節點用的 ubuntu server 1804,第一次用 ansible,遇到好多問題:
    1. 用 kubespray 的 requirements.txt 安裝 ansible,運行 ansible 命令時提示找不到 /usr/bin/python,升級到最新版本才能識別到 /usr/bin/python3
    2. 然后又提示需要將節點的指紋加入 know_hosts,我一直輸入 yes 都沒用。。全部手動用 ssh 登錄了一次才好。(回退 ansible 的版本也沒用。)
    3. 啟用了 download_run_once 之后,ansible 把下載下來的數據用 rsync 傳到別的節點時老是報錯,要我將指紋加入 know_hosts(輸入 yes)。只好關掉。(回退 ansible 的版本也沒用。)
    4. 現在終於正常了,但是有幾個工具的下載鏈接是 github release 的,慢到吐血。我只好手動下載下來,再手動分發到所有節點上。。

趟完了上面說的坑之后,終於把 kubernetes 安裝上了。安裝體驗上來說比 rancher 差多了,當然這也和我是 ansible 小白有很大關系。。。

優勢:
1. 節點只要有 python 就行,好像連 docker 都可以交給 kubespray 安裝(只要你能忍受它的速度。。)
1. 會自動配置節點的 hostname,不需要手動一台台地改了。

然后裝完后我才曉得,原來 kubeconfig 是需要手動生成的。。之前用 rancher 時它直接就給生成好了,我以為這是自動的來着。。


四、使用 rke(rancher kubernetes engine)離線部署 k8s 集群

前面使用 rancher 部署了一個 k8s 集群,但是那種方式不適合內網環境,因為它所有的鏡像都還是會從外網拉取,遇到出口帶寬被限速,或者與公網物理隔離的情況下,就無能為力了。(rancher 的 UI 界面也可以設置私有倉庫)

因此我改用 rke 進行部署,這種方式自定義程度更高,而且支持配置私有 docker 倉庫,通過 ssh 批量部署。其實用法和 kubespray 有點像,但是比 kubespray 簡單多了。(kuberspray 的配置文件實在太多了。。)

經過使用我發現,rke 才是最簡單方便的 kubernetes 部署方式。流程如下:

  1. OS 還是使用 ubuntu1804,ssh 賬號使用 root(測試環境,方便)
    • 注:CentOS/RedHat 不能使用 root 賬號進行操作。
    • 其他系統配置參見 rke - 系統需求
  2. 使用 ssh-keygen 創建密鑰對,通過 ssh-copy-id 將公鑰傳到各節點上。
  3. 下載 rke,和 kubectl 一樣是個單一可執行文件。
    • 下載好后將它重命名為 rke,放到 PATH 路徑下(比如 /usr/local/bin)。
  4. 創建配置文件:cluster.yml
  5. 修改 cluster.yml,配置好所有的節點與對應的角色。
    • 節點可以指定一個 hostname_override,覆蓋掉原有的 hostname,這非常方便。
  6. cluster.yml 還有非常多的其他參數,作為新手大部分我們都不要去改,但是有幾個重點需要注意
    1. private_registries: 配置私有倉庫。提前將 rancher 的鏡像離線到本地倉庫(如 harbor),可以大大加快部署速度。
    2. kubernetes_version: k8s 版本號,可通過 rke config --list-version --all 查看所有支持的版本號。
    3. service.kube_api: apiserver 相關的配置,其中 service_node_port_range 限定了 node_port 的端口范圍。
    4. service.kube_controller/kubelet/kube_proxy: 調整 k8s 的其他各項參數。。
    5. authorization.mode: 測試環境可以改成 none,方便后面使用 dashboard
    6. network.plugin: 設置網絡插件,各插件的差別待了解
    7. ingress.provider: rke 部署的這個 ingress 我弄了半天都沒弄好,最后把這個改成 none,然后手動用 kubectl 部署官方的 ingress-controller 才正常。。
    8. dns: 域名解析嘛,默認的 coredns 就行,上游 dns 可以設 114.114.114.114
    9. addons_include: 導入其他插件,最常見的有(詳細的部署方式下面會寫):
      • dashboard
      • nginx-ingress-controller
  7. 使用 rke up 命令部署 k8s

在 k8s 集群上部署 dashboard 和 nginx-ingress-controller

1. 部署 dashboard

部署 dashboard 存在兩個問題

  1. 官方提供的鏡像地址 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1 被牆。
  2. dashboard 默認創建的 serviceaccount kubernetes-dashboard 權限相當小,啥都看不了。

解決辦法,首先下載官方的 yaml 文件,做如下修改:

  1. Deployment 使用 azure 鏡像源:gcr.azk8s.cn/google_containers/kubernetes-dashboard-amd64:v1.10.1
  2. 修改 RoleBinding 那一部分的 yaml 配置,將服務賬號 kubernetes-dashboard 綁定到管理員角色 cluster-admin 上。詳見官方文檔:https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md#create-clusterrolebinding

然后再 kubectl create

訪問 dashboard

dashboard 不怎么好用,只適合粗略查看。更建議使用 k9s

  1. 在本機使用 kubectl proxy 提供一個訪問集群內部 service 的入口
  2. 通過 http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 進入 dashboard 的 ui 界面
  3. 如果在前面的集群創建時,你將 authorization.mode 設為了 none,那應該會有個 skip 的按鈕,點擊就能進入 dashboard 了。
  4. 否則你大概需要參照 使用 token 登錄

2. 本地部署 nginx-ingress-controller

建議用 traefik 替換掉它

參照 NGINX Ingress Controller - 安裝指南

  1. Prerequisite Generic Deployment Command: kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
  2. 使用 nodePort 導出 ingress 端口:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml
    • 這個官方提供的 yaml 沒有指定 nodePort,會導致最后導出的 nodePort 是隨機分配的。。
    • 可以手動指定成 80 和 443,或者如果端口被占用,也可以改成 8080 和 8443

然后就可以使用 ingress 啦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM