일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Prometheus install
- EFS CSI Driver
- 쿠버네티스
- 그라파나 시각화
- 솔데스크
- helm
- 그라파나 대시보드
- 쿠버네티스 컴포넌트
- grafana on kubernetes
- Kubernetes
- 메탈LB
- Firelens
- SAA 합격 후기
- 깃허브 액션
- Aurora cluster
- github action 사용법
- 로드밸런서 컨트롤러
- kubernetes 동작 원리
- livenessPorbe
- headless service
- terraform
- AWS 딥레이서
- Kubernets on Jenkins
- LoadBalancer Controller
- 딥레이서 보상함수
- jenkins
- EKS 클러스터
- blue-green
- 딥레이서
- Solution Architecture
mingming
Kubernetes Serive ( ClusterIP ) 본문
Kubernetes Service
동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공
Pod의 Label을 통해서 여러개의 Pod를 하나의 그룹으로 묶어 관리할 수 있습니다.
단일 진입점을 제공해 로드밸런싱의 기능을 할 수 있습니다.
Deploymet와 Service 연결
다음과 같이 Lables를 통해 deployment와 service를 연결시켜줄 수 있습니다. service에서 지정한 ip를 통해 접근하면 해당 deployment의 세개의 파드에 균등하게 로드밸런싱되어 접근할 수 있습니다.
Deployment-definition
apiVersion: v1
kind: Deployment
metadata:
name: webui
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx
Service-definition
apiVersion: v1
kind: Service
metadata:
name: webui-svc
spec:
clusterIP: 10.100.0.1
selector:
app: webui
ports:
- protocol: TCP
port: 80
targetPort: 80
Service Type
1. ClusterIP( default )
Pod 그룹의 단일 진입점 생성 ,클러스터 내부에서만 접근할 수 잇는 서비스를 생성합니다.
type 생략 시 default 값으로 10.96.0.0/12 범위에서 할당됩니다.
2. NodePort
모든 Worker Node에 외부에서 접속가능 한 포트가 예약되어 서비스를 외부로 노출 시킬 수 있습니다.
ClusterIP가 만들어진 후에 NodePort 할당
Default NodePort 범위 : 30000 ~ 32767
3. LoadBalancer
클라우드 인프라 혹은 오픈스택 클라우드에 적용
LoadBalancer를 자동으로 프로비전 하는 기능을 지원합니다.
4. ExternalName
클러스터 안에서 외부에 접속 시 사용할 도메인을 등록해서 사용
클러스터 도메인이 실제 되부 도메인으로 치환되어 동작
Service Type 실습
clusterip-nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service
spec:
type: ClusterIP
clusterIP: 10.100.100.100
selector:
app: webui
ports:
- protocol: TCP
port: 80
targetPort: 80
deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
nmae: webui
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
meatadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
kubectl apply -f clusterip-service.yaml
kubectl apply -f delployment-nginx.yaml
배포한 서비스와 파드가 실행중인지 확인해 줍니다.
kubectl get pods
kubectl get svc
webui-bd76d5967-6kgzp 1/1 Running 0 100s 10.44.0.5 worker <none> <none>
webui-bd76d5967-btqfq 1/1 Running 0 100s 10.44.0.7 worker <none> <none>
webui-bd76d5967-zh9xz 1/1 Running 0 100s 10.44.0.6 worker <none> <none>
root@master:~/sample_test# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
clusterip-service ClusterIP 10.100.100.100 <none> 80/TCP 6m34s
3개의 엔드포인트 즉 각각 Pod의 ip 주소를 엔드포인트로 갖고있는 것을 확인할 수 있습니다.
kubectl describe svc clusterip-service
root@master:~/sample_test# kubectl describe svc clusterip-service
Name: clusterip-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=webui
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.100.100.100
IPs: 10.100.100.100
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.44.0.5:80,10.44.0.6:80,10.44.0.7:80
Session Affinity: None
Events: <none>
현재는 각 파드에서 호스팅하는 웹페이지가 모두 같기 때문에 식별하기 어렵습니다. 따라서 각 파드 내부로 진입해 html을 수정 후 로드밸런싱이 되는지 확인해보도록 하겠습니다.
kubectl exec -it webui-bd76d5967-6kgzp -- bash -c 'echo "webui #1" > /usr/share/nginx/html/index.html'
kubectl exec -it webui-bd76d5967-btqfq -- bash -c 'echo "webui #2" > /usr/share/nginx/html/index.html'
kubectl exec -it webui-bd76d5967-zh9xz -- bash -c 'echo "webui #3" > /usr/share/nginx/html/index.html'
아래의 명령어로 100번 해당 url로 요청했을 때 각 파드에서 몇번 응답이 오는지 확인할 수 있습니다.
-s 옵션은 curl 명령의 출력 결과를 보여주지 않도록 하는 것이며, -q옵션은 진행 상황을 보여주지 않도록 하는 것입니다.
sort 명령어는 결과를 정렬하고, "uniq -c" 명령어는 중복된 결과를 제거하고 요청 횟수를 출력합니다. sort -nr 명령어는 요청 횟수를 내림차순으로 정렬합니다.
for i in {1..100}; do curl -s -q 10.100.100.100; done | sort | uniq -c | sort -nr
root@master:~/sample_test# for i in {1..100}; do curl -s -q 10.100.100.100; done | sort | uniq -c | sort -nr
35 webui #3
34 webui #1
31 webui #2
완벽하게 똑같은 횟수로 부하분산 되지는 않지만 어느정도 비슷하게 부하분산 되는 것을 확인할 수 있습니다. 랜덤으로 분산시키기 때문에 그런 것 같습니다.
deployment 의 replica수가 증가하게 되면, Service의 Endpoint 역시 증가하게 됩니다.
kubectl scale deployment webui --replicas=5
kubectl describe svc clusterip-service
root@master:~/sample_test# kubectl describe svc clusterip-service
Name: clusterip-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=webui
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.100.100.100
IPs: 10.100.100.100
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.44.0.5:80,10.44.0.6:80,10.44.0.7:80 + 2 more...
Session Affinity: None
Events: <none>
다음 글에선 NodePort 타입과 LoadBalancer 타입에 대해 알아보도록 하겠습니다.
'kubernetes' 카테고리의 다른 글
Kubernetes Headless Service (0) | 2023.09.27 |
---|---|
Kubernetes Service (NodePort , LoadBalancer) (2) | 2023.09.26 |
kubernetes node NotReady (1) | 2023.09.25 |
alertmanager & slack 연동 및 경보 (1) | 2023.09.25 |
grafana를 이용한 prometheus 메트릭 값 시각화 및 모니터링 (0) | 2023.09.24 |