完成一个可交互的k8s管理平台的页面开发

发布于:2025-06-05 ⋅ 阅读:(20) ⋅ 点赞:(0)

使用deepseek完成设计一个k8s管理平台,关键词如下:

完成一个可交互的k8s管理平台的页面开发

Kubernetes 管理平台页面设计
下面是一个基于现代Web技术的可交互Kubernetes管理平台的页面设计方案,使用React作为前端框架,配合Ant Design组件库实现。
1、主要功能模块
2、集群概览仪表盘
3、工作负载管理
4、服务与入口管理
5、存储管理
6、配置管理
7、节点管理
8、命名空间管理
9、日志与监控

import React, { useState, useEffect } from 'react';
import { 
  Layout, Menu, Card, Table, Tag, Space, Button, 
  Statistic, Row, Col, Breadcrumb, Dropdown, 
  Badge, Avatar, Input, Select, Modal, message 
} from 'antd';
import {
  DashboardOutlined, AppstoreOutlined, 
  CloudServerOutlined, DatabaseOutlined,
  SettingOutlined, ClusterOutlined,
  FolderOutlined, BarChartOutlined,
  MenuUnfoldOutlined, MenuFoldOutlined,
  LogoutOutlined, UserOutlined,
  PlusOutlined, SyncOutlined
} from '@ant-design/icons';
import './App.css';

const { Header, Sider, Content, Footer } = Layout;
const { SubMenu } = Menu;
const { Option } = Select;
const { Search } = Input;

