Rancher 2.x 搭建及管理 Kubernetes 集羣

1、Rancher 2.x 介紹

Rancher 是一套容器管理平臺,它可以幫助組織在生產環境中輕鬆快捷的部署和管理容器。Rancher可以輕鬆地管理各種環境的 Kubernetes,滿足IT需求併爲 DevOps 團隊提供支持。Rancher 用戶可以選擇使用 Rancher Kubernetes Engine(RKE) 創建 K8s 集羣,也可以使用 GKE,AKS 和 EKS 等雲K8s 服務。Rancher 用戶還可以導入和管理現有的 Kubernetes 集羣。同時 Rancher UI 爲 DevOps 工程師提供了一個直觀的用戶界面來管理他們的服務容器。

每個團隊都可以在他們選擇的公共雲或私有云上部署應用程序,Rancher 在 IT 和 DevOps 組織中扮演的角色如下:

rancher role

1.1、Rancher 1.x VS Rancher 2.x

Rancher 1.x 版本是基於 Docker 以 Cattle 爲調度引擎的容器管理平臺。Rancher 2.x 版本基於Kubernetes 基礎上重新設計,保留了 1.x 版本中的友好功能,同時提供了更多新的功能。

  • 內置 CI/CD 流水線
  • 告警和日誌收集功能
  • 多集羣管理功能
  • 集成 Rancher Kubernetes Engine (RKE)
  • 與各雲 Kubernetes 服務(如 GKE、EKS、AKS) 集成

1.2、Rancher 2.x 架構圖

下圖描述了 Rancher 管理兩個 Kubernetes 集羣的 Rancher server: 一個由 RKE 創建,另一個由 GKE 創建。

2、環境、軟件準備

本次演示環境,我是在虛擬機上安裝 RancherOS 系統來執行操作,通過虛擬機完成 Kubernetes 集羣的搭建,以下是安裝的軟件及版本:

  • Oracle VirtualBox: 5.1.20 r114628 (Qt5.6.2)
  • System: Linux 4.14.85
  • RancherOS: v1.5.1
  • docker: 18.06.1-ce
  • docker-machine: 0.16.0
  • minikube: v0.28.2
  • kubernetes: v1.10.0
  • Rancher v2.1.7

注意:這裏現有的 Kubernetes 集羣使用 Minikube 來搭建,Minikube 啓動的單節點 K8s Node 實例是需要運行在本機的 VM 虛擬機裏面,所以需要提前安裝好 VM,這裏我選擇 Oracle VirtualBox。同時本機需要安裝好 Docker 環境,這裏忽略 Docker、VirtualBox、Minikube 的安裝過程。

Rancher 2.x 運行對系統配置的最低要求爲:
系統要求:

  • Ubuntu 16.04 (64-bit)
  • Red Hat Enterprise Linux 7.5 (64-bit)
  • RancherOS 1.4 (64-bit)

內存要求:4 GB
軟件要求:Docker v1.12.6, 1.13.1, 17.03.2

3、創建 RancherOS 啓動 Rancher 2.x

首先說明一下,啓動 Rancher 2.x 不必要非得在 RancherOS 上,任何滿足上邊條件的主機均可。那麼什麼是 RancherOS 系統呢?Rancher 提供了 RancherOS 系統,該系統是生產中運行 Docker 的最小、最簡單的辦法,它只包含運行 Docker 所需的服務,所以 RancherOS 比大多數傳統操作系統要小得多。它通過刪除不必要的庫和服務,對安全補丁和其他維護的要求也得到了降低。所以可以理解爲一個包含了 Docker 服務的輕量級的 Linux 操作系統。這裏我就使用 RancherOS 來啓動 Rancher Server。

3.1、安裝 Docker machine

我們可以使用 Docker Machine 來創建 RancherOS 實例,Docker Machine 是一個方便安裝 Docker 服務到虛擬機的一個工具。安裝很簡單,執行以下命令即可。

Linux 系統:

$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo install /tmp/docker-machine /usr/local/bin/docker-machine

MacOS 系統:

$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

安裝完畢後,執行 docker-machine -v 查看版本信息。

$ docker-machine -v
docker-machine version 0.16.0, build 702c267f  

3.2、創建 RancherOS

接下來,我們就可以使用 docker-machine 命令來加載 VM 虛擬機來創建 RancherOS 了,目前支持虛擬機類型有 VirtualBoxVMWare(VMWare VSphere, VMWare Fusion)AWS,注意在創建前,請選擇以上一種 VM 並安裝到本地,這裏我本機已安裝 virtualbox 虛擬機了。

