2. CRI-O 와 Kubernetes 를 활용한 httpd 배포

반응형

2. CRI-O 와 Kubernetes 를 활용한 httpd 배포

 

1) httpd 설치

 

(control 노드에서)

httpd 이미지를 배포합니다.

# kubectl create deployment httpd --image=httpd
deployment.apps/httpd created

 

배포 명령 이후 진행상태가 이벤트 로그에 기록되므로 아래와 같이 출력해 볼 수 있습니다.

# kubectl get events |grep httpd
70s         Normal   Scheduled           pod/httpd-975f8444c-5xfch     Successfully assigned default/httpd-975f8444c-5xfch to sysdocu-189114
70s         Normal   Pulling             pod/httpd-975f8444c-5xfch     Pulling image "httpd"
58s         Normal   Pulled              pod/httpd-975f8444c-5xfch     Successfully pulled image "httpd" in 11.734922345s (11.734929076s including waiting)
58s         Normal   Created             pod/httpd-975f8444c-5xfch     Created container httpd
58s         Normal   Started             pod/httpd-975f8444c-5xfch     Started container httpd
70s         Normal   SuccessfulCreate    replicaset/httpd-975f8444c    Created pod: httpd-975f8444c-5xfch
70s         Normal   ScalingReplicaSet   deployment/httpd              Scaled up replica set httpd-975f8444c to 1

 

httpd 배포 정보를 확인합니다.

# kubectl describe deployment httpd

 

2) yaml 파일 생성 및 배포

 

httpd 리소스 템플릿 파일을 생성합니다.

# kubectl get deployment httpd -o yaml > httpd.yaml

 

생성된 httpd.yaml 파일을 열어 포트를 추가합니다.

# vi httpd.yaml

...
    spec:
      containers:
      - image: httpd
        imagePullPolicy: Always
        name: httpd
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
...

 

수정된 yml 파일을 기본 httpd 템플릿으로 갱신 (over write) 합니다.

# kubectl replace -f httpd.yaml

deployment.apps/httpd replaced

 

갱신 시간으로 이미지 업데이트 내역을 확인 할 수 있습니다.

# kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
httpd   1/1     1            1           11m

 

# kubectl expose deployment/httpd
service/httpd exposed

 

클러스터 httpd 서비스 IP 를 출력합니다.

# kubectl get svc httpd
NAME    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
httpd   ClusterIP   10.99.72.96   <none>        80/TCP    5m24s

 

출력된 클러스터 IP 로 httpd 접근 확인이 가능합니다.

# curl 10.99.72.96:80
<html><body><h1>It works!</h1></body></html>

엔드포인트 httpd 서비스 IP 출력합니다.

# kubectl get ep httpd
NAME    ENDPOINTS         AGE
httpd   10.101.0.195:80   5m51s

 

출력된 엔드포인트 IP 로 httpd 접근 확인이 가능합니다.

# curl 10.101.0.195:80

<html><body><h1>It works!</h1></body></html>

 

3) httpd 스케일 아웃 (Replica)

 

httpd 의 replica 를 3으로 조정하면 3개의 POD 가 생성된 것을 확인 할 수 있습니다.

# kubectl scale deployment httpd --replicas=3
deployment.apps/httpd scaled

 

복제되는 과정에서 시간이 약간 걸리며 watch 명령으로 모니터링을 해보면 아래와 같이 Ready 와 AVAILABLE 값이 3까지 늘어나는 것이 보입니다.

# watch kubectl get deployment httpd
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
httpd   3/3     3            3           15h

 

엔드포인트도 POD 개수대로 늘어난 것을 확인할 수 있습니다.

# kubectl get ep httpd
NAME    ENDPOINTS                                        AGE
httpd   10.101.0.129:80,10.101.0.195:80,10.101.0.67:80   41m

 

이제는 POD 를 삭제해도 replica 개수 3 으로 유지 (자동 생성) 됩니다.

클러스터 IP 로 접근을 해보면 3개의 POD 로 분산되어 접근되는 것을 확인할 수 있습니다.

 

4) 클러스터 외부에서 접근 허용 설정

 

현재의 POD 정보 입니다.

# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
httpd-56b65865c4-74zxp   1/1     Running   0          15h
httpd-56b65865c4-b8phd   1/1     Running   0          10m
httpd-56b65865c4-dkjdc   1/1     Running   0          10m

 

NAME 값을 이용하여 POD 의 환경 설정값을 확인합니다.

# kubectl exec httpd-56b65865c4-74zxp -- printenv |grep KUBERNETES
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443

 

현재의 서비스 정보 입니다.

# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
httpd        ClusterIP   10.99.72.96   <none>        80/TCP    51m
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   18h

 

외부에서 접근이 가능하도록 svc 값을 삭제하고 LoadBalancer 형태로 다시 생성해 줍니다.

# kubectl delete svc httpd
service "httpd" deleted


# kubectl expose deployment httpd --type=LoadBalancer
service/httpd exposed

 

다시 svc 정보를 출력해보면 httpd 가 LoadBalancer 형태로 생성되었으며, EXTERNAL-IP 는 없는 상태입니다.

# kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
httpd        LoadBalancer   10.96.23.114   <pending>     80:31452/TCP   2m29s
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP        18h

 

웹브라우저를 통해 새로 생성된 포트로 접근을 해보면 httpd 초기 페이지가 출력되며, 3개의 POD 로 분산 접근이 됩니다.

http://<서버 공인 IP>:31452

 

[참조] https://blog.psnote.co.kr/184

 

 

반응형

댓글()