const K8SManagementPlatform = () => {
  const [collapsed, setCollapsed] = useState(false);
  const [selectedMenu, setSelectedMenu] = useState('dashboard');
  const [loading, setLoading] = useState(false);
  const [isModalVisible, setIsModalVisible] = useState(false);
  const [pods, setPods] = useState([]);
  const [nodes, setNodes] = useState([]);
  const [namespaces, setNamespaces] = useState(['default', 'kube-system', 'production']);
  const [currentNamespace, setCurrentNamespace] = useState('default');

  // 模拟API获取数据
  useEffect(() => {
    fetchData();
  }, [currentNamespace]);

  const fetchData = () => {
    setLoading(true);
    // 模拟API调用
    setTimeout(() => {
      setPods([
        {
          name: 'nginx-deployment-75675f5897-7ci7o',
          status: 'Running',
          namespace: currentNamespace,
          node: 'node-1',
          ip: '10.244.0.6',
          age: '2d',
          restarts: 0,
          cpu: '10m',
          memory: '50Mi'
        },
        {
          name: 'redis-master-0',
          status: 'Running',
          namespace: currentNamespace,
          node: 'node-2',
          ip: '10.244.0.7',
          age: '1d',
          restarts: 2,
          cpu: '5m',
          memory: '30Mi'
        }
      ]);
      
      setNodes([
        {
          name: 'node-1',
          status: 'Ready',
          roles: 'worker',
          version: 'v1.20.2',
          cpu: '4/8',
          memory: '6/16Gi',
          pods: '10/110',
          age: '30d'
        },
        {
          name: 'node-2',
          status: 'Ready',
          roles: 'worker',
          version: 'v1.20.2',
          cpu: '3/8',
          memory: '4/16Gi',
          pods: '8/110',
          age: '30d'
        }
      ]);
      setLoading(false);
    }, 800);
  };

  const toggleCollapsed = () => {
    setCollapsed(!collapsed);
  };

  const handleMenuClick = (e) => {
    setSelectedMenu(e.key);
  };

  const showModal = () => {
    setIsModalVisible(true);
  };

  const handleOk = () => {
    setIsModalVisible(false);
    message.success('资源创建请求已提交');
  };

  const handleCancel = () => {
    setIsModalVisible(false);
  };

  const handleNamespaceChange = (value) => {
    setCurrentNamespace(value);
  };

  const refreshData = () => {
    fetchData();
    message.info('数据已刷新');
  };

  // 表格列定义
  const podColumns = [
    {
      title: '名称',
      dataIndex: 'name',
      key: 'name',
      render: text => <a>{text}</a>,
    },
    {
      title: '状态',
      dataIndex: 'status',
      key: 'status',
      render: status => (
        <Tag color={status === 'Running' ? 'green' : 'red'}>{status}</Tag>
      ),
    },
    {
      title: '命名空间',
      dataIndex: 'namespace',
      key: 'namespace',
    },
    {
      title: '节点',
      dataIndex: 'node',
      key: 'node',
    },
    {
      title: 'IP',
      dataIndex: 'ip',
      key: 'ip',
    },
    {
      title: '运行时间',
      dataIndex: 'age',
      key: 'age',
    },
    {
      title: '操作',
      key: 'action',
      render: (_, record) => (
        <Space size="middle">
          <a>日志</a>
          <a>终端</a>
          <a>删除</a>
        </Space>
      ),
    },
  ];

  const nodeColumns = [
    {
      title: '名称',
      dataIndex: 'name',
      key: 'name',
    },
    {
      title: '状态',
      dataIndex: 'status',
      key: 'status',
      render: status => (
        <Tag color={status === 'Ready' ? 'green' : 'red'}>{status}</Tag>
      ),
    },
    {
      title: '角色',
      dataIndex: 'roles',
      key: 'roles',
    },
    {
      title: '版本',
      dataIndex: 'version',
      key: 'version',
    },
    {
      title: 'CPU使用',
      dataIndex: 'cpu',
      key: 'cpu',
    },
    {
      title: '内存使用',
      dataIndex: 'memory',
      key: 'memory',
    },
    {
      title: 'Pods',
      dataIndex: 'pods',
      key: 'pods',
    },
  ];

  // 根据选择的菜单渲染不同内容
  const renderContent = () => {
    switch (selectedMenu) {
      case 'dashboard':
        return (
          <div className="dashboard-content">
            <Row gutter={16}>
              <Col span={6}>
                <Card>
                  <Statistic 
                    title="运行中的Pod" 
                    value={pods.filter(p => p.status === 'Running').length} 
                    prefix={<AppstoreOutlined />}
                  />
                </Card>
              </Col>
              <Col span={6}>
                <Card>
                  <Statistic 
                    title="节点数量" 
                    value={nodes.length} 
                    prefix={<ClusterOutlined />}
                  />
                </Card>
              </Col>
              <Col span={6}>
                <Card>
                  <Statistic 
                    title="命名空间" 
                    value={namespaces.length} 
                    prefix={<FolderOutlined />}
                  />
                </Card>
              </Col>
              <Col span={6}>
                <Card>
                  <Statistic 
                    title="集群健康状态" 
                    value="正常" 
                    prefix={<CloudServerOutlined />}
                  />
                </Card>
              </Col>
            </Row>
            
            <Row gutter={16} style={{ marginTop: 16 }}>
              <Col span={12}>
                <Card title="Pod状态分布" style={{ height: 300 }}>
                  {/* 这里可以放置图表 */}
                  <div style={{ textAlign: 'center', padding: 40 }}>
                    <BarChartOutlined style={{ fontSize: 48, color: '#1890ff' }} />
                    <p>Pod状态分布图表</p>
                  </div>
                </Card>
              </Col>
              <Col span={12}>
                <Card title="资源使用情况" style={{ height: 300 }}>
                  {/* 这里可以放置图表 */}
                  <div style={{ textAlign: 'center', padding: 40 }}>
                    <BarChartOutlined style={{ fontSize: 48, color: '#1890ff' }} />
                    <p>资源使用情况图表</p>
                  </div>
                </Card>
              </Col>
            </Row>
          </div>
        );
      case 'pods':
        return (
          <Card 
            title="Pod管理" 
            extra={
              <Space>
                <Select 
                  defaultValue={currentNamespace} 
                  style={{ width: 180 }} 
                  onChange={handleNamespaceChange}
                >
                  {namespaces.map(ns => (
                    <Option key={ns} value={ns}>{ns}</Option>
                  ))}
                </Select>
                <Button icon={<SyncOutlined />} onClick={refreshData}>刷新</Button>
                <Button type="primary" icon={<PlusOutlined />} onClick={showModal}>
                  创建Pod
                </Button>
              </Space>
            }
          >
            <Table 
              columns={podColumns} 
              dataSource={pods} 
              loading={loading} 
              rowKey="name" 
            />
          </Card>
        );
      case 'nodes':
        return (
          <Card 
            title="节点管理" 
            extra={
              <Space>
                <Button icon={<SyncOutlined />} onClick={refreshData}>刷新</Button>
              </Space>
            }
          >
            <Table 
              columns={nodeColumns} 
              dataSource={nodes} 
              loading={loading} 
              rowKey="name" 
            />
          </Card>
        );
      case 'deployments':
        return <div>部署管理内容</div>;
      case 'services':
        return <div>服务管理内容</div>;
      case 'storage':
        return <div>存储管理内容</div>;
      case 'config':
        return <div>配置管理内容</div>;
      default:
        return <div>仪表盘内容</div>;
    }
  };

  const userMenu = (
    <Menu>
      <Menu.Item key="profile" icon={<UserOutlined />}>
        个人资料
      </Menu.Item>
      <Menu.Item key="settings" icon={<SettingOutlined />}>
        设置
      </Menu.Item>
      <Menu.Divider />
      <Menu.Item key="logout" icon={<LogoutOutlined />}>
        退出登录
      </Menu.Item>
    </Menu>
  );

  return (
    <Layout style={{ minHeight: '100vh' }}>
      <Sider trigger={null} collapsible collapsed={collapsed}>
        <div className="logo">
          {collapsed ? 'K8S' : 'Kubernetes管理平台'}
        </div>
        <Menu 
          theme="dark" 
          mode="inline" 
          defaultSelectedKeys={['dashboard']} 
          onClick={handleMenuClick}
        >
          <Menu.Item key="dashboard" icon={<DashboardOutlined />}>
            仪表盘
          </Menu.Item>
          <SubMenu key="workloads" icon={<AppstoreOutlined />} title="工作负载">
            <Menu.Item key="pods">Pods</Menu.Item>
            <Menu.Item key="deployments">部署</Menu.Item>
            <Menu.Item key="statefulsets">有状态集</Menu.Item>
            <Menu.Item key="daemonsets">守护进程集</Menu.Item>
            <Menu.Item key="jobs">任务</Menu.Item>
            <Menu.Item key="cronjobs">定时任务</Menu.Item>
          </SubMenu>
          <SubMenu key="networking" icon={<CloudServerOutlined />} title="网络">
            <Menu.Item key="services">服务</Menu.Item>
            <Menu.Item key="ingresses">入口</Menu.Item>
          </SubMenu>
          <SubMenu key="storage" icon={<DatabaseOutlined />} title="存储">
            <Menu.Item key="persistentvolumes">持久卷</Menu.Item>
            <Menu.Item key="persistentvolumeclaims">持久卷声明</Menu.Item>
            <Menu.Item key="storageclasses">存储类</Menu.Item>
          </SubMenu>
          <SubMenu key="config" icon={<SettingOutlined />} title="配置">
            <Menu.Item key="configmaps">配置映射</Menu.Item>
            <Menu.Item key="secrets">密钥</Menu.Item>
          </SubMenu>
          <Menu.Item key="nodes" icon={<ClusterOutlined />}>
            节点
          </Menu.Item>
          <Menu.Item key="namespaces" icon={<FolderOutlined />}>
            命名空间
          </Menu.Item>
        </Menu>
      </Sider>
      <Layout className="site-layout">
        <Header className="site-layout-background" style={{ padding: 0 }}>
          <Row justify="space-between" align="middle">
            <Col>
              {React.createElement(collapsed ? MenuUnfoldOutlined : MenuFoldOutlined, {
                className: 'trigger',
                onClick: toggleCollapsed,
              })}
            </Col>
            <Col style={{ paddingRight: 24 }}>
              <Space size="large">
                <Search placeholder="搜索资源..." style={{ width: 200 }} />
                <Badge count={5}>
                  <Avatar shape="square" icon={<UserOutlined />} />
                </Badge>
                <Dropdown overlay={userMenu}>
                  <span style={{ cursor: 'pointer' }}>
                    管理员 <UserOutlined />
                  </span>
                </Dropdown>
              </Space>
            </Col>
          </Row>
        </Header>
        <Content
          className="site-layout-background"
          style={{
            margin: '24px 16px',
            padding: 24,
            minHeight: 280,
          }}
        >
          <Breadcrumb style={{ marginBottom: 16 }}>
            <Breadcrumb.Item>Kubernetes</Breadcrumb.Item>
            <Breadcrumb.Item>
              {selectedMenu.charAt(0).toUpperCase() + selectedMenu.slice(1)}
            </Breadcrumb.Item>
          </Breadcrumb>
          {renderContent()}
        </Content>
        <Footer style={{ textAlign: 'center' }}>
          Kubernetes管理平台 ©2023 由React和Ant Design驱动
        </Footer>
      </Layout>

      {/* 创建资源的模态框 */}
      <Modal 
        title="创建新资源" 
        visible={isModalVisible} 
        onOk={handleOk} 
        onCancel={handleCancel}
        width={800}
      >
        <div style={{ textAlign: 'center', padding: 40 }}>
          <p>这里放置资源创建表单</p>
          <p>根据选择的资源类型显示不同的表单字段</p>
        </div>
      </Modal>
    </Layout>
  );
};

