K8s 管理系统项目[API部分–Namespace]
1. 接口实现
service/dataselector.go
type namespaceCell corev1.Namespace
func(n namespaceCell) GetCreation() time.Time {
return n.CreationTimestamp.Time
}
func(n namespaceCell) GetName() string {
return n.Name
}
2. Namespace功能
service/namespace.go
2.1 重写方法
func (n *namespace) toCells(std []corev1.Namespace) []DataCell {
cells := make([]DataCell, len(std))
for i := range std {
cells[i] = namespaceCell(std[i])
}
return cells
}
func (n *namespace) fromCells(cells []DataCell) []corev1.Namespace {
namespaces := make([]corev1.Namespace, len(cells))
for i := range cells {
namespaces[i] = corev1.Namespace(cells[i].(namespaceCell))
}
return namespaces
}
2.1 获取Namespace详情
// 获取namespace详情
func (n *namespace) GetNamespaceDetail(namespaceName string) (namespace *corev1.Namespace, err error) {
namespace, err = K8s.ClientSet.CoreV1().Namespaces().Get(context.TODO(), namespaceName, metav1.GetOptions{})
if err != nil {
logger.Error(errors.New("获取Namespace详情失败, " + err.Error()))
return nil, errors.New("获取Namespace详情失败, " + err.Error())
}
return namespace, nil
}
2.2 删除Namespace
// 删除namespace
func (n *namespace) DeleteNamespace(namespaceName string) (err error) {
err = K8s.ClientSet.CoreV1().Namespaces().Delete(context.TODO(), namespaceName, metav1.DeleteOptions{})
if err != nil {
logger.Error(errors.New("删除Namespace失败, " + err.Error()))
return errors.New("删除Namespace失败, " + err.Error())
}
return nil
}
2.3 Namespace完整
package service
import (
"context"
"errors"
"github.com/wonderivan/logger"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
var Namespace namespace
type namespace struct{}
type NamespacesResp struct {
Items []corev1.Namespace `json:"items"`
Total int `json:"total"`
}
// 获取namespace列表,支持过滤、排序、分页
func (n *namespace) GetNamespaces(filterName string, limit, page int) (namespacesResp *NamespacesResp, err error) {
//获取namespaceList类型的namespace列表
namespaceList, err := K8s.ClientSet.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
if err != nil {
logger.Error(errors.New("获取Namespace列表失败, " + err.Error()))
return nil, errors.New("获取Namespace列表失败, " + err.Error())
}
//将namespaceList中的namespace列表(Items),放进dataselector对象中,进行排序
selectableData := &dataSelector{
GenericDataList: n.toCells(namespaceList.Items),
DataSelect: &DataSelectQuery{
Filter: &FilterQuery{Name: filterName},
Paginate: &PaginateQuery{
Limit: limit,
Page: page,
},
},
}
filtered := selectableData.Filter()
total := len(filtered.GenericDataList)
data := filtered.Sort().Paginate()
//将[]DataCell类型的namespace列表转为v1.namespace列表
namespaces := n.fromCells(data.GenericDataList)
return &NamespacesResp{
Items: namespaces,
Total: total,
}, nil
}
// 获取namespace详情
func (n *namespace) GetNamespaceDetail(namespaceName string) (namespace *corev1.Namespace, err error) {
namespace, err = K8s.ClientSet.CoreV1().Namespaces().Get(context.TODO(), namespaceName, metav1.GetOptions{})
if err != nil {
logger.Error(errors.New("获取Namespace详情失败, " + err.Error()))
return nil, errors.New("获取Namespace详情失败, " + err.Error())
}
return namespace, nil
}
// 删除namespace
func (n *namespace) DeleteNamespace(namespaceName string) (err error) {
err = K8s.ClientSet.CoreV1().Namespaces().Delete(context.TODO(), namespaceName, metav1.DeleteOptions{})
if err != nil {
logger.Error(errors.New("删除Namespace失败, " + err.Error()))
return errors.New("删除Namespace失败, " + err.Error())
}
return nil
}
func (n *namespace) toCells(std []corev1.Namespace) []DataCell {
cells := make([]DataCell, len(std))
for i := range std {
cells[i] = namespaceCell(std[i])
}
return cells
}
func (n *namespace) fromCells(cells []DataCell) []corev1.Namespace {
namespaces := make([]corev1.Namespace, len(cells))
for i := range cells {
namespaces[i] = corev1.Namespace(cells[i].(namespaceCell))
}
return namespaces
}
3. 获取Namespace列表
controller/namespace.go
package controller
import (
"k8s-plantform/service"
"net/http"
"github.com/gin-gonic/gin"
"github.com/wonderivan/logger"
)
var Namespace namespace
type namespace struct{}
// 获取namespace列表,支持过滤、排序、分页
func (n *namespace) GetNamespaces(ctx *gin.Context) {
params := new(struct {
FilterName string `form:"filter_name"`
Page int `form:"page"`
Limit int `form:"limit"`
})
if err := ctx.Bind(params); err != nil {
logger.Error("Bind请求参数失败, " + err.Error())
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
data, err := service.Namespace.GetNamespaces(params.FilterName, params.Limit, params.Page)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"msg": "获取Namespace列表成功",
"data": data,
})
}
// 获取namespace详情
func (n *namespace) GetNamespaceDetail(ctx *gin.Context) {
params := new(struct {
NamespaceName string `form:"namespace_name"`
})
if err := ctx.Bind(params); err != nil {
logger.Error("Bind请求参数失败, " + err.Error())
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
data, err := service.Namespace.GetNamespaceDetail(params.NamespaceName)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"msg": "获取Namespace详情成功",
"data": data,
})
}
// 删除namespace
func (n *namespace) DeleteNamespace(ctx *gin.Context) {
params := new(struct {
NamespaceName string `json:"namespace_name"`
})
//DELETE请求,绑定参数方法改为ctx.ShouldBindJSON
if err := ctx.ShouldBindJSON(params); err != nil {
logger.Error("Bind请求参数失败, " + err.Error())
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
err := service.Namespace.DeleteNamespace(params.NamespaceName)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"msg": "删除Namespace成功",
"data": nil,
})
}
4. 定义路由
controller/router.go
//namespace操作
GET("/api/k8s/namespaces", Namespace.GetNamespaces).
GET("/api/k8s/namespace/detail", Namespace.GetNamespaceDetail).
DELETE("/api/k8s/namespace/del", Namespace.DeleteNamespace)
5. 测试Namespace方法
5.1 获取Namespace
/api/k8s/namespaces
5.2 获取Namespace详情
/api/k8s/namespace/detail
5.3 删除Namespace
/api/k8s/namespace/del
root@master-01:~# kubectl get ns
NAME STATUS AGE
default Active 3d20h
ingress-nginx Active 3d17h
k8s Active 19h
kube-flannel Active 3d20h
kube-node-lease Active 3d20h
kube-public Active 3d20h
kube-system Active 3d20h
wework Active 3d17h
root@master-01:~# kubectl get pods -n k8s
NAME READY STATUS RESTARTS AGE
nginx-deployment-66b6c48dd5-44scf 1/1 Running 0 18h
nginx-deployment-66b6c48dd5-9gtjt 1/1 Running 0 18h
nginx-deployment-66b6c48dd5-rkww9 1/1 Running 0 18h
这里可以看到k8s命名空间连同下面的资源都被一并删除
root@master-01:~# kubectl get pods -n k8s
No resources found in k8s namespace.
root@master-01:~# kubectl get ns
NAME STATUS AGE
default Active 3d20h
ingress-nginx Active 3d17h
kube-flannel Active 3d20h
kube-node-lease Active 3d20h
kube-public Active 3d20h
kube-system Active 3d20h
wework Active 3d17h