简单开发k8s多集群后台

详细的说明如何利用kubernetes api创建一个支持多集群的k8s后台,这里主要实现调用kubernetes api获取查看service服务,pod服务。下一篇再说明如果操作一个service,以及注入容器console

  1. 相关的组件

    • Django (2.0.7)
    • kubernetes (6.0.0)
    • Django Rest Framework (3.8.2)
    • Bootstrap 3.3.7
    • Jquery 2.1.1
    • pace 页面异步加载插件



  1. 新建一个基于django的k8s项目,命名为k8s_web_console


  1. 增加一个cluster应用
python manage.py startapp cluster

  1. 添加 Django Rest Framework

    • 使用rest框架是方便做前后端分离,如果你是个全栈工程师,建议做前后端分离,这样方便维护。但这里为了入门快速方便,如果还要加一个node.js开发,比较麻烦,所以暂时保留这种可能,但还是用django的template方式开发。
pip install djangorestframework
  • 在setting.py中加入rest框架
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘rest_framework‘,
        ‘cluster‘,
]
  • 创建数据库以及数据表
python manage.py makemigrations
python manage.py migrate
  1. 打开cluster应用下的models.py添加一个k8s集群信息的model

    class Cluster(models.Model):
    name = models.TextField()
    api = models.TextField()
    token = models.TextField()
    
    class Meta :
        db_table = "cluster"
    
    def __str__(self):
        return self.name

    这里是k8s的连接通过api+token的方式进行连接,当然也可以用证书认证的方式

    • name : 集群的名称
    • api : k8s集群的api 链接
    • token : k8s集群拥有admin权限的token

  1. cluster应用添加一个serializers.py文件
from rest_framework import serializers
from cluster.models import Cluster

class ClusterSerializer( serializers.ModelSerializer ):
    class Meta:
        model = Cluster
        fields = ‘__all__‘
  • rest 框架根据这里的配置对Cluster对象自动做序列化

  1. cluster 的view文件添加cluster的viewset
# /api/cluster/
class ClusterViewSet( viewsets.ModelViewSet ):
    queryset = Cluster.objects.all()
    serializer_class = ClusterSerializer
    # permission_classes = (IsAuthenticated,)
    parser_classes = (JSONParser,)
  • rest 框架的parser有多种,这里用的是jsonparser,需要再settings.py 中添加如下配置
    REST_FRAMEWORK = {
    ‘DEFAULT_PARSER_CLASSES‘: (
        ‘rest_framework.parsers.JSONParser‘,
    )
}

  1. 编辑admin.py,将cluster注册到Django Admin后台
from django.contrib import admin
from .models import Cluster

admin.site.register(Cluster)

  1. urls.py 中设置下路由
from cluster import views as cluster_views
router = DefaultRouter()
router.register(r‘cluster‘, cluster_views.ClusterViewSet)

urlpatterns = [
    path( ‘admin/‘, admin.site.urls ),
    path( ‘api/‘, include( router.urls ) ),
    path(‘api-auth/‘, include(‘rest_framework.urls‘, namespace=‘rest_framework‘)),
]

  1. 测试下cluster的crud,以及rest api方式


  1. 加入kubernetes api,开始调试kubernetes

    pip install kubernetes
    
    • cluster应用的view修改如下
from pprint import pprint
from django.shortcuts import get_object_or_404
from django.shortcuts import render
from kubernetes.client import Configuration, ApiClient, CoreV1Api
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.parsers import JSONParser

from cluster.models import Cluster
from .serializers import ClusterSerializer

def get_config(cluster):
    ‘‘‘
    :param cluster:  k8s集群的配置对象
    :return:   返回一个config对象
    ‘‘‘
    configuration = Configuration()
    configuration.verify_ssl = False
    configuration.host = cluster.api
    configuration.api_key[‘authorization‘] = cluster.token
    configuration.api_key_prefix[‘authorization‘] = ‘Bearer‘
    return configuration

def get_clients(cluster):
    ‘‘‘
    :param cluster: k8s集群对象
    :return:  一个apiclient对象,一个coreV1Api对象
    ‘‘‘
    api_client = ApiClient( get_config( cluster ) )
    return api_client, CoreV1Api( api_client )