export default K8SManagementPlatform;

配套CSS样式

/* App.css */
#root {
  height: 100%;
}

.logo {
  height: 32px;
  margin: 16px;
  color: white;
  font-size: 18px;
  font-weight: bold;
  text-align: center;
  overflow: hidden;
  white-space: nowrap;
}

.site-layout .site-layout-background {
  background: #fff;
}

.trigger {
  padding: 0 24px;
  font-size: 18px;
  line-height: 64px;
  cursor: pointer;
  transition: color 0.3s;
}

.trigger:hover {
  color: #1890ff;
}

.dashboard-content {
  background: #fff;
  padding: 24px;
  min-height: 360px;
}

.ant-layout {
  min-height: 100vh;
}

.ant-layout-header {
  padding: 0;
  background: #fff !important;
  box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
}

.ant-layout-sider {
  box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);
}

.ant-layout-footer {
  padding: 16px 50px;
}

功能说明
响应式布局:左侧菜单可折叠,适应不同屏幕尺寸

多模块管理:通过菜单切换不同Kubernetes资源管理模块

命名空间过滤:可以按命名空间查看资源

数据刷新:提供手动刷新数据功能

资源创建:通过模态框创建新资源

状态可视化:使用标签和颜色区分不同资源状态

搜索功能:全局资源搜索

