- pod는 일회성
- 여러 pod가 단일 서비스를 제공할 경우, (클라이언트 입장에서)모든 pod는 단일 ip 주소를 통해 액세스 할 수 있어야 한다.
Kubernetes Service
- 동일한 서비스를 제공하는 pod group 에 단일 진입 점을 만들기 위해 생성하는 리소스
- 각 서비스에는 서비스가 존재하는 동안 절대로 변경되지 않는 ip 주소와 port 가 있다.
클라이언트는 해당 IP 및 포트에 연결할 수 있고, 이런 연결은 해당 서비스를 지원하는 pod 중 하나로 라우팅 된다.
- 서비스는 오직 단일 port 뿐만 아니라, 여러개의 port 도 지원할 수 있다.
[Service의 주 목적 ]
포드들의 그룹을 클러스터상의 포드에게 노출하는것.
- 원격접속
$kubectl exec [pod명]
- Client 로 부터 받은 요청을 매번 같은 pod로 요청하고 싶으면, sessionAffinity 속성을 ClientIP 로 하면 된다.
spec:
sessionAffinity: ClientIP (None 으로 하는 경우는 랜덤하게 됨)
- 포드의 환경변수 확인
$kubectl exec [포드명] env
- pod 안으로 들어가기
$kubectl exec -it [pod명] bash
- 클러스터 외부 서비스에 연결
. 서비스는 pod를 직접 링크하지 않음
. 서비스와 pod 사이에 endpoint라는 리소스가 위치함
. endpoint는 서비스에 의해 노출되는 IP주소와 PORT의 목록임
- 서비스에 대한 상세정보 확인
$kubectl describe svc [서비스명]
- 서비스의 endpoint 확인
$kubectl get endpoints [서비스명]
- pod Selector 는 들어오는 연결을 리다이렉트할때 직접 사용되진 않고, ip와 port의 목록을 만드는데 사용된다.
그리고 이 만들어진 목록이 endpoint에 저장된다.
- pod Selector 없이 서비스를 만들었다면, 쿠버네티스는 endpoint 리소스 조차 만들지 못한다.
- 서비스가 외부에서 Access 가능하게 하는 방법
1) NodePort 서비스 사용
. 서비스를 생성하고 타입을 NodePort 로 지정
- jsonPath 를 이용해 모든 노드의 ip 얻기
$kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
2) 외부 로드밸런서를 이용한 서비스 사용
. 서비스 타입을 LoadBalancer 로 지정
. 로드밸런서는 자신만의 고유하면서 외부에서 액세스가 가능한 ip 주소를 갖고 모든 연결을 서비스로 리다이렉트 한다.
- externalTrafficPolicy
: 외부 클라이언트가 서비스로 노드포트를 통해 연결할 때, 임의로 선택된 pod는 연결요청을 받았던 같은 node에서 실행될 수도 아닐수도 있다.
이를 요청받은 노드에 있는 pod에서 실행되도록 하기 위해 서비스 spec 에 externalTrafficPolicy: Local 을 지정하면 , 로컬내에서 실행되고 있는 pod를 호출하게 된다.
단, 로컬에 pod가 없으면 대기한다.
그리고, 이렇게 연결할때 단점은, 일반적으로의 연결은 모든 pod에 걸쳐 전달되지만 이렇게 구성하면 모든 pod 가 되지 않는다.
3) Ingress 리소스를 이용한 방법
. 필요한 이유 : 각 loadbalancer 서비스는 그 자신만의 외부 ip를 갖는 자체 로드밸런서를 요구하기 때문
. Ingress 리소스를 작동시키려면, 클러스터에서 Ingress 컨트롤러를 실행해야 한다.
- 모든 네임스페이스의 pod 조회
$kubectl get po --all-namespaces
'DevOps' 카테고리의 다른 글
pod-레플리케이션컨트롤러-서비스 (0) | 2019.01.10 |
---|---|
쿠버네티스 명령어#5 (0) | 2019.01.02 |
Docker 명령어 (0) | 2018.12.28 |
쿠버네티스 명령어#3 (0) | 2018.12.27 |
쿠버네티스 명령어 #2 (0) | 2018.12.27 |