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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aixiaoyang168/article/details/88600530

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 来部署服务并配置负载均衡来外部访问。

参考资料

展开阅读全文

没有更多推荐了,返回首页