# /api/cluster/
class ClusterViewSet( viewsets.ModelViewSet ):
    queryset = Cluster.objects.all()
    serializer_class = ClusterSerializer
    # permission_classes = (IsAuthenticated,)
    parser_classes = (JSONParser,)

    # /api/cluster/[pk]/list_service/
    @action( detail=True, methods=[‘get‘] )
    def list_service(self, request, pk=None):
        cluster = get_object_or_404( Cluster, pk=pk )
        api_client, core_v1_api = get_clients( cluster )
        v1_service_list = core_v1_api.list_service_for_all_namespaces()
        # pprint(v1_service_list)
        result = {}
        items = []
        headers = [‘NAMESPACE‘, ‘NAME‘, ‘TYPE‘, ‘CLUSTER-IP‘, ‘SELF LINK‘]

        for item in v1_service_list.items:
            items.append( [item.metadata.namespace,
                           item.metadata.name,
                           item.spec.cluster_ip, item.spec.type, item.metadata.self_link
                           ] )

        result[‘items‘] = items
        result[‘headers‘] = headers
        result[‘caption‘] = "Services"
        return render( request, "table.html", {‘result‘: result} )

    # /api/cluster/[pk]/list_pod/
    @action( detail=True, methods=[‘get‘] )
    def list_pod(self, request, pk=None):
        cluster = get_object_or_404( Cluster, pk=pk )
        api_client, core_v1_api = get_clients( cluster )
        v1_service_list = core_v1_api.list_pod_for_all_namespaces()
        # pprint(v1_service_list)
        result = {}
        items = []
        headers = [‘NAMESPACE‘, ‘NAME‘, ‘IP‘, ‘NODE‘]

        for item in v1_service_list.items:
            items.append( [
                item.metadata.namespace,
                item.metadata.name,
                item.status.host_ip,
                item.status.pod_ip,
            ] )

        result[‘items‘] = items
        result[‘headers‘] = headers
        result[‘caption‘] = "Pods"
        return render( request, "table.html", {‘result‘: result} )
因为这里仅作了一个cluster测试,所以这里将对k8s的连接也放在这里,当如果正式的项目,应该放在一个独立的文件,创建成连接池管理,再通过引用提供到这里使用
  • 再次声明,如果是这里为了简单,仍然用了django的template模式,当如果前后端分离开发,返回应该是序列化后的json


上面的list用到一个table.html模板,内容如下

<table class="table table-hover " id="service-table">
    <caption>{{ result.caption }}</caption>
    <thead>
    <tr>
        {% for item in result.headers %}
            <th>{{ item }}</th>
        {% endfor %}
    </tr>
    </thead>
    <tbody>
    {% for item in result.items %}
        <tr>
            {% for eny in item %}
                <td>{{ eny }}</td>
            {% endfor %}
        </tr>
    {% endfor %}
    </tbody>
    <tfoot>
    <tr>
        {% for item in result.headers %}
            <th>{{ item }}</th>
        {% endfor %}
    </tr>
    </tfoot>
</table>


  1. 项目中添加一个dashboard目录,目录下添加init.py,views.py文件

    • 为了做当前页面刷新,方便管理,所以多了一个dashboard来管理,views.py的内容如下
from django.shortcuts import render
from cluster.models import Cluster

def cluster_main(request):
    result = {}
    result[‘clusters‘] = Cluster.objects.all()
    return render(request,‘main.html‘,{‘result‘:result})
  • 在urls.py 中添加一条路由,最终内容如下

from django.contrib import admin
from django.urls import path
from django.conf.urls import include
from rest_framework.routers import DefaultRouter
from cluster import views as cluster_views
from dashboard import views as dashboard_views

router = DefaultRouter()
router.register(r‘cluster‘, cluster_views.ClusterViewSet)

urlpatterns = [
    path( ‘admin/‘, admin.site.urls ),
    path(‘dash/cluster‘,dashboard_views.cluster_main),
    path( ‘api/‘, include( router.urls ) ),
    path(‘api-auth/‘, include(‘rest_framework.urls‘, namespace=‘rest_framework‘)),
]


dashboard 中用了一个main.html模板,使用的是bootstrap+jquery+pace,实现当前页面刷新:

{% load static %}
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>K8s 多集群管理测试</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet"
          href="https://cdn.jsdelivr.net/npm/[email protected]/src/messagebox.css">
    <link rel="stylesheet" href="{% static ‘plugins/pace/pace.min.css‘ %}">
    <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="http://mindmup.github.io/editable-table/mindmup-editabletable.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/src/messagebox.min.js"></script>
    <script src="{% static ‘plugins/pace/pace.min.js‘ %}"></script>
</head>
<body>
<div class="container">
    <nav class="navbar navbar-default" role="navigation">
        <div class="container-fluid">
            <div class="navbar-header">
                <a class="navbar-brand" href="#">K8S Dashboard</a>
            </div>
            <form class="navbar-form navbar-left pull-right" role="search">
                <div class="form-group">
                    <label for="k8s-api"></label>
                    <select class=" form-control" id="k8s-api">
                        <option value="#">选择集群</option>
                        {% for cluster in result.clusters %}
                            <option value="{{ cluster.id }}">{{ cluster.name }}</option>
                        {% endfor %}
                    </select>
                </div>
            </form>
            <ul class="nav navbar-nav navbar-right">
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                        选择类型 <b class="caret"></b>
                    </a>
                    <ul class="dropdown-menu">
                        <li><a href="javascript:void(0);" onclick="load_table(‘/list_pod/‘)">Pod</a></li>
                        <li class="divider"></li>
                        <li><a href="javascript:void(0);" onclick="load_table(‘/list_service/‘)">Service</a></li>
                    </ul>
                </li>
            </ul>
        </div>
    </nav>
    <div id="table-div"></div>
</div>