$ docker-machine create -d virtualbox \
        --virtualbox-boot2docker-url https://releases.rancher.com/os/latest/rancheros.iso \
        --virtualbox-memory 3072 \
        rancher-machine        

稍等一會,它會自動創建一個名稱爲 rancher-machine ,內存爲 3072M,系統爲 Linux 4.14.85 的虛擬機 RancherOS 系統。我們可以使用 docker-machine 命令來查看並操作它。

# 查看創建的虛擬機列表
$ docker-machine ls
NAME              ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
rancher-machine   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.06.1-ce

# 查看虛擬機 IP
$ docker-machine ip rancher-machine
192.168.99.101

# 進入到 rancher-machine 虛擬機內
$ docker-machine ssh rancher-machine
[docker@rancher-machine ~]$ docker -v
Docker version 18.06.1-ce, build e68fc7a

RacherOS 系統內有兩種 Docker 進程,一種就是常用的 Docker Daemon,也就是我們說的 Docker 容器,另一種就是 System Docker,這個是 RancherOS 運行系統服務的進程,例如:syslog、ntp、console 等系統服務。

$ sudo system-docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
rancher/os                  v1.5.1              d63929d3b7e7        4 weeks ago         155MB
rancher/os-logrotate        v1.5.1              75feef2a843e        4 weeks ago         46.9MB
rancher/os-syslog           v1.5.1              4fd39422c03a        4 weeks ago         46.9MB
rancher/os-console          v1.5.1              533f86f2ce17        4 weeks ago         46.9MB
rancher/os-acpid            v1.5.1              513cc99c250c        4 weeks ago         46.9MB
rancher/os-base             v1.5.1              6aec1b999629        4 weeks ago         46.9MB
rancher/os-docker           18.06.1-1           5097564f0920        5 weeks ago         148MB
rancher/container-crontab   v0.4.0              7a2485d285d9        14 months ago       12.9MB

$ sudo system-docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS               NAMES
9bf9855e2132        rancher/os-console:v1.5.1          "/usr/bin/ros entr..."   1 days ago          Up 1 days                               console
89e69b66af05        rancher/os-docker:18.06.1-1        "ros user-docker"        1 days ago          Up 1 days                               docker
764787b89066        rancher/os-base:v1.5.1             "/usr/bin/ros entr..."   1 days ago          Up 1 hours                              ntp
c6c6520de701        rancher/os-base:v1.5.1             "/usr/bin/ros entr..."   1 days ago          Up 1 days                               network
96a22ba5b10c        rancher/os-base:v1.5.1             "/usr/bin/ros entr..."   1 days ago          Up 1 days                               udev
4226d2939e7e        rancher/container-crontab:v0.4.0   "container-crontab"      1 days ago          Up 1 days                               system-cron
34aaaeec7b00        rancher/os-acpid:v1.5.1            "/usr/bin/ros entr..."   1 days ago          Up 1 days                               acpid
87d675f308eb        rancher/os-syslog:v1.5.1           "/usr/bin/entrypoi..."   1 days ago          Up 1 days                               syslog

3.3、啓動 Rancher 2.x

現在,我們可以非常簡單的在 RancherOS 上搭建 Rancher Server,只需要登錄到系統內,執行 docker run 命令即可,是不是很方便。

$ sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher

注意:以上命令啓動 Rancher,刪除容器後在啓動的話, Rancher 之前配置都會失效,所以建議掛載主機目錄到容器內 /var/lib/rancher 目錄,這樣能保存之前配置及數據,增加 -v <主機路徑>:/var/lib/rancher/ 配置。稍等片刻,容器就啓動成功了。

4、Rancher 2.x UI 界面

Rancher 提供了一個非常直觀的 UI 界面,通過 UI 可以很方便的查看並操作 Kubernetes 集羣。瀏覽器訪問 https://<server_ip> 即可打開主頁啦!server_ip 替換爲運行 Rancher 容器主機的 IP,如果在本機啓動,那麼直接訪問 https://127.0.0.1 即可,這裏我訪問 https://192.168.99.101 爲 RancherOS 系統 IP。
rancher ui

注意:第一次登錄 Rancher 系統會要求設置管理員密碼,默認管理員賬號爲: admin。設置完畢後,要設置一下 Rancher Server URL,這個 URL 是 Agent 節點註冊的地址,需要保證這個地址能夠被其他主機訪問的到,一般默認即可,例如我這個 Rancher Server URLhttps://192.168.99.101