扩展建议
集成API:连接真实的Kubernetes API后端

图表增强:使用ECharts或Chart.js实现更丰富的监控图表

终端模拟:集成xterm.js实现Web终端功能

日志查看:实现日志实时查看和搜索功能

权限控制:根据RBAC实现细粒度的权限管理

多集群管理:支持管理多个Kubernetes集群

要运行这个 Kubernetes 管理平台前端应用,你需要按照以下步骤操作。这里假设你已经具备基本的 Node.js 和 npm/yarn 开发环境。

运行步骤

  1. 创建 React 项目
    如果你还没有创建 React 项目,先创建一个:
npx create-react-app k8s-dashboard
cd k8s-dashboard
  1. 安装依赖
    安装所需的依赖库(Ant Design 和图标库):
npm install antd @ant-design/icons

或者使用 yarn

yarn add antd @ant-design/icons
  1. 替换代码
    将上面的代码分别保存到以下文件中:

主代码保存为 src/App.js

CSS 样式保存为 src/App.css

  1. 修改 index.js
    确保你的 src/index.js 文件如下:
jsx
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);
  1. 启动开发服务器
    运行以下命令启动开发服务器:
npm start

或者使用 yarn

yarn start
应用将在默认浏览器中打开 http://localhost:3000。

生产环境构建
如果你想构建生产版本:

npm run build

或者使用 yarn

yarn build
构建完成后,你可以在 build 文件夹中找到所有静态文件,可以部署到任何 Web 服务器。

与后端 API 集成
目前这是一个纯前端演示,要与真实的 Kubernetes API 交互,你需要:

设置 API 代理(在 package.json 中添加 proxy 配置)

实现 API 调用(替换示例中的模拟数据)

处理认证(通常使用 kubeconfig 或 token)

使用 Docker 运行
如果你想使用 Docker 运行这个应用:
创建 Dockerfile:

使用官方 Node.js 镜像

FROM node:16 as build

WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

使用 Nginx 作为生产服务器

FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

构建并运行容器:

docker build -t k8s-dashboard .
docker run -p 80:80 k8s-dashboard
然后访问 http://localhost 即可。

注意事项
这只是一个前端界面,需要后端 API 支持才能管理真实的 Kubernetes 集群

生产环境需要考虑安全措施,如 HTTPS、认证等

你可以根据需要扩展功能,如添加监控图表、日志查看器等

+---------------------------------------------------------------------+
|  K8S Dashboard  [搜索框]   🔔  👤 管理员 ▼                          |
+---------------------+-----------------------------------------------+
|  ▤ 仪表盘           |                                               |
|  📦 工作负载 ▼      |                                               |
|    Pods            |               集群概览                         |
|    部署            |                                               |
|  🌐 网络 ▼         |  +--------+  +--------+  +--------+  +--------+|
|    服务            |  | Pods   |  | 节点   |  | 命名   |  | 集群   ||
|    入口            |  | 12     |  | 3      |  | 空间 5 |  | 健康   ||
|  💾 存储 ▼         |  +--------+  +--------+  +--------+  +--------+|
|    持久卷          |                                               |
|  ⚙️ 配置 ▼         |  +--------------------------+                  |
|    ConfigMaps      |  | Pod状态分布图表          |                  |
|    Secrets         |  |                          |                  |
|  🖥️ 节点           |  +--------------------------+                  |
|  📁 命名空间       |                                               |
|                     |  +--------------------------+                  |
|                     |  | 资源使用情况图表         |                  |
|                     |  |                          |                  |
|                     |  +--------------------------+                  |
+---------------------+-----------------------------------------------+

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到