클러스터에서 실행되는 서비스에 접근하기
클러스터에서 실행되는 서비스에 접근하기 (Access Services Running on Clusters)
이 페이지에서는 쿠버네티스 클러스터에서 실행되는 서비스에 연결하는 방법을 보여드려요.
출처: 문서
본문
시작하기 전에 (Before you begin)
쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.
- iximiuz Labs
- Killercoda
- KodeKloud
버전을 확인하려면 kubectl version을 입력하세요.
클러스터에서 실행되는 서비스에 접근하기 (Accessing services running on the cluster)
쿠버네티스에서 노드, 파드, 서비스는 모두 고유한 IP를 가져요. 많은 경우 클러스터의 노드 IP, 파드 IP, 일부 서비스 IP는 라우팅이 되지 않아서, 데스크톱 컴퓨터 같은 클러스터 밖의 머신에서 접근할 수 없어요.
연결 방법 (Ways to connect)
클러스터 외부에서 노드, 파드, 서비스에 연결하는 데는 여러 옵션이 있어요.
- 공용 IP로 서비스에 접근하기.
NodePort또는LoadBalancer유형의 Service를 사용해 서비스를 클러스터 외부에서 접근 가능하게 만드세요. services 및 kubectl expose 문서를 참고하세요.- 클러스터 환경에 따라 이 서비스가 회사 네트워크에만 노출될 수도 있고 인터넷에 노출될 수도 있어요. 노출되는 서비스가 안전한지 생각해 보세요. 자체적으로 인증을 수행하나요?
- 복제본 집합의 특정 파드 하나에 접근하려면(예: 디버깅용), 파드에 고유 라벨을 붙이고 이 라벨을 선택하는 새 서비스를 만드세요.
- 대부분의 경우 애플리케이션 개발자가 nodeIP로 노드에 직접 접근할 필요는 없어야 해요.
- Proxy Verb로 서비스, 노드, 파드에 접근하기. 원격 서비스에 접근하기 전에 apiserver 인증과 인가를 수행해요. 서비스가 인터넷에 노출하기에 충분히 안전하지 않을 때, 노드 IP의 포트에 접근해야 할 때, 또는 디버깅할 때 사용하세요.
- 프록시는 일부 웹 애플리케이션에 문제를 일으킬 수 있어요.
- HTTP/HTTPS에서만 동작해요.
- 여기에서 설명하고 있어요.
- 클러스터의 노드나 파드에서 접근하기. 파드를 실행하고 kubectl exec로 셸에 연결하세요. 그 셸에서 다른 노드, 파드, 서비스에 연결하세요.
- 일부 클러스터는 클러스터의 노드로 ssh 접속을 허용할 수도 있어요. 거기에서 클러스터 서비스에 접근할 수 있을 거예요. 이것은 비표준적인 방법이며, 일부 클러스터에서는 동작하지만 다른 클러스터에서는 동작하지 않아요. 브라우저나 다른 도구가 설치되어 있을 수도 있고 없을 수도 있어요. 클러스터 DNS는 동작하지 않을 수 있어요.
내장 서비스 발견하기 (Discovering builtin services)
일반적으로 kube-system이 클러스터에서 시작하는 몇 가지 서비스가 있어요. kubectl cluster-info 명령으로 이 목록을 얻을 수 있어요.
kubectl cluster-info
출력은 다음과 비슷해요.
Kubernetes master is running at https://192.0.2.1
elasticsearch-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy
kibana-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kibana-logging/proxy
coredns is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kube-dns/proxy
grafana is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
heapster is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy
이것은 각 서비스에 접근하기 위한 proxy-verb URL을 보여줘요. 예를 들어 이 클러스터는 Elasticsearch를 사용하는 클러스터 레벨 로깅이 활성화돼 있는데, 적절한 자격 증명을 전달하면 https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/로 접근할 수 있고, kubectl proxy를 통해서는 예를 들어 http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/로 접근할 수 있어요.
참고: 자격 증명을 전달하거나 kubectl proxy를 사용하는 방법은 "쿠버네티스 API를 사용해 클러스터에 접근하기"를 참고하세요.
apiserver 프록시 URL 직접 구성하기 (Manually constructing apiserver proxy URLs)
앞서 언급했듯이 kubectl cluster-info 명령을 사용해 서비스의 프록시 URL을 검색해요. 서비스 엔드포인트, 접미사, 매개변수를 포함하는 프록시 URL을 만들려면 서비스의 프록시 URL에 추가하세요: http://<kubernetes_master_address>/api/v1/namespaces/<namespace_name>/services/<service_name>/proxy
포트 이름을 지정하지 않았다면 URL에 port_name을 지정할 필요가 없어요. 이름이 있는 포트와 없는 포트 모두 포트 번호를 port_name 대신 사용할 수도 있어요.
기본적으로 API 서버는 HTTP를 사용해 여러분의 서비스로 프록시해요. HTTPS를 사용하려면 서비스 이름 앞에 https:를 붙이세요: http://<kubernetes_master_address>/api/v1/namespaces/<namespace_name>/services/<service_name>/proxy
URL의 <service_name> 세그먼트에 지원되는 형식은 다음과 같아요.
<service_name>— 기본 또는 이름이 없는 포트로 http를 사용해 프록시<service_name>:<port_name>— 지정된 포트 이름이나 포트 번호로 http를 사용해 프록시https:<service_name>:— 기본 또는 이름이 없는 포트로 https를 사용해 프록시 (끝의 콜론에 주의)https:<service_name>:<port_name>— 지정된 포트 이름이나 포트 번호로 https를 사용해 프록시
예시 (Examples)
Elasticsearch 서비스 엔드포인트 _search?q=user:kimchy에 접근하려면:
http://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy
Elasticsearch 클러스터 헬스 정보 _cluster/health?pretty=true에 접근하려면:
https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true
헬스 정보는 다음과 비슷해요.
{
"cluster_name" : "kubernetes_logging",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 5,
"active_shards" : 5,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 5
}
https Elasticsearch 서비스 헬스 정보 _cluster/health?pretty=true에 접근하려면:
https://192.0.2.1/api/v1/namespaces/kube-system/services/https:elasticsearch-logging:/proxy/_cluster/health?pretty=true
웹 브라우저로 클러스터에서 실행되는 서비스에 접근하기 (Using web browsers to access services running on the cluster)
apiserver 프록시 URL을 브라우저의 주소 표시줄에 넣을 수도 있을 거예요. 하지만:
- 웹 브라우저는 보통 토큰을 전달할 수 없어서 basic(비밀번호) 인증이 필요할 수 있어요. Apiserver는 basic auth를 받아들이도록 구성될 수 있지만, 클러스터가 basic auth를 받아들이도록 구성되지 않았을 수 있어요.
- 일부 웹 앱은 동작하지 않을 수 있어요. 특히 프록시 경로 접두사를 인식하지 못하는 방식으로 URL을 구성하는 클라이언트 측 JavaScript를 가진 앱이 그래요.