5、Rancher 2.x 管理現有 Kubernetes 集羣

Rancher 可以管理現有 Kubernetes 集羣,通過在現有 Kubernetes 集羣中啓動一個 Rancher Agent 服務,就可以託管整個 Kubernetes 集羣,然後在 Rancher UI 中導入即可。這裏我以導入本地 Minikube 搭建的 Kubernetes 爲例,演示下如何在 Rancher UI 中操作。

登錄 Rancher UI 系統後,點擊 “集羣” -> “添加集羣” -> “導入現有的Kubernetes集羣”,輸入集羣名稱和描述,點擊 “創建” 到下一個頁面。
rancher-ui-import-kubernetes

根據頁面提示,在本地執行對應的命令,來添加 cattle-cluster-agentcattle-node-agent 等資源,這些資源作爲代理程序運行在 Kubernetes 集羣中,來負責收集信息、處理請求、監控資源等等。
rancher-ui-import-kubernetes
然後,我本地執行一下如下命令即可。

$ curl --insecure -sfL https://192.168.99.101/v3/import/hksfnzj582j4hkwgvbhd42hbn86q4k5dvrcg76ktnp2cnnf8qbsfdv.yaml | kubectl apply -f -
namespace "cattle-system" created
serviceaccount "cattle" created
clusterrolebinding.rbac.authorization.k8s.io "cattle-admin-binding" created
secret "cattle-credentials-6842057" created
clusterrole.rbac.authorization.k8s.io "cattle-admin" created
deployment.extensions "cattle-cluster-agent" created
daemonset.extensions "cattle-node-agent" created

$ kubectl get pods -n cattle-system
NAME                                    READY     STATUS    RESTARTS   AGE
cattle-cluster-agent-5bd8fc48dc-57k44   1/1       Running   0          7m
cattle-node-agent-8g7zf                 1/1       Running   0          7m

OK,代理程序啓動之後,它會自動向 Rancher Server 發送請求,等到 API 準備就緒後,這樣我們就可以在 UI 上邊看到託管的 Kubernetes 資源了。
ranhcer-ui-import-kubernetes
rancher-ui-import-kubernetes
現在,就可以在 Rancher UI 上很直觀的查看和操作託管的 Kubernetes 集羣資源了,包括添加命名空間、存儲卷、告警、通知、日誌、部署服務、負載均衡、服務發現、CI/CD 流水線等等功能,而且界面非常簡潔直觀,非常適合新手學習體驗。
rancher-ui-import-kubernetes
這裏我就暫時先不演示這些功能如何使用了,可以參照 Kubernetes in Rancher Doc 官方文檔來體驗嘗試下。

6、Rancher 2.x 基於 RKE 搭建 Kubernetes 集羣

上邊演示了通過導入現有 Kubernetes 集羣,來實現 UI 操作託管集羣,Rancher 還可以通過 RKE 方式自動搭建 Kubernetes 集羣。這裏我就在上邊創建的 RancherOS 系統內創建,點擊 “集羣” -> “添加集羣” -> “添加主機自建Kubernetes集羣”,輸入集羣名稱和描述,編輯集羣選項,點擊 “下一步” 到下一個配置頁面。
rancher-ui-rke
rancher-ui-rke
注意:因爲這裏我只有一個主機節點,所以主機角色那裏 etcdControlWorker 都需要勾選上,否則集羣啓動不起來,如果有多個節點,那麼這裏可以分別選擇不同的角色來生成對應命令執行即可。複製最下邊的命令到 RancherOS 系統內執行即可。

$ docker-machine ssh rancher-machine
$ sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.1.7 --server https://192.168.99.101 --token hk47lchqxpdhl47kksxck49rhbfqldmpkh299ptplhmqgvcgdmjdsf --ca-checksum d57849795454b69b6a6c3047e51fccb2eb5c2b519c3ddcc5930a5b1833e90720 --node-name my-rancheros-k8s --etcd --controlplane --worker --label system=RancherOS
301a5ff60a65791a631c4e8a761fa03ffbabfebb5b591155364a8d1ffadca65f

這裏需要稍等片刻,RKE 會自動下載依賴的鏡像(這裏鏡像都是 rancher 官方提供,不需要翻牆了哈!),來創建並啓動 Kubernetes 集羣,啓動完畢後,它也會自動向 Rancher Server 發送請求,等到 API 準備就緒後,這樣我們就可以在 UI 上邊看到託管的 Kubernetes 資源了。
rancher-ui-rke
rancher-ui-rke

