자체 Kubernetes - 3부 - 포드 나열 및 삭제
15907 단어 programminggokubernetesdevops
이 기사 전에 코드를 리팩터링했습니다. 포드 및 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에 있습니다.
Reference
이 문제에 관하여(자체 Kubernetes - 3부 - 포드 나열 및 삭제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jonatan5524/own-kubernetes-part-3-pods-23be텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)