쿠버네티스 API로 클러스터 접근하기
쿠버네티스 API로 클러스터 접근하기 (Access Clusters Using the Kubernetes API)
이 페이지는 쿠버네티스 API를 사용해 클러스터에 접근하는 방법을 보여 줘요.
출처: 문서
본문
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 설정돼 있어야 해요. 이 튜토리얼은 제어 플레인 호스트 역할을 하지 않는 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 사용하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용해 만들 수 있어요.
- iximiuz Labs
- Killercoda
- KodeKloud
버전을 확인하려면 kubectl version을 입력하세요.
쿠버네티스 API 접근하기
kubectl로 처음 접근하기
쿠버네티스 API에 처음 접근할 때는 쿠버네티스 명령줄 도구인 kubectl을 사용하세요.
클러스터에 접근하려면 클러스터의 위치를 알고 접근할 자격 증명이 필요해요. 보통 이것은 '시작하기(Getting started)' 가이드를 따라 작업할 때 자동으로 설정되거나, 다른 사람이 클러스터를 설정하고 자격 증명과 위치를 제공했을 때 설정돼요.
kubectl이 알고 있는 위치와 자격 증명을 다음 명령으로 확인하세요.
kubectl config view
많은 예시가 kubectl 사용을 소개해요. 전체 문서는 kubectl 매뉴얼에 있습니다.
REST API에 직접 접근하기
kubectl은 API 서버를 찾아내고 인증하는 것을 처리해요. curl이나 wget 같은 http 클라이언트, 또는 브라우저로 REST API에 직접 접근하고 싶다면, API 서버를 찾아내고 인증하는 여러 방법이 있어요.
- kubectl을 프록시 모드로 실행하기(권장). 이 방법은 저장된 API 서버 위치를 사용하고 자체 서명된 인증서로 API 서버의 신원을 검증하기 때문에 권장돼요. 이 방법으로는 중간자(MITM) 공격이 불가능해요.
- 또는 위치와 자격 증명을 http 클라이언트에 직접 제공할 수 있어요. 이는 프록시에 혼란을 겪는 클라이언트 코드에서 동작해요. 중간자 공격을 방지하려면 브라우저에 루트 인증서를 가져와야 해요.
Go 또는 Python 클라이언트 라이브러리를 사용하는 것은 kubectl을 프록시 모드로 접근하는 기능을 제공해요.
kubectl proxy 사용하기
다음 명령은 kubectl을 리버스 프록시 역할을 하는 모드로 실행해요. API 서버를 찾아내고 인증하는 것을 처리해요.
이렇게 실행하세요.
kubectl proxy --port=8080 &
자세한 내용은 kubectl proxy를 참고하세요.
그러면 다음과 같이 curl, wget, 또는 브라우저로 API를 탐색할 수 있어요.
curl http://localhost:8080/api/
출력은 다음과 비슷해요.
{
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
kubectl proxy 없이
kubectl proxy를 피하고 인증 토큰을 API 서버에 직접 전달할 수도 있어요. 이렇게요:
grep/cut 접근 방식 사용:
# 모든 가능한 클러스터를 확인하세요. .KUBECONFIG가 여러 컨텍스트를 가질 수 있습니다.
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
# 위 출력에서 상호작용하려는 클러스터의 이름을 선택하세요.
export CLUSTER_NAME="some_server_name"
# 클러스터 이름을 참조해 API 서버를 가리키세요.
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")
# 기본 서비스 계정의 토큰을 담을 secret을 만드세요.
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: default-token
annotations:
kubernetes.io/service-account.name: default
type: kubernetes.io/service-account-token
EOF
# 토큰 컨트롤러가 secret을 토큰으로 채울 때까지 기다리세요.
while ! kubectl describe secret default-token | grep -E '^token' >/dev/null; do
echo "waiting for token..." >&2
sleep 1
done
# 토큰 값을 얻으세요.
TOKEN=$(kubectl get secret default-token -o jsonpath='{.data.token}' | base64 --decode)
# TOKEN으로 API를 탐색하세요.
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
출력은 다음과 비슷해요.
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
위 예시는 --insecure 플래그를 사용해요. 이는 MITM 공격에 노출될 수 있게 해요. kubectl이 클러스터에 접근할 때는 저장된 루트 인증서와 클라이언트 인증서를 사용해 서버에 접근해요. (이들은 ~/.kube 디렉터리에 설치돼 있어요.) 클러스터 인증서는 보통 자체 서명되기 때문에, http 클라이언트가 루트 인증서를 사용하도록 특별한 구성이 필요할 수 있어요.
일부 클러스터에서는 API 서버가 인증을 요구하지 않아요. localhost에서 서비스되거나 방화벽으로 보호될 수 있어요. 이에 대한 표준은 없어요. '쿠버네티스 API 접근 제어'는 클러스터 관리자로서 이를 어떻게 구성할 수 있는지 설명해요.
API에 프로그래밍 방식으로 접근하기
쿠버네티스는 공식적으로 Go, Python, Java, dotnet, JavaScript, Haskell용 클라이언트 라이브러리를 지원해요. 쿠버네티스 팀이 아닌 작성자가 제공하고 유지 관리하는 다른 클라이언트 라이브러리도 있어요. 다른 언어에서 API에 접근하는 클라이언트 라이브러리와 인증 방법은 클라이언트 라이브러리 문서를 참고하세요.
Go 클라이언트
- 라이브러리를 얻으려면 다음 명령을 실행하세요:
go get k8s.io/client-go@kubernetes-<kubernetes-version-number>. 지원되는 버전은 https://github.com/kubernetes/client-go/releases 를 참조하세요. - client-go 클라이언트 위에 애플리케이션을 작성하세요.
참고:
Go 클라이언트는 kubectl CLI와 같은 kubeconfig 파일을 사용해 API 서버를 찾아내고 인증할 수 있어요. 다음 예시를 참고하세요.
package main
import (
"context"
"fmt"
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// kubeconfig의 현재 컨텍스트를 사용
// path-to-kubeconfig -- 예: /root/.kube/config
config, _ := clientcmd.BuildConfigFromFlags("", "<path-to-kubeconfig>")
// clientset 생성
clientset, _ := kubernetes.NewForConfig(config)
// 파드를 나열하도록 API에 접근
pods, _ := clientset.CoreV1().Pods("").List(context.TODO(), v1.ListOptions{})
fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
}
애플리케이션이 클러스터 안의 파드로 배포된다면 '파드 안에서 API에 접근하기'를 참고하세요.
Python 클라이언트
Python 클라이언트를 사용하려면 다음 명령을 실행하세요: pip install kubernetes. 더 많은 설치 옵션은 Python 클라이언트 라이브러리 페이지를 참고하세요.
Python 클라이언트는 kubectl CLI와 같은 kubeconfig 파일을 사용해 API 서버를 찾아내고 인증할 수 있어요. 다음 예시를 참고하세요.
from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
Java 클라이언트
Java 클라이언트를 설치하려면 다음을 실행하세요.
# java 라이브러리를 클론
git clone --recursive https://github.com/kubernetes-client/java
# 프로젝트 아티팩트, POM 등을 설치
cd java
mvn install
지원되는 버전은 https://github.com/kubernetes-client/java/releases 를 참조하세요.
Java 클라이언트는 kubectl CLI와 같은 kubeconfig 파일을 사용해 API 서버를 찾아내고 인증할 수 있어요. 다음 예시를 참고하세요.
package io.kubernetes.client.examples;
import io.kubernetes.client.ApiClient;
import io.kubernetes.client.ApiException;
import io.kubernetes.client.Configuration;
import io.kubernetes.client.apis.CoreV1Api;
import io.kubernetes.client.models.V1Pod;
import io.kubernetes.client.models.V1PodList;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.KubeConfig;
import java.io.FileReader;
import java.io.IOException;
/**
* kubernetes cluster 밖의 애플리케이션에서 Java API를 사용하는 방법의 간단한 예시
*/
public class KubeConfigFileClientExample {
public static void main(String[] args) throws IOException, ApiException {
// KubeConfig의 파일 경로
String kubeConfigPath = "~/.kube/config";
// 파일시스템의 kubeconfig인 out-of-cluster config 로딩
ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();
// 전역 기본 api-client를 위의 in-cluster 것으로 설정
Configuration.setDefaultApiClient(client);
// CoreV1Api는 전역 구성에서 기본 api-client를 로드
CoreV1Api api = new CoreV1Api();
// CoreV1Api 클라이언트 호출
V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
System.out.println("Listing all pods: ");
for (V1Pod item : list.getItems()) {
System.out.println(item.getMetadata().getName());
}
}
}
dotnet 클라이언트
dotnet 클라이언트를 사용하려면 다음 명령을 실행하세요: dotnet add package KubernetesClient --version 1.6.1. 더 많은 설치 옵션은 dotnet 클라이언트 라이브러리 페이지를 참고하세요. 지원되는 버전은 https://github.com/kubernetes-client/csharp/releases 를 참조하세요.
dotnet 클라이언트는 kubectl CLI와 같은 kubeconfig 파일을 사용해 API 서버를 찾아내고 인증할 수 있어요. 다음 예시를 참고하세요.
using System;
using k8s;
namespace simple
{
internal class PodList
{
private static void Main(string[] args)
{
var config = KubernetesClientConfiguration.BuildDefaultConfig();
IKubernetes client = new Kubernetes(config);
Console.WriteLine("Starting Request!");
var list = client.ListNamespacedPod("default");
foreach (var item in list.Items)
{
Console.WriteLine(item.Metadata.Name);
}
if (list.Items.Count == 0)
{
Console.WriteLine("Empty!");
}
}
}
}
JavaScript 클라이언트
JavaScript 클라이언트를 설치하려면 다음 명령을 실행하세요: npm install @kubernetes/client-node. 지원되는 버전은 https://github.com/kubernetes-client/javascript/releases 를 참조하세요.
JavaScript 클라이언트는 kubectl CLI와 같은 kubeconfig 파일을 사용해 API 서버를 찾아내고 인증할 수 있어요. 다음 예시를 참고하세요.
const k8s = require('@kubernetes/client-node');
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
k8sApi.listNamespacedPod({namespace: 'default'}).then((res) => {
console.log(res);
});
Haskell 클라이언트
지원되는 버전은 https://github.com/kubernetes-client/haskell/releases 를 참조하세요.
Haskell 클라이언트는 kubectl CLI와 같은 kubeconfig 파일을 사용해 API 서버를 찾아내고 인증할 수 있어요. 다음 예시를 참고하세요.
exampleWithKubeConfig :: IO ()
exampleWithKubeConfig = do
oidcCache <- atomically $ newTVar $ Map.fromList []
(mgr, kcfg) <- mkKubeClientConfig oidcCache $ KubeConfigFile "/path/to/kubeconfig"
dispatchMime
mgr
kcfg
(CoreV1.listPodForAllNamespaces (Accept MimeJSON))
>>= print