<script type="application/javascript">
    $(document).ajaxStart(function () {
        Pace.restart()
    });

    function load_table(url_method) {

        console.log(url_method);

        k8s_select = $("#k8s-api");

        k8s_id = k8s_select.val();
        if (k8s_id === "#") {
            $.MessageBox({
                buttonDone: "OK",
                message: "<center>先选择一个集群</center>",
                queue: true,
                speed: 200  ,
                top: "25%"   ,
            });
            return null;
        }
        url = ‘/api/cluster/‘ + k8s_id + url_method;
        $.ajax({
            url: url,
            success: function (ex) {
                console.log("success");
                $(‘#table-div‘).html(ex);
            },
            error: function (ex) {
                console.log(ex);
            }
        })

    }
</script>
</body>
</html>

  1. 好了,完成这些后,终于做完了,现在可以测试下,完成的页面就是上面的显示图片,下面来讲讲kubernetes api的使用

    如果想要连接k8s接口并操作,需要的步骤

    • 创建一个Configuration,这是k8s的连接配置信息,这里提供api接口跟token进行连接
    
    configuration = Configuration()
    configuration.verify_ssl = False
    configuration.host = cluster.api
    configuration.api_key[‘authorization‘] = cluster.token
    configuration.api_key_prefix[‘authorization‘] = ‘Bearer‘
    • 根据config创建一个CoreV1Api,这个类下包含多个操作k8s的接口方法
      api_client = ApiClient( configuration )
    • 如果想要查看所有的service,利用接口list_service_for_all_namespaces



本文的源码下载目录:http://down.51cto.com/data/2450296

原文地址:http://blog.51cto.com/brucewang/2156305

时间: 2024-10-07 18:14:52

简单开发k8s多集群后台的相关文章

Centos7安装部署Kubernetes(K8s)集群

Kubernetes集群的安装有多种方式:下载源码包编译安装.下载编译好的二进制包安装.使用kubeadm工具安装等.本文是以二进制文件方式安装Kubernetes集群.系统环境 主机名 IP地址 操作系统 安装组件 k8s-master 192.168.2.212 Centos 7.5 64位 etcd.kube-apiserver.kube-controller-manager.kube-scheduler k8s-node1 192.168.2.213 Centos 7.5 64位 kub

和我一起打造个简单搜索之ElasticSearch集群搭建

我们所常见的电商搜索如京东,搜索页面都会提供各种各样的筛选条件,比如品牌.尺寸.适用季节.价格区间等,同时提供排序,比如价格排序,信誉排序,销量排序等,方便了用户去找到自己心里理想的商品. 站内搜索对于一个网站几乎是标配,只是搜索的强大与否的区别,有的网站只支持关键词模糊搜索,而淘宝,京东提供了精细的筛选条件,同时支持拼音搜索等更方便的搜索方式. 由于笔者在一家做网络文学的公司工作,所以实现就是以小说为商品的搜索,具体可以参考起点网小说的搜索. 如图所示,起点网的搜索提供了关键词搜索和排序条件以

简单的高可用集群实验

前言: 上文介绍了高可用集群的基本概念,下面让我们来试试用两台提供web服务的虚拟机来实现一个小小的高可用集群吧- 首先,配置一个高可用集群的前提有: 1.至少两个节点: 2.共享存储(为了提供的页面一致,需要在后端用某些机制来实现.这里我们就做个简单的实验,后端存储先不考虑.先让这两个节点各自提供一个不同的页面,方便我们知道哪台在提供服务): 3.STONIN(共享存储时为了避免争用资源,指挥特定的设备,如电源交换机等避免共享存储的崩溃,所以一般的集群都得需要这个否则它会不工作的哦~~这里我们

.net core i上 K8S(一)集群搭建

1.前言 以前搭建集群都是使用nginx反向代理,但现在我们有了更好的选择——K8S.我不打算一上来就讲K8S的知识点,因为知识点还是比较多,我打算先从搭建K8S集群讲起,我也是在搭建集群的过程中熟悉了K8S的一些概念,希望对大家有所帮助.K8S集群的搭建难度适中,网上有很多搭建k8s的教程,我搭建的过程中或多或少遇到一些问题,现在就把我总结完的教程给大家总结一下.这里主要讲通过二进制包安装K8S 2.集群组件介绍 节点 ip 组件 master 192.168.8.201 etcd:存储集群节

k8s docker集群搭建

?Kubernetes介绍 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境 2.什么是kubernetes 首先,他是一个全新的基于容器技术的分布式架构领先方案.Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性

简单介绍Ceph分布式存储集群

在规划Ceph分布式存储集群环境的时候,对硬件的选择很重要,这关乎整个Ceph集群的性能,下面梳理到一些硬件的选择标准,可供参考: 1)CPU选择 Ceph metadata server会动态的重新分配负载,它是CPU敏感性的,所以Metadata Server应该有比较好的处理器性能 (比如四核CPU). Ceph OSDs运行RADOS服务,需要通过CRUSH来计算数据的存放位置,replicate数据,以及维护Cluster Map的拷贝,因此OSD也需要合适的处理性能 Ceph Mon

对HA的简单认识以及HA集群删除

高可用集群HA,英文全称为High Availability,简单来说,集群就是一组计算机,它们作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点. 高可用集群的出现就是为了使集群的整体服务尽可能可用,从而减少由计算机硬件和软件易错性带来的损失.如果某个节点失效,他的备节点就要在几秒钟的时间内接管他的职责,因此,对于用户而言,集群永远不会停机. 高可用集群软件的主要作用就是实现故障检查和业务切换的自动化.只有两个节点的高可用集群又成为双机热备,使用两台服务器互相备份.当一台服

部署k8s ssl集群实践1:基础环境准备

参考文档:https://github.com/opsnull/follow-me-install-kubernetes-cluster感谢作者的无私分享.集群环境已搭建成功跑起来.文章是部署过程中遇到的错误和详细操作步骤记录.如有需要对比参考,请按照顺序阅读和测试. 1.系统环境准备 三台虚机系统:CentOS Linux release 7.5.1804 (Core)主机名字和ip k8s-master 192.168.1.92 k8s-node1 ?192.168.1.93 k8s-nod

部署k8s ssl集群实践4:部署etcd集群

参考文档:https://github.com/opsnull/follow-me-install-kubernetes-cluster感谢作者的无私分享.集群环境已搭建成功跑起来.文章是部署过程中遇到的错误和详细操作步骤记录.如有需要对比参考,请按照顺序阅读和测试. 4.1下载和分发二进制安装包 [[email protected] kubernetes]# wget https://github.com/coreos/etcd/releases/download/v3.3.7/etcd-v3