7、Rancher 部署服務

最後,我在演示下,如何通過 Rancher UI 來一鍵式部署服務。Rancher Server 中存在一個項目的概念,默認存在兩個項目:defaultsystem,類似於 namespaces 但是並不是 namespaces,而且 namespaces 還率屬於某項目下,項目可以配置 Pod 安全策略以及資源配額,可以理解爲更好的劃分各個項目資源隔離。default 項目可以理解爲非系統項目的個人自定義項目,system 項目可以理解爲具有所有 Kubernetes 和 Rancher 系統命名空間的系統項目,
rancher-ui-project

接下來我們切換到集羣 my-rancherosdefault 命令空間下的工作負荷頁面來部署一個服務。
rancher-ui-workload
我們以 nginx 爲例,在新的 my-namespaces 命名空間內,啓動一個新的 nginx Pod,並配置容器 80 端口映射到 NodePort 30001 端口來配置 Service,其他配置默認即可。
rancher-ui-deployment
點擊完成,稍等片刻,Rancher Server 就自動在 my-rancheros Kubernetes 系統內創建了 my-nginx Pod 資源。
rancher-ui-workload
接下來,我們就可以在本地訪問 http://192.168.99.101:30001 地址來訪問剛啓動的 nginx 服務了。
rancher-ui-nginx-nodeport
妥妥沒問題,是不是很方便啦!之前我們是需要使用 kubectl 命令或者手寫 yaml 文件來配置,現在只需要在 UI 頁面上就可以完成了。當然 Rancher Server 底層還是將配置的參數轉換成 yaml 文件方式,通過頁面上也可以看到生成的 yaml 文件,例如上邊 my-nginx 服務自動生成的 yaml 文件如下:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
    field.cattle.io/creatorId: user-j7rjg
    field.cattle.io/publicEndpoints: '[{"addresses":["10.0.2.15"],"port":30001,"protocol":"TCP","serviceName":"my-namespaces:my-nginx-nodeport","allNodes":true}]'
  creationTimestamp: "2019-03-15T05:14:01Z"
  generation: 2
  labels:
    cattle.io/creator: norman
    workload.user.cattle.io/workloadselector: deployment-my-namespaces-my-nginx
  name: my-nginx
  namespace: my-namespaces
  resourceVersion: "7513"
  selfLink: /apis/apps/v1beta2/namespaces/my-namespaces/deployments/my-nginx
  uid: 254de6d5-46e1-11e9-9cfd-02422b02c6d1
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      workload.user.cattle.io/workloadselector: deployment-my-namespaces-my-nginx
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      annotations:
        cattle.io/timestamp: "2019-03-15T06:24:33Z"
        field.cattle.io/ports: '[[{"containerPort":80,"dnsName":"my-nginx-nodeport","kind":"NodePort","name":"80tcp300011","protocol":"TCP","sourcePort":30001}]]'
      creationTimestamp: null
      labels:
        workload.user.cattle.io/workloadselector: deployment-my-namespaces-my-nginx
    spec:
      containers:
      - image: nginx:latest
        imagePullPolicy: Always
        name: my-nginx
        ports:
        - containerPort: 80
          name: 80tcp300011
          protocol: TCP
        resources: {}
        securityContext:
          allowPrivilegeEscalation: false
          capabilities: {}
          privileged: false
          procMount: Default
          readOnlyRootFilesystem: false
          runAsNonRoot: false
        stdin: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        tty: true
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2019-03-15T05:14:08Z"
    lastUpdateTime: "2019-03-15T05:14:08Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2019-03-15T05:14:01Z"
    lastUpdateTime: "2019-03-15T05:14:08Z"
    message: ReplicaSet "my-nginx-f448f8c6d" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 2
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

同時,我們可以看到,它自動爲生成了兩個相關的 Service,一個爲 ClusterIP 服務類型的 my-nginx 服務,一個爲 NodePort 服務類型的 my-nginx-nodeport 服務,上邊我們訪問的 http://192.168.99.101:30001 就是第二種方式暴漏的服務,第一種可以在集羣內其他 Pod 來訪問。
rancher-ui-service-discovery
當然 Rancher 還有很多實用的功能,像負載均衡、數據卷、流水線等,這裏我就不在演示了,自己去體驗一下吧。下一篇,我將繼續演示如何通過 Rancher UI 來部署服務並配置負載均衡來外部訪問。

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章