자체 Kubernetes - 3부 - 포드 나열 및 삭제

이전 기사에서는 포드를 생성하고 실행했으며, 이 기사에서는 명령에 따라 포드를 나열하고 삭제합니다.

이 기사 전에 코드를 리팩터링했습니다. 포드 및 RunningPod 구조체와 관련된 메서드는 pkg/pod/pod.go에 있고 새 포드를 만드는 것과 같은 포드 관련 작업을 실행하는 액세스 기능은 pkg/pod/service.go에 있습니다.


실행 중인 모든 포드를 나열하려면 pkg/pod/service.go에 간단한 기능을 구현하여 기존 작업을 모두 나열합니다.

func initContainerdConnection() (*containerd.Client, context.Context, error) {
    client, err := containerd.New(SOCKET_PATH)
    if err != nil {
        return nil, nil, err
    }

    ctx := namespaces.WithNamespace(context.Background(), NAMESPACE)

    return client, ctx, nil
}

func ListRunningPods() ([]string, error) {
    client, ctx, err := initContainerdConnection()
    if err != nil {
        return nil, err
    }

    runningPods := []string{}

    containers, err := client.Containers(ctx)
    if err != nil {
        return runningPods, err
    }

    for _, container := range containers {
        _, err = container.Task(ctx, cio.Load)

        if err == nil {
            runningPods = append(runningPods, container.ID())
        }
    }

    return runningPods, nil
}



initContainerdConnection 함수는 리팩터링 단계에서 생성되었으며, 이 함수는 컨테이너에서 작업을 수행하기 위해 클라이언트 및 ctx를 생성하기 위해 호출됩니다.
이 함수는 기존의 모든 컨테이너를 통과하고 로드를 시도합니다. 오류가 반환되지 않으면 컨테이너에 실행 중인 작업이 있음을 의미하며 포드가 실행 중임을 의미합니다.

cmd/pod.go에서

var listCmd = &cobra.Command{
    Use:   "list",
    Short: "lists existing pods",
    RunE: func(cmd *cobra.Command, args []string) error {
        runningPods, err := pod.ListRunningPods()
        if err != nil {
            return err
        }

        for _, pod := range runningPods {
            fmt.Println(pod)
        }

        return nil
    },
}


확인해 봅시다(이를 위해 포드 생성의 종료 및 삭제에 대해 설명했습니다).

sudo ./main pod create --registry docker.io/library/redis:alpine --name redis
pod created: redis-9079a2e3-87a0-4a08-8b96-14926b6edb45
starting pod
pod started: redis-9079a2e3-87a0-4a08-8b96-14926b6edb45
❯ sudo ./main pod list
redis-9079a2e3-87a0-4a08-8b96-14926b6edb45


좋아요, 작동합니다!

이제 삭제 명령에 초점을 맞추겠습니다. 삭제가 포드 ID를 수락하고 삭제하기를 원합니다. 그러면 삭제된 포드 ID가 인쇄됩니다.
그래서 cmd/pkd/pod.go에서:

var killCmd = &cobra.Command{
    Use:   "kill",
    Short: "kill existing pod",
    RunE: func(cmd *cobra.Command, args []string) error {
        id, err := pod.KillPod(name)
        if err != nil {
            return err
        }

        fmt.Println(id)

        return nil
    },
}

func init() {
.
.
.

    podCmd.AddCommand(killCmd)
    killCmd.Flags().StringVar(&name, "id", "", "the pod id (required)")
    killCmd.MarkFlagRequired("id")
}



이제 pkg/pod/service.go에서 컨테이너와 컨테이너의 작업을 검색하고 여기에서 Pod 및 RunningPod 구조체를 생성하고 Kill 및 Delete 메서드를 실행하는 KillPod 함수를 추가합니다. 구조체 생성은 kill 및 delete가 제대로 처리되도록 하기 위한 것입니다.

func KillPod(name string) (string, error) {
    client, ctx, err := initContainerdConnection()
    if err != nil {
        return "", err
    }

    container, err := client.LoadContainer(ctx, name)
    if err != nil {
        return "", err
    }

    task, err := container.Task(ctx, cio.Load)
    if err != nil {
        return "", err
    }

    exitStatusC, err := task.Wait(ctx)
    if err != nil {
        return "", err
    }

    runningPod := RunningPod{
        task: &task,
        Pod: &Pod{
            client:    client,
            ctx:       &ctx,
            container: &container,
            Id:        name,
        },
        exitStatusC: exitStatusC,
    }

    _, err = runningPod.Kill()
    if err != nil {
        return "", err
    }

    runningPod.Pod.Delete()

    return name, nil
}



변경 사항을 테스트해 보겠습니다.

sudo ./main pod create --registry docker.io/library/redis:alpine --name redis
pod created: redis-3f6f15fb-ff52-4d61-937f-db01d02f1b61
starting pod
❯ sudo ./main pod list
redis-3f6f15fb-ff52-4d61-937f-db01d02f1b61
❯ sudo ./main pod kill --id redis-3f6f15fb-ff52-4d61-937f-db01d02f1b61
redis-3f6f15fb-ff52-4d61-937f-db01d02f1b61
❯ sudo ./main pod list


좋아요, 작동합니다!


이 부분의 전체 소스 코드 커밋은 here 찾을 수 있으며 변경 사항은 pkg/pod/service.go 및 cmd/pod.go에 있습니다.

좋은 웹페이지 즐겨찾기