版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aixiaoyang168/article/details/88600530
Rancher 是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器。Rancher可以轻松地管理各种环境的 Kubernetes,满足IT需求并为 DevOps 团队提供支持。Rancher 用户可以选择使用 Rancher Kubernetes Engine(RKE) 创建 K8s 集群,也可以使用 GKE,AKS 和 EKS 等云K8s 服务。Rancher 用户还可以导入和管理现有的 Kubernetes 集群。同时 Rancher UI 为 DevOps 工程师提供了一个直观的用户界面来管理他们的服务容器。
每个团队都可以在他们选择的公共云或私有云上部署应用程序,Rancher 在 IT 和 DevOps 组织中扮演的角色如下:
Rancher 1.x 版本是基于 Docker 以 Cattle 为调度引擎的容器管理平台。Rancher 2.x 版本基于Kubernetes 基础上重新设计,保留了 1.x 版本中的友好功能,同时提供了更多新的功能。
下图描述了 Rancher 管理两个 Kubernetes 集群的 Rancher server: 一个由 RKE 创建,另一个由 GKE 创建。
本次演示环境,我是在虚拟机上安装 RancherOS 系统来执行操作,通过虚拟机完成 Kubernetes 集群的搭建,以下是安装的软件及版本:
注意:这里现有的 Kubernetes 集群使用 Minikube 来搭建,Minikube 启动的单节点 K8s Node 实例是需要运行在本机的 VM 虚拟机里面,所以需要提前安装好 VM,这里我选择 Oracle VirtualBox。同时本机需要安装好 Docker 环境,这里忽略 Docker、VirtualBox、Minikube 的安装过程。
Rancher 2.x 运行对系统配置的最低要求
为: 系统要求:
内存要求:4 GB 软件要求:Docker v1.12.6, 1.13.1, 17.03.2
首先说明一下,启动 Rancher 2.x 不必要非得在 RancherOS 上,任何满足上边条件的主机均可。那么什么是 RancherOS 系统呢?Rancher 提供了 RancherOS 系统,该系统是生产中运行 Docker 的最小、最简单的办法,它只包含运行 Docker 所需的服务,所以 RancherOS 比大多数传统操作系统要小得多。它通过删除不必要的库和服务,对安全补丁和其他维护的要求也得到了降低。所以可以理解为一个包含了 Docker 服务的轻量级的 Linux 操作系统。这里我就使用 RancherOS 来启动 Rancher Server。
我们可以使用 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
接下来,我们就可以使用 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
现在,我们可以非常简单的在 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/
配置。稍等片刻,容器就启动成功了。
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
。
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 官方文档来体验尝试下。
上边演示了通过导入现有 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 资源了。
最后,我在演示下,如何通过 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 来部署服务并配置负载均衡来外部访问。
参考资料