Kubernetes: 엔드포인트란?
일반적으로 Kubernetes 배포 뒤에 "숨겨진"ReplicaSets과 유사하게 내부에서 작업하기 때문에 Kubernetes Services를 사용할 때 Endpoints 개체를 볼 수 없습니다.
쿠버네티스 서비스
따라서 Service은 라벨을 사용하여 트래픽을 라우팅할 포드를 선택하는 Kubernetes 추상화입니다. Kubernetes: ClusterIP vs NodePort vs LoadBalancer, Services, and Ingress — an overview with examples 및 Kubernetes: Service, load balancing, kube-proxy, and iptables을 참조하세요.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
서비스의
selector
, 위 예의 app=MyApp
와 일치하는 레이블이 있는 새 포드가 클러스터에 표시되자마자 서비스가 트래픽을 전송하기 시작합니다.이는 이 포드의 IP 주소를 이 서비스의 엔드포인트 목록에 추가하여 달성됩니다.
간단한 예제를 만들어 보겠습니다.
--------
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
--------
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
여기서는 NGINX로 포드를 만들고 기본 유형
ClusterIP
으로 서비스를 만듭니다.매니페스트를 적용합니다.
$ kubectl apply -f svc-example.yaml
pod/nginx-pod created
service/nginx-svc created
서비스 확인:
$ kubectl get service nginx-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 172.20.69.253 <none> 80/TCP 26s
쿠버네티스 엔드포인트
이제 자세히 살펴보겠습니다.
$ kubectl describe service nginx-svc
Name: nginx-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: ClusterIP
IP Families: <none>
IP: 172.20.69.253
IPs: <none>
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.21.56.143:80
결국 이 서비스의 엔드포인트, 즉 포드의 IP가 될 수 있습니다.
이 포드를 확인하십시오.
$ kubectl describe pod nginx-pod
Name: nginx-pod
Namespace: default
Priority: 0
Node: ip-10–21–49–33.us-east-2.compute.internal/10.21.49.33
Start Time: Sat, 13 Mar 2021 08:37:55 +0200
Labels: app=nginx
Annotations: kubernetes.io/psp: eks.privileged
Status: Running
IP: 10.21.56.143
…
다음은 위에서 언급한 IP입니다.
이제 전용 API 개체이며 서비스 및 포드와 동일한 방식으로 관찰할 수 있는 Ednpointd를 확인하겠습니다.
$ kubectl get endpoints nginx-svc
NAME ENDPOINTS AGE
nginx-svc 10.21.56.143:80 18m
매니페스트 파일에서 추가 개체로 설명하거나 배포를 생성하여 동일한 라벨을 가진 다른 포드를 추가하는 경우 해당 포드는 서비스의 엔드포인트로 추가됩니다.
--------
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
--------
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
배포 만들기:
$ kubectl apply -f svc-example.yaml
deployment.apps/nginx-deploy created
service/nginx-svc unchanged
끝점을 확인합니다.
$ kubectl get endpoints nginx-svc
NAME ENDPOINTS AGE
nginx-svc 10.21.37.55:80,10.21.54.174:80,10.21.56.143:80 21m
여기에서 이전 포드의 10.21.56.143:80과 위 배포의
replicas
에 지정된 포드의 두 개의 새 포드를 볼 수 있습니다.--selector를 사용하여 해당 포드를 찾으십시오. 마찬가지로 서비스는 포드를 찾아 엔드포인트에 추가합니다.
$ kubectl get pod --selector=app=nginx -o wide
NAME READY STATUS RESTARTS AGE IP
nginx-deploy-7fcd954c94-gbm6d 1/1 Running 0 2m28s 10.21.54.174
nginx-deploy-7fcd954c94-mg8kr 1/1 Running 0 2m28s 10.21.37.55
nginx-pod 1/1 Running 0 23m 10.21.56.143
커스텀 엔드포인트
또한 원하는 리소스를 가리키는 사용자 지정 끝점을 만들 수도 있습니다.
예를 들어 새 서비스를 설명합니다.
kind: Service
apiVersion: v1
metadata:
name: external-svc
spec:
ports:
- name: web
protocol: TCP
port: 80
targetPort: 80
이 경우
selector
필드를 추가하지 않았다는 점에 유의하십시오.그리고 Endpoints 개체를 설명합니다.
kind: Endpoints
apiVersion: v1
metadata:
name: external-svc
subsets:
- addresses:
- ip: 139.59.205.180
ports:
- port: 80
name: web
여기:
name
: 서비스와 동일해야 함addresses
: 트래픽을 보낼 주소, 이 예에서는 rtfm.co.ua이 떠나는 DigitalOcean 클라우드에 있는 서버의 IP 주소이지만 서비스가 다음과 같이 그들 사이에서 로드 밸런싱을 수행하도록 곱하기 주소를 설정할 수 있습니다. Kubernetes: Service, load balancing, kube-proxy, and iptables에 설명된ports.port
및 ports.name
도 해당 서비스생성:
$ kubectl apply -f external-endpoint.yaml
service/external-svc created
endpoints/external-svc created
Check the Service and its Endpoints:
kubectl describe svc external-svc
Name: external-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP Families: <none>
IP: 172.20.45.77
IPs: <none>
Port: web 80/TCP
TargetPort: 80/TCP
Endpoints: 139.59.205.180:80
포드를 실행하여 이 서비스가 작동하는지 확인합니다.
$ kubectl run pod — rm -i — tty — image ubuntu — bash
이 포드에
curl
를 설치합니다.root@pod:/# apt update && apt -y install curl
그리고 이름으로 서비스를 확인하십시오.
root@pod:/# curl -Ls external-svc | grep \<title\>
<title>RTFM: Linux, DevOps, and system administration</title>
또는 해당 FQDN을 사용하여:
root@pod:/# curl -Ls external-svc.default.svc.cluster.local | grep \<title\>
<title>RTFM: Linux, DevOps, and system administration</title>
외부 이름
외부 리소스에 액세스하는 또 다른 솔루션은 externalName 유형의 서비스를 사용하는 것입니다.
--------
apiVersion: v1
kind: Service
metadata:
name: rtfm-service
spec:
ports:
- port: 80
type: ExternalName
externalName: rtfm.co.ua
적용 및 확인:
$ root@pod:/# curl -Ls rtfm-service | grep \<title\>
<title>RTFM: Linux, DevOps, and system administration</title>
완료.
RTFM: Linux, DevOps и системное администрирование에 원래 게시되었습니다.
Reference
이 문제에 관하여(Kubernetes: 엔드포인트란?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/setevoy/kubernetes-what-are-endpoints-1l04텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)