티스토리 뷰

 

 

 

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>
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
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
글 보관함