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

前言

前面用到過的 minikube 只是一個單節點的 k8s 集羣,這對於學習而言是不夠的。咱們須要有一個多節點集羣,才能用到各類調度/監控功能。並且單節點只能是一個加引號的「集羣」。html

kubernetes 安裝方式面面觀

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

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

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

  1. minikube/microk8s: 單節點集羣,只適合學習/開發使用
  2. kubeadm: k8s 官方推出的一個 k8s 快速安裝工具,可是仍然有必定的工做量。
  3. kubespray: k8s 社區項目,使用 ansible 部署可用於生產環境的 k8s。(k8s-sigs,即 k8s special interest group)
  4. kubeasz: 和 kubespray 同樣,都是使用 ansible 進行部署。不過是純中文的,並且是分步部署。還添加了幾個方便的運維功能。
  5. rancher: k8s 之上的企業級管理系統,安裝至關方便(國內會自動從阿里雲拉鏡像),中文文檔至關詳細,並且還提供了更高層次的管理功能。

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

一番搜索,我最終肯定了用 rancher 來部署個人第一個 kubernetes 多節點集羣(後來發現其實 rke 更適合個人使用場景),怎麼簡單怎麼來哈哈~github

除了多節點集羣,咱們每一個開發人員還須要一臺我的測試用的機器。目前公司的這些測試用的是單節點集羣,爲了快速部署,這些單節點集羣都是經過離線安裝包(或內網鏡像倉庫)、以容器方式部署的。docker

1、準備虛擬機

要部署多節點嘛,天然得先有多臺主機。我本身的機器內存夠用,就直接開了一臺 Ubuntu 虛擬機,而後克隆了四份。(這個克隆操做致使我後面掉進了坑。。)shell

主機的操做系統能夠用本身熟悉的 Ubuntu/Debian/CentOS 等。這裏主要強調一個坑:ubuntu

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

若是是使用 rke/kubespray 進行批量安裝,能夠直接在配置文件裏指定節點 hostname,這倆工具會幫你自動修改。api

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

2、部署 rancher

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,這沒啥好說的。

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 集羣 就行。


更新


3、使用 kubespray 部署本地 k8s 集羣

今天嘗試了一下使用 kubespray 部署一個本地 k8s 集羣,總的來講,坑,仍是 rancher 最方便。。

使用 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 差多了。不過這也可能和我想嚐鮮 k8s 1.16,因此使用了 master 分支有關。。

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

而後裝完後我才曉得,原來 kubeconfig 是須要手動生成的。。以前用 rancher 時它直接就給生成好了,我覺得這是自動的來着。。

=====

4、使用 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

在 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

  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 登陸,使用 token 登陸。

2. 本地部署 nginx-ingress-controller

參照 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 啦。

相關文章
相關標籤/搜索