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 还有很多实用的功能,像负载均衡、数据卷、流水线等,这里我就不在演示了,自己去体验一下吧
本文分享自 kubernetes中文社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!