1. Ratel是什么?

  

  Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment、DaemonSet、StatefulSet、Service、Ingress、Pods、Nodes、Role、ClusterRole、Rolebinding、ClusterRoleBinding、Secret、ConfigMap、PV、PVC等。主要用于以图形化的方式管理k8s的各类资源,提高维护k8s集群的效率及降低出错的概率。

2. 安装Ratel

2.1 配置文件解析

  Ratel默认是安装到需要管理的k8s集群中的任意一个集群(需要和其他集群能够通信)。所以需要现有一个集群,可以参kubernetes实战(二十六):kubeadm 安装 高可用 k8s 1.16.x dashboard 2.x快速搭建一个高可用k8s集群。

  Ratel的配置文件采用yaml格式,参数如下:

 servers.yaml是ratel的配置文件, 格式如下:
        - serverName: 'test1'
          serverAddress: 'https://1.1.1.1:8443'
          #serverAdminUser: 'test1'
          #serverAdminPassword: 'test1#'
          serverAdminToken: 'null'
          serverDashboardUrl: "https://k8s.test1.com.cn"
          production: 'false'
          kubeConfigPath: "/mnt/test1.config"
        其中管理的方式有两种(Token暂不支持):
            账号密码和kubeconfig形式, 只需配置一种即可, kubeconfig优先级高

  参数解析:

        serverName: 集群别名
        serverAddress: Kubernetes APIServer地址
        serverAdminUser: Kubernetes管理员账号(需要配置basic auth)
        serverAdminPassword: Kubernetes管理员密码
        serverAdminToken: Kubernetes管理员Token // 暂不支持
        serverDashboardUrl: Kubernetes官方dashboard地址
        kubeConfigPath: Kubernetes kube.config路径(绝对路径)
    kubeConfigPath 通过secret挂载到容器的/mnt目录或者其他目录

2.2 创建Ratel Secret

  其中test1.config是集群test1的配置文件,test2.config是集群test2的配置文件,需要一一对应

kubectl create secret generic ratel-config  --from-file=test1.config --from-file=test2.config --from-file=servers.yaml -n kube-system

2.3 部署Ratel

  部署Ratel的Yaml文件如下:

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          labels:
            app: ratel
          name: ratel
          namespace: kube-system
        spec:
          replicas:
          selector:
            matchLabels:
              app: ratel
          strategy:
            rollingUpdate:
              maxSurge:
              maxUnavailable:
            type: RollingUpdate
          template:
            metadata:
              creationTimestamp: null
              labels:
                app: ratel
            spec:
              containers:
                - command:
                    - sh
                    - -c
                    - ./ratel -c /mnt/servers.yaml
                  env:
                    - name: TZ
                      value: Asia/Shanghai
                    - name: LANG
                      value: C.UTF-
                    - name: ProRunMode
                      value: prod
                    - name: ADMIN_USERNAME
                      value: admin
                    - name: ADMIN_PASSWORD
                      value: ratel_password
                  image: dotbalo/ratel:v0.1alpha
                  imagePullPolicy: Always
                  livenessProbe:
                    failureThreshold:
                    initialDelaySeconds:
                    periodSeconds:
                    successThreshold:
                    tcpSocket:
                      port:
                    timeoutSeconds:
                  name: ratel
                  ports:
                    - containerPort:
                      name: web
                      protocol: TCP
                  readinessProbe:
                    failureThreshold:
                    initialDelaySeconds:
                    periodSeconds:
                    successThreshold:
                    tcpSocket:
                      port:
                    timeoutSeconds:
                  resources:
                    limits:
                      cpu: 1000m
                      memory: 520Mi
                    requests:
                      cpu: 100m
                      memory: 100Mi
                  volumeMounts:
                    - mountPath: /mnt
                      name: ratel-config
              dnsPolicy: ClusterFirst
              imagePullSecrets:
                - name: myregistrykey
              restartPolicy: Always
              schedulerName: default-scheduler
              securityContext: {}
              terminationGracePeriodSeconds:
              volumes:
                - name: ratel-config
                  secret:
                    defaultMode:
                    secretName: ratel-config 

  创建Ratel的Service和Ingress的yaml文件如下:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: ratel
  name: ratel
  namespace: kube-system
spec:
  ports:
    - name: container--web-
      port:
      protocol: TCP
      targetPort:
  selector:
    app: ratel
  type: ClusterIP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ratel
  namespace: kube-system
spec:
  rules:
  - host: krm.test.com
    http:
      paths:
      - backend:
          serviceName: ratel
          servicePort:
        path: /

  

  配置参数说明:

        ProRunMode: 区别在于dev模式打印的是debug日志, 其他模式是info级别的日志, 实际使用时应该配置为非dev
        ADMIN_USERNAME: ratel自己的管理员账号
        ADMIN_PASSWORD: ratel自己的管理员密码
        实际使用时账号密码应满足复杂性要求,因为ratel可以直接操作所配置的资源。
        其他无需配置, 端口配置暂不支持。

  部署完毕后可以通过krm.test.com进行访问(域名按需配置)

2.4 访问Ratel

  

  登录后可以查看到集群列表

  点击Cluster Name可以查看到当前集群部分信息

  单击资源数量可以查看资源列表,比如Node

  或者Deployment

  

  更多详情查看:https://github.com/dotbalo/ratel-doc

3. 使用Ratel创建Deployment

  点击Deployment --> 创建

3.1 基本信息填写

  

  填写说明

    •   选择集群: 选择之前配置的集群, 按serverName区分,选择集群后,会自动弹出Namespace的选择框。
    •   Namespace: 当前Deployment需要创建在哪个Namespace,Namespace的选择框支持搜索功能。
    •   尽量部署至不同宿主机: 此选项相当于添加了一个Pod的Affinity的软策略,基于selector实现。
    •   部署至不同宿主机: 此选项相当于添加了一个Pod的Affinity的硬性策略策略,基于selector实现。
    •   更新策略: Deployment的更新策略,此处和DaemonSet和StatefulSet更新策略不一致。
    •   副本数: Pod的个数,可以使用鼠标滚轮或者直接键入的方式更改。
    •   私有仓库Secret: 用于私有仓库镜像下载的账号密码,需要提前创建,点击刷新会自动获取集群的docker registry类型的secret。

  可选参数配置

  填写说明

    •   Labels:Labels是Deployment的label标签,当属于Deployment名字时,会自动填写一个Labels和Selector,可以按需修改、添加和删除。
    •   Selectors: Selectors是Pod的Labels和Deployment的Selector,按需修改、添加和删除。
    •   HostAliases: HostAliases是hosts文件配置,按需修改、添加和删除。
    •   NodeSelector: 节点选择器,按需修改、添加和删除。
    •   内核配置: Pod中的内核配置。
    •   Taint: 容忍配置。

3.2 Volume配置

  基本配置填写完成以后,点击Next(必须)进入到填写Volume的视图

  填写说明

    如上图所示,目前所支持的Volume配置有HostPath、Secret、ConfigMap、EmptyDir、PVC。
    上述的Secret、ConfigMap、PVC、StorageClass无需手动输入,单击刷新后即可自动自动获取到当前集群的相关信息。

  填写内容如下

3.3 Container配置

  填写完Volume配置以后,点击Next填写Container配置

3.3.1 Container 1配置

  

3.3.2 Container 2配置

 

  填写说明

    •   Container配置目前几乎支持所有常见配置,Container的名称会在Deployment名称键入后自动填写一个默认的,可以按需修改。
    •   可以配置多个Container,按需添加、修改和删除。
    •   启动命令和启动参数按需修改,逗号分隔,如果启动命令或者启动参数含有逗号,需要以变量的方式传入,比如启动命令是--configEnv=test1,prd
    •   此时test1,prd需要配置成变量,之后通过--configEnv=$ConfigEnv注入。
    •   集群的CPU和内存资源按需配置,直接拖动即可。
    •   健康检查按需配置,目前支持httpGet、tcpSocket、exec方式。
    •   preStop和postStart按需配置。
    •   高权限运行是添加privilege=true参数至Container。
    •   容器端口按需配置和添加,目前支持三种协议配置。
    •   容器环境变量,支持三种方式的容器变量配置,按需添加、修改和删除。
      •     字符变量: key value变量,不能留空。
      •     EnvFrom: 从ConfigMap和Secret中获取变量配置。
      •     ValueFrom: 目前支持FieldRef、ConfigMapRef、SecretRef和ResourceFieldRef配置。
    •   文件挂载配置:
      •     文件挂载配置必须先添加Volume配置,否则无法创建文件挂载。
      •     Volume名称自动获取创建Volume。

3.4 Init Container配置

  Init Container配置和Container大致相同

3.5 Service配置

  创建Deployment、DaemonSet和StatefulSet的页面,嵌入了简单的Service和Ingress配置。
  如图所示,在配置完Container后,如果需要添加Service(默认不添加),在开启service配置后,会根据container的端口配置自动生成Service的配置,可以按需修改、添加和删除。此页面Service仅支持ClusterIP和NodePort两种类型。

3.6 Ingress配置

  如图所示,在配置完Service后,如果需要添加Ingress(默认不添加),在开启Ingress后,会根据Service配置默认生成一个Ingress配置,可以按需修改、添加和删除。
  如需开启https,需要提前添加tls类型的域名证书,点击刷新后即可自动读取当前集群的当前Namespace的tls类型的证书列表,无tls类型的证书无法开启https。
  去除前缀的意思是: 访问www.test1.com/a/test.html 会自动变成www.test1.com/test.html。

3.7 创建资源

  上述有不规范填写,比如名称不能包含大写的,Ratel会自动转换为小写。创建成功页面如下

  

4. 创建资源查看

  相对于手动创建,不仅降低了出错概率,同时也无需掌握yaml文件的每个参数含义,大大提高了k8s集群的管理效率。

4.1 查看创建的Deployment

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "
  creationTimestamp: "2019-11-18T10:19:57Z"
  generation:
  labels:
    app: nginx
  name: nginx
  namespace: default
  resourceVersion: "
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx
  uid: f857546a-09ec-11ea-bf14-f80f41f365d0
spec:
  progressDeadlineSeconds:
  replicas:
  revisionHistoryLimit:
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge:
      maxUnavailable:
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - nginx
              namespaces:
              - default
              topologyKey: kubernetes.io/hostname
            weight:
      containers:
      - args:
        -
        command:
        - sh
        - -c
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-
        - name: testValueFrom
          valueFrom:
            resourceFieldRef:
              containerName: nginx
              divisor: "
              resource: requests.memory
        envFrom:
        - secretRef:
            name: default-token-hgfm8
        image: nginx
        imagePullPolicy: IfNotPresent
        lifecycle: {}
        livenessProbe:
          exec:
            command:
            -
          failureThreshold:
          initialDelaySeconds:
          periodSeconds:
          successThreshold:
          timeoutSeconds:
        name: nginx
        ports:
        - containerPort:
          name: web
          protocol: TCP
        readinessProbe:
          exec:
            command:
            -
          failureThreshold:
          initialDelaySeconds:
          periodSeconds:
          successThreshold:
          timeoutSeconds:
        resources:
          limits:
            cpu: 164m
            memory: 273Mi
          requests:
            cpu: 10m
            memory: 10Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/zoneinfo/Asia/Shanghai
          name: tz-config
        - mountPath: /etc/localtime
          name: tz-config
        - mountPath: /etc/timezone
          name: timezone
        - mountPath: /mnt/testSecret
          name: testsecret
        - mountPath: /mnt/testConfigMap
          name: testconfigmap
        - mountPath: /mnt/testempty
          name: testemptydir
      - command:
        - sh
        - -c
        -
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-
        - name: test
          value: a
        - name: testFieldRef
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        envFrom:
        - configMapRef:
            name: runner-xxx-gitlab-runner
        image: nginx
        imagePullPolicy: IfNotPresent
        lifecycle: {}
        name: nginx2
        resources:
          limits:
            cpu: 48m
            memory: 52Mi
          requests:
            cpu: 10m
            memory: 10Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/zoneinfo/Asia/Shanghai
          name: tz-config
        - mountPath: /etc/localtime
          name: tz-config
        - mountPath: /etc/timezone
          name: timezone
        - mountPath: /mnt/testConfigMap
          name: testconfigmap
        - mountPath: /mnt/testPVC
          name: testpvc
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: myregistrykey
      initContainers:
      - command:
        - sh
        - -c
        - sleep3
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-
        image: nginx
        imagePullPolicy: Always
        name: initcontainer
        resources:
          limits:
            cpu: 100m
            memory: 100Mi
          requests:
            cpu: 10m
            memory: 10Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/zoneinfo/Asia/Shanghai
          name: tz-config
        - mountPath: /etc/localtime
          name: tz-config
        - mountPath: /etc/timezone
          name: timezone
      nodeSelector:
        env: test
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        sysctls:
        - name: net.core.somaxconn
          value: "
        - name: net.ipv4.tcp_max_syn_backlog
          value: "
      terminationGracePeriodSeconds:
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
        operator: Exists
      volumes:
      - hostPath:
          path: /usr/share/zoneinfo/Asia/Shanghai
          type: ""
        name: tz-config
      - hostPath:
          path: /etc/timezone
          type: ""
        name: timezone
      - name: testsecret
        secret:
          defaultMode:
          secretName: default-token-hgfm8
      - configMap:
          defaultMode:
          name: runner-xxx-gitlab-runner
        name: testconfigmap
      - emptyDir: {}
        name: testemptydir
      - name: testpvc
        persistentVolumeClaim:
          claimName: gitrunner-workspace

4.2 查看创建Service

[root@k8s-master01 ~]# kubectl get svc nginx -oyaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2019-11-18T10:19:56Z"
  labels:
    app: nginx
  name: nginx
  namespace: default
  resourceVersion: "
  selfLink: /api/v1/namespaces/default/services/nginx
  uid: f833a327-09ec-11ea-bf14-f80f41f365d0
spec:
  clusterIP: 50.104.173.155
  ports:
  - name: container--web-
    port:
    protocol: TCP
    targetPort:
  selector:
    app: nginx
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

4.3 Ingress配置

[root@k8s-master01 ~]# kubectl get ingress nginx-strip-path -o yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$
  creationTimestamp: "2019-11-18T10:25:39Z"
  generation:
  name: nginx-strip-path
  namespace: default
  resourceVersion: "
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/nginx-strip-path
  uid: c42679fe-09ed-11ea-bf14-f80f41f365d0
spec:
  rules:
  - host: www.test.com
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort:
        path: /test(/|$)(.*)
status:
  loadBalancer: {}

  Ratel项目地址:https://github.com/dotbalo/ratel-doc

kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用的更多相关文章

  1. kubernetes实战(二十):k8s一键部署高可用Prometheus并实现邮件告警

    1.基本概念 本次部署使用的是CoreOS的prometheus-operator. 本次部署包含监控etcd集群. 本次部署适用于二进制和kubeadm安装方式. 本次部署适用于k8s v1.10版 ...

  2. kubernetes实战(二十五):kubeadm 安装 高可用 k8s v1.13.x

    1.系统环境 使用kubeadm安装高可用k8s v.13.x较为简单,相比以往的版本省去了很多步骤. kubeadm安装高可用k8s v.11 和 v1.12 点我 主机信息 主机名 IP地址 说明 ...

  3. Kubernetes实战(二):k8s v1.11.1 prometheus traefik组件安装及集群测试

    1.traefik traefik:HTTP层路由,官网:http://traefik.cn/,文档:https://docs.traefik.io/user-guide/kubernetes/ 功能 ...

  4. Java并发编程原理与实战二十八:信号量Semaphore

    1.Semaphore简介 Semaphore,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类. 所谓Semaphore即 信号量 的意思. 这个叫法并不能很好地 ...

  5. (转载)Android项目实战(二十八):Zxing二维码实现及优化

    Android项目实战(二十八):Zxing二维码实现及优化   前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中 ...

  6. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  7. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  8. Web 前端开发人员和设计师必读文章推荐【系列二十八】

    <Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  9. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  10. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]

    原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...

随机推荐

  1. nginx使用ngx_lua访问后端Thrift-Server实现和介绍

    背景 随着openresty的出现,让nginx使用lua解决一些业务的能力大幅度提高,ngx_lua可以使用nginx自生的基于事件驱动的IO模型,和后端的存储,业务等系统实现非阻塞的连接交互. 如 ...

  2. Linux 进程间通讯详解四

    msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); --功能:把一条消息添加到消息队列中 --参数 ...

  3. 关于application/x-www-form-urlencoded等字符编码的解释说明

    在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型. 下边是说明: application/x-www-form-urlen ...

  4. 简述Session 、Cookie、cache 区别

    区别: 1.session是把数据保存在服务器上,每一个用户都有自己的session. 2.cookie是保存在客户端(也就是本机电脑). 3.cache是保存在服务器上,每个用户都可以访问的对象. ...

  5. Python-SocketServer源码

    贴到博客,地铁上看- """Generic socket server classes. This module tries to capture the various ...

  6. php字符串中单引号&#39;&#39;和双引号“”的区别

    (1)双引号可以解析字符串中的变量,单引号不能 $a = 10; $str = "this a var $a"; //输出this a var 10 (2)在双引号中可以使用转义字 ...

  7. [转]iOS技巧之获取本机通讯录中的内容,解析通讯录源代码

    一.在工程中添加AddressBook.framework和AddressBookUI.framework 二.获取通讯录 1.在infterface中定义数组并在init方法中初始化 ? 1 2 3 ...

  8. Ubuntu下安装Git以及Git帮助手册【转】

    转自:http://milkythinking.com/blog/2011/04/17/install_git_and_manual/ Git简介 Git是一个分布式版本控制系统,对应的是SVN.CV ...

  9. How does browsersync work?

    How Does BrowserSync Work? BrowserSync starts a small web server. If you’re already using a local we ...

  10. 函数 resize和reserve的区别

    reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素.加入新的元素时,要调用push_back()/insert()函数. resize是改变容 ...