文章目錄
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 組織中扮演的角色如下:
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 了,目前支持虛擬機類型有 VirtualBox
、VMWare(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 系統會要求設置管理員密碼,默認管理員賬號爲: admin
。設置完畢後,要設置一下 Rancher Server URL
,這個 URL 是 Agent 節點註冊的地址,需要保證這個地址能夠被其他主機訪問的到,一般默認即可,例如我這個 Rancher Server URL
爲 https://192.168.99.101
。
5、Rancher 2.x 管理現有 Kubernetes 集羣
Rancher 可以管理現有 Kubernetes 集羣,通過在現有 Kubernetes 集羣中啓動一個 Rancher Agent 服務,就可以託管整個 Kubernetes 集羣,然後在 Rancher UI 中導入即可。這裏我以導入本地 Minikube 搭建的 Kubernetes 爲例,演示下如何在 Rancher UI 中操作。
登錄 Rancher UI 系統後,點擊 “集羣” -> “添加集羣” -> “導入現有的Kubernetes集羣”,輸入集羣名稱和描述,點擊 “創建” 到下一個頁面。
根據頁面提示,在本地執行對應的命令,來添加 cattle-cluster-agent
、cattle-node-agent
等資源,這些資源作爲代理程序運行在 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 資源了。
現在,就可以在 Rancher UI 上很直觀的查看和操作託管的 Kubernetes 集羣資源了,包括添加命名空間、存儲卷、告警、通知、日誌、部署服務、負載均衡、服務發現、CI/CD 流水線等等功能,而且界面非常簡潔直觀,非常適合新手學習體驗。
這裏我就暫時先不演示這些功能如何使用了,可以參照 Kubernetes in Rancher Doc 官方文檔來體驗嘗試下。
6、Rancher 2.x 基於 RKE 搭建 Kubernetes 集羣
上邊演示了通過導入現有 Kubernetes 集羣,來實現 UI 操作託管集羣,Rancher 還可以通過 RKE 方式自動搭建 Kubernetes 集羣。這裏我就在上邊創建的 RancherOS 系統內創建,點擊 “集羣” -> “添加集羣” -> “添加主機自建Kubernetes集羣”,輸入集羣名稱和描述,編輯集羣選項,點擊 “下一步” 到下一個配置頁面。
注意:因爲這裏我只有一個主機節點,所以主機角色那裏 etcd
、Control
、Worker
都需要勾選上,否則集羣啓動不起來,如果有多個節點,那麼這裏可以分別選擇不同的角色來生成對應命令執行即可。複製最下邊的命令到 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 資源了。
7、Rancher 部署服務
最後,我在演示下,如何通過 Rancher UI 來一鍵式部署服務。Rancher Server 中存在一個項目的概念,默認存在兩個項目:default
和 system
,類似於 namespaces
但是並不是 namespaces
,而且 namespaces
還率屬於某項目下,項目可以配置 Pod 安全策略以及資源配額,可以理解爲更好的劃分各個項目資源隔離。default
項目可以理解爲非系統項目的個人自定義項目,system
項目可以理解爲具有所有 Kubernetes 和 Rancher 系統命名空間的系統項目,
接下來我們切換到集羣 my-rancheros
下 default
命令空間下的工作負荷頁面來部署一個服務。
我們以 nginx 爲例,在新的 my-namespaces
命名空間內,啓動一個新的 nginx Pod,並配置容器 80
端口映射到 NodePort 30001
端口來配置 Service,其他配置默認即可。
點擊完成,稍等片刻,Rancher Server 就自動在 my-rancheros
Kubernetes 系統內創建了 my-nginx
Pod 資源。
接下來,我們就可以在本地訪問 http://192.168.99.101:30001
地址來訪問剛啓動的 nginx 服務了。
妥妥沒問題,是不是很方便啦!之前我們是需要使用 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 還有很多實用的功能,像負載均衡、數據卷、流水線等,這裏我就不在演示了,自己去體驗一下吧。下一篇,我將繼續演示如何通過 Rancher UI 來部署服務並配置負載均衡來外部訪問。
參考資料