티스토리 뷰
LoadBalancer
● aws / gcp 같은 public cloud 에서는 기본적으로 쿠버네티스에서 loadbalancer 지원하지만,
로컬에 설치된 쿠버네티스는 오픈소스 프로젝트인 metal lb 를 설치해야 쿠버네티스에서 로드밸런서 타입을 사용 가능
◎ nginx 10 개를 외부에서 접속 가능하도록 생성
● deployment.yaml
# template 밑은 pod 를 만드는 것
[vagrant@ms backup]$ cat deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 10
selector:
matchLabels:
app: nginx
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 5
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.19
name: nginx
ports:
- containerPort: 80
○ 파드의 라벨을 확인한다
kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-5bd9d7bb49-6ds55 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-7s5dg 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-7sknx 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-d5vcs 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-gjwmz 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-glj82 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-hz8z8 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-rbwzt 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-sdvfx 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
nginx-5bd9d7bb49-xj4pp 1/1 Running 0 78s app=nginx,pod-template-hash=5bd9d7bb49
● nginx 서비스를 따로 올린다
# selector 체크
[vagrant@ms backup]$ cat my-ng-service.yml
---
apiVersion: v1
kind: Service
metadata:
name: myng-service
spec:
ports:
- port: 9001
targetPort: 80
selector:
app: nginx
type: NodePort
● 서비스 파일 실행
[vagrant@ms backup]$ kubectl apply -f my-ng-service.yml
○ 서비스 Endpoints / Port 확인
[vagrant@ms backup]$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myng-service NodePort 10.101.164.213 <none> 9001:32659/TCP 3m22s
kubectl describe service myng-service
● wk1 / wk2 / ms 3개의 장비 IP 로 접근한다
[ 10개의 컨테이너를 돌아가면서 부하 분산하여 접근된다 ]
# node:32659로 패킷 >> service 로 들어간다 >> selector label 확인 후 >>
>> 각 컨테이너로 Endpoints 의 port 번호로 구별하여 보낸다
# service 는 Endpoints 를 확인해서 교대로 ( Round Robin ) 보내준다
● 멀티 플레이 북으로 합쳐도 labels 를 인식해서 apply 로 자동으로 올라간다
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 10
selector:
matchLabels:
app: nginx
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 5
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.19
name: nginx
ports:
- containerPort: 80
...
---
apiVersion: v1
kind: Service
metadata:
name: myng-service
spec:
ports:
- port: 9001
targetPort: 80
selector:
app: nginx
type: NodePort
...
○ apply 로 올린다
[vagrant@ms backup]$ kubectl apply -f end-total.yml
[vagrant@ms backup]$ kubectl describe service
Name: myng-service
Namespace: myns
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.101.164.213
IPs: 10.101.164.213
Port: <unset> 9001/TCP
TargetPort: 80/TCP
NodePort: <unset> 32659/TCP
Endpoints: 10.244.1.56:80,10.244.1.57:80,10.244.1.58:80 + 8 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
예정 아마도
컨테이너 표시????????????
# Kubernetes 복습 / 정리 부분 확인
#################예정######################################
▷ 192.168.25.10 장비에 Dockerfile 과 entrypoint.sh 생성
[vagrant@docker1 kub]$ cat Dockerfile
FROM nginx
COPY ./entrypoint.sh /tmp
WORKDIR /tmp
CMD ./entrypoint.sh
[vagrant@docker1 kub]$ cat entrypoint.sh
nginx -g daemon off;
tail -n 1 /etc/hosts > /usr/share/nginx/html/index.html
>> 실행권한까지 복사될 것이므로, 755 권한 수정한다
[vagrant@docker1 kub]$ chmod 755 entrypoint.sh
[vagrant@docker1 kub]$ ll
total 8
-rw-rw-r--. 1 vagrant vagrant 72 Mar 8 14:57 Dockerfile
-rwxr-xr-x. 1 vagrant vagrant 77 Mar 8 15:00 entrypoint.sh
● 라운드로빈 형식으로 Node IP로 접속할 때마다 부하 분산 시켜준다
#####################################################################
◎ 한 파드 안에 있는 컨테이너들의 첫번째 랜카드가 pod IP 로 등록이 된다
▩ kubernetes 에서 command 는 대괄호를 붙인 exec 형식으로만 해야한다
>> 아니면 오류가 난다
---
apiVersion: v1
kind: Pod
metadata:
name: test
spect:
containers:
- name: first
image: httpd:2.4
- name: second
image: alpine
command: /bin/sleep 3600s
...
● 제대로 실행된다
---
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: first
image: httpd:2.4
- name: second
image: alpine
command: ["/bin/sleep","3600s"]
...
○ 전에 올라온 것들 제거
kubectl get pods
kubectl delete deployments.apps nginx
○ 파드가 2개가 올라와있다
[vagrant@ms work]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 147m
test 2/2 Running 0 68s
kubectl describe pod test
○ 확인을 위한 직접 접속
kubectl exec -it 파드이름 -- /bin/bash
[vagrant@ms work]$ kubectl exec -it test -- /bin/bash
Defaulted container "first" out of: first, second
root@test:/usr/local/apache2#
>> ip 가 파드 IP 이다
○ 이번엔 second 로 접속
# bash 가 없고 sh 로 접속한다
○ 파드의 IP가 들어가 있다
kubectl exec -it test -c second -- /bin/sh
>> 자기 자신의 주소로 떠있는데 first 인 아파치로 접속된다
/ # apk add curl
/ # curl 10.244.1.62
<html><body><h1>It works!</h1></body></html>
>> loopback 아이피로도 first 인 아파치로 접속된다
/ # curl 127.0.0.1
<html><body><h1>It works!</h1></body></html>
'Kubernetes [ 쿠버네티스 ]' 카테고리의 다른 글
Kubernetes 복습 / 정리 (0) | 2024.03.11 |
---|---|
Kubernetes 시작 전 점검 사항 (0) | 2024.03.11 |
Kubernetes deployment (0) | 2024.03.08 |
Kubernetes 상위 오브젝트와 리소스 (0) | 2024.03.08 |
Kubernetes - replica 설정 변경 3가지 방법 (0) | 2024.03.08 |