134 lines
3.6 KiB
Go
134 lines
3.6 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"gitlink.org.cn/JointCloud/pcm-participant-k8s/model"
|
|
v1 "k8s.io/api/core/v1"
|
|
k8sErr "k8s.io/apimachinery/pkg/api/errors"
|
|
"k8s.io/apimachinery/pkg/api/resource"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes"
|
|
)
|
|
|
|
func CreateContainer(client *kubernetes.Clientset, param *model.CreateContainerParam) error {
|
|
// 查询pod是否存在
|
|
queryPod, err := client.CoreV1().Pods("default").Get(context.TODO(), param.ContainerGroupName, metav1.GetOptions{})
|
|
if err != nil && !k8sErr.IsNotFound(err) {
|
|
return err
|
|
}
|
|
|
|
if queryPod.Name != "" {
|
|
return errors.New("pod already exists.")
|
|
}
|
|
// 创建svc
|
|
if param.Container.ContainerPort.Port != 0 {
|
|
_, err := CreateSvc(client, param)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
// 创建 Pod 对象
|
|
pod := &v1.Pod{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
Name: param.ContainerGroupName, // Pod 名称(必选)
|
|
Labels: map[string]string{
|
|
"app": param.ContainerGroupName,
|
|
},
|
|
},
|
|
|
|
Spec: v1.PodSpec{
|
|
HostNetwork: true,
|
|
Containers: []v1.Container{ // 至少一个容器(必选)
|
|
{
|
|
ImagePullPolicy: "Never",
|
|
Name: param.Container.Name,
|
|
Image: param.Container.Image,
|
|
Args: param.Container.Args,
|
|
Resources: v1.ResourceRequirements{
|
|
Limits: v1.ResourceList{
|
|
v1.ResourceCPU: resource.MustParse(param.Container.Limits.Cpu),
|
|
v1.ResourceMemory: resource.MustParse(param.Container.Limits.Memory),
|
|
},
|
|
},
|
|
Env: make([]v1.EnvVar, len(param.Container.Envs)),
|
|
Command: param.Container.Command,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
// 挂载pvc
|
|
if param.MountPath != "" {
|
|
pod.Spec.Containers[0].VolumeMounts = append(pod.Spec.Containers[0].VolumeMounts, v1.VolumeMount{
|
|
Name: "11mvgt1jh-pvc",
|
|
MountPath: param.MountPath,
|
|
})
|
|
pod.Spec.Volumes = append(pod.Spec.Volumes, v1.Volume{
|
|
Name: "11mvgt1jh-pvc",
|
|
VolumeSource: v1.VolumeSource{
|
|
PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
|
|
ClaimName: "11mvgt1jh-pvc",
|
|
ReadOnly: false,
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
// 设置环境变量
|
|
for i := range param.Container.Envs {
|
|
pod.Spec.Containers[0].Env[i] = v1.EnvVar{
|
|
Name: param.Container.Envs[i].Name,
|
|
Value: param.Container.Envs[i].Value,
|
|
}
|
|
}
|
|
|
|
// 发送请求
|
|
response, err := client.CoreV1().Pods("default").Create(
|
|
context.TODO(),
|
|
pod,
|
|
metav1.CreateOptions{})
|
|
if err != nil {
|
|
fmt.Printf(err.Error())
|
|
// 删除pvc
|
|
//client.CoreV1().PersistentVolumeClaims("default").Delete(context.TODO(), pod.Spec.Volumes[0].PersistentVolumeClaim.ClaimName, metav1.DeleteOptions{})
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("Pod created successfully. Name: %s\n", response.Name)
|
|
return nil
|
|
}
|
|
|
|
func DeleteContainer(client *kubernetes.Clientset, param *model.DeleteContainerParam) error {
|
|
// 查询pod
|
|
pod, err := client.CoreV1().Pods("default").Get(context.TODO(), param.ContainerName, metav1.GetOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// 删除pod
|
|
err = client.CoreV1().Pods("default").Delete(context.TODO(), pod.Name, metav1.DeleteOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// 删除svc
|
|
if pod.Spec.Containers[0].Ports != nil {
|
|
err = client.CoreV1().Services("default").Delete(context.TODO(), pod.Name+"-service", metav1.DeleteOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetContainer(client *kubernetes.Clientset, param *model.GetContainerParam) (interface{}, error) {
|
|
// 查询pod
|
|
pod, err := client.CoreV1().Pods("default").Get(context.TODO(), param.Name, metav1.GetOptions{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return pod, nil
|
|
}
|