pcm-participant/participant/k8s/service/container.go

131 lines
3.5 KiB
Go

package service
import (
"context"
"fmt"
"gitlink.org.cn/JointCloud/pcm-participant-k8s/model"
v1 "k8s.io/api/core/v1"
"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是否存在
_, err := client.CoreV1().Pods("default").Get(context.TODO(), param.ContainerGroupName, metav1.GetOptions{})
if err == nil {
return err
}
if !errors.IsNotFound(err) {
return err
}
// 创建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
}