확장에서 Kubernetes와 상호작용하기

확장에서 Kubernetes와 상호작용하기 (Interacting with Kubernetes from an extension)

다른 SDK API를 사용해 확장에서 Kubernetes 클러스터와 간접적으로 상호작용하는 방법을 설명하는 문서예요.

출처: 문서

본문

Extensions SDK는 Docker Desktop 관리 Kubernetes 클러스터 또는 KinD 같은 다른 도구로 만든 클러스터와 직접 상호작용하는 API 메서드를 제공하지 않아요. 하지만 이 페이지는 확장에서 Kubernetes 클러스터와 간접적으로 상호작용하기 위해 다른 SDK API를 사용하는 방법을 제공해요.

Docker Desktop 관리 Kubernetes와 직접 상호작용하는 API를 요청하려면 Extensions SDK GitHub 저장소에서 이 이슈에 투표할 수 있어요.

사전 요구사항 (Prerequisites)

Kubernetes 켜기 (Turn on Kubernetes)

Docker Desktop의 기본 제공 Kubernetes를 사용해 Kubernetes 단일 노드 클러스터를 시작할 수 있어요.

kubectl 명령줄 도구 또는 다른 클라이언트와 함께 사용할 때 Kubernetes 접근을 구성하는 데 kubeconfig 파일이 사용돼요.

Docker Desktop은 사용자의 홈 영역 안에서 미리 구성된 로컬 kubeconfig 파일과 kubectl 명령을 편리하게 제공해요. 이것은 Docker Desktop에서 Kubernetes를 활용하려는 사람들을 위해 접근을 빠르게 할 수 있는 편리한 방법이에요.

확장의 일부로 kubectl 배송하기 (Ship the kubectl as part of the extension)

확장이 Kubernetes 클러스터와 상호작용해야 한다면 kubectl 명령줄 도구를 확장의 일부로 포함하는 것이 권장돼요. 이렇게 하면 확장을 설치한 사용자는 호스트에 kubectl이 설치된 셈이에요.

여러 플랫폼용 kubectl 명령줄 도구를 Docker Extension 이미지의 일부로 배송하는 방법을 알아보려면 Build multi-arch extensions을 참조하세요.

예시 (Examples)

다음 코드 조각들은 Kubernetes Sample Extension에 함께 모아져 있어요. kubectl 명령줄 도구를 배송해 Kubernetes 클러스터와 상호작용하는 방법을 보여줘요.

Kubernetes API 서버가 접근 가능한지 확인 (Check the Kubernetes API server is reachable)

kubectl 명령줄 도구가 Dockerfile의 확장 이미지에 추가되고 metadata.json에 정의되면, Extensions 프레임워크는 확장이 설치될 때 사용자 호스트에 kubectl을 배포해요.

ddClient.extension.host?.cli.exec JS API를 사용해 kubectl 명령을 발행할 수 있어요. 예를 들어 특정 컨텍스트에서 Kubernetes API 서버에 접근할 수 있는지 확인:

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "cluster-info",
  "--request-timeout",
  "2s",
  "--context",
  "docker-desktop",
]);

Kubernetes 컨텍스트 나열 (List Kubernetes contexts)

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "config",
  "view",
  "-o",
  "jsonpath='{.contexts}'",
]);

Kubernetes 네임스페이스 나열 (List Kubernetes namespaces)

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "get",
  "namespaces",
  "--no-headers",
  "-o",
  'custom-columns=":metadata.name"',
  "--context",
  "docker-desktop",
]);

kubeconfig 파일 유지하기 (Persisting the kubeconfig file)

아래는 호스트 파일 시스템에서 kubeconfig 파일을 유지하고 읽는 다양한 방법이에요. 사용자는 언제든 kubeconfig 파일에 Kubernetes 컨텍스트를 추가, 편집 또는 제거할 수 있어요.

경고: kubeconfig 파일은 매우 민감하며 발견되면 공격자에게 Kubernetes 클러스터에 대한 관리자 접근을 줄 수 있어요.

확장의 백엔드 컨테이너 (Extension's backend container)

확장이 읽은 후 kubeconfig 파일을 유지해야 한다면, 파일 내용을 메모리나 컨테이너 파일 시스템의 어딘가에 저장하는 HTTP POST 엔드포인트를 노출하는 백엔드 컨테이너를 가질 수 있어요. 이렇게 하면 사용자가 확장에서 Docker Desktop의 다른 부분으로 이동한 후 다시 와도 kubeconfig 파일을 다시 읽을 필요가 없어요.

export const updateKubeconfig = async () => {
  const kubeConfig = await ddClient.extension.host?.cli.exec("kubectl", [
    "config",
    "view",
    "--raw",
    "--minify",
    "--context",
    "docker-desktop",
  ]);
  if (kubeConfig?.stderr) {
    console.log("error", kubeConfig?.stderr);
    return false;
  }
  // call backend container to store the kubeconfig retrieved into the container's memory or filesystem
  try {
    await ddClient.extension.vm?.service?.post("/store-kube-config", {
      data: kubeConfig?.stdout,
    });
  } catch (err) {
    console.log("error", JSON.stringify(err));
  }
};

Docker 볼륨 (Docker volume)

볼륨은 Docker 컨테이너가 생성하고 사용하는 데이터를 유지하는 데 선호되는 메커니즘이에요. kubeconfig 파일을 유지하는 데 사용할 수 있어요.

kubeconfig를 볼륨에 유지하면 확장 창이 닫힐 때 kubeconfig 파일을 다시 읽을 필요가 없어요. 이는 확장에서 Docker Desktop의 다른 부분으로 이동할 때 데이터를 유지하는 데 이상적이에요.

const kubeConfig = await ddClient.extension.host?.cli.exec("kubectl", [
  "config",
  "view",
  "--raw",
  "--minify",
  "--context",
  "docker-desktop",
]);
if (kubeConfig?.stderr) {
  console.log("error", kubeConfig?.stderr);
  return false;
}
await ddClient.docker.cli.exec("run", [
  "--rm",
  "-v",
  "my-vol:/tmp",
  "alpine",
  "/bin/sh",
  "-c",
  `"touch /tmp/.kube/config && echo '${kubeConfig?.stdout}' > /tmp/.kube/config"`,
]);

확장의 localStorage (Extension's localStorage)

localStorage는 브라우저 웹 저장소의 메커니즘 중 하나예요. 사용자가 브라우저에서 나중에 사용하기 위해 데이터를 키-값 쌍으로 저장할 수 있게 해줘요.

localStorage는 브라우저(확장 창)가 닫혀도 데이터를 지우지 않아요. 이는 확장에서 Docker Desktop의 다른 부분으로 이동할 때 데이터를 유지하는 데 이상적이에요.

localStorage.setItem("kubeconfig", kubeConfig);
localStorage.getItem("kubeconfig");

더 알아보기 (Learn more)