Openshift 4.12.0 응용프로그램 관리 (Pod, Deployment, Service), 스케일아웃 (Replica), 로드발란서 (LoadBalancer) 설정

리눅스/OpenShift|2023. 2. 15. 13:35
반응형

본 문서는 공식 Documents 를 참고하여 작성하였습니다.

https://docs.openshift.com/container-platform/4.12/applications/index.html

https://docs.openshift.com/container-platform/4.12/networking/configuring_ingress_cluster_traffic/configuring-ingress-cluster-traffic-load-balancer.html

 

응용프로그램을 생성하고 관리하는 방법에 대해 기술합니다.

응용프로그램은 프로젝트 내에서 생성되고 가동 되므로 프로젝트 관리부터 시작합니다.

 

 

1. 프로젝트 관리

 

1) 프로젝트 생성

관리자 권한으로 변경합니다.

# export KUBECONFIG=/root/installation_directory/auth/kubeconfig

# oc whoami

system:admin

 

project412 라는 프로젝트를 생성합니다.

# oc new-project project412 --description="This is an example project" --display-name="Hello OpenShift"

 

프로젝트 리스트를 확인합니다.

# oc get projects

 

생성한 프로젝트를 선택합니다.

# oc project project412

 

현재 프로젝트의 상태를 출력합니다.

# oc status

 

* 참고 : 현재 프로젝트에서 다른 프로젝트로 변경

# oc project <프로젝트명>

 

* 참고 : 다른 사용자로 프로젝트 생성

# oc new-project <프로젝트명> --as=<사용자명> --as-group=system:authenticated --as-group=system:authenticated:oauth

 

다음은 project412 프로젝트를 수정하고 삭제하는 방법이지만,

예제를 계속 이어나가기 위해 참고로만 알아두고 건너뜁니다.

 

2) 프로젝트 수정

기본 프로젝트 템플릿을 생성합니다.

# oc adm create-bootstrap-project-template -o yaml > template.yaml

 

수정 후 적용 (예 : openshift-config 프로젝트)

# oc create -f template.yaml -n openshift-config

 

3) 프로젝트 삭제

# oc delete project project412

 

 

2. 응용프로그램 생성

 

응용프로그램 생성 방식에는 여러 가지가 있습니다.

- Git 저장소를 통해 생성하는 방법

- Docker 이미지를 통해 생성하는 방법

- Template 를 통해 생성하는 방법

 

여기에서는 Docker image 를 받아서 응용프로그램으로 배포하는 방식을 설명하겠습니다.

 

1) 응용프로그램 생성 (배포)

도커 이미지를 다운로드 하기 위해 docker 패키지를 설치합니다.

# yum -y install docker

 

docker 데몬이 가동되어 있어야 다운로드가 됩니다.

# systemctl enable docker

# systemctl start docker

 

nginx 응용프로그램을 배포해보겠습니다.

nginx 최신 버전을 다운로드 합니다.
# docker pull nginx:latest

 

Openshift 에서 응용프로그램 생성은 oc new-app 명령을 이용합니다.

이 방식을 사용하면 어플리케이션을 생성할때 Deployment 와 Service 가 함께 생성됩니다.

# oc new-app docker.io/nginx:latest

 

응용프로그램 생성이 잘 되었는지 확인합니다.

생성은 되었으나 사용할 준비가 되지 않았고, CrashLoopBackOff 상태인 것이 확인됩니다.

# oc get pods
NAME                     READY   STATUS             RESTARTS     AGE
nginx-5fb558b844-qg99g   0/1     CrashLoopBackOff   1 (2s ago)   9s

 

로그를 확인합니다.

# oc logs nginx-5fb558b844-qg99g

...

2023/02/16 23:04:53 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
2023/02/16 23:04:53 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)
nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)

 

에러가 출력되면 Pod, Deployment, Service 를 지우고, Security Context Constraints 권한을 부여한뒤 다시 설치하면 됩니다.

# oc delete pod nginx-5fb558b844-qg99g

# oc delete deployment nginx

# oc delete service nginx

oc adm policy add-scc-to-user anyuid -z default
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "default"

 

다시 설치를 해봅니다.

# oc new-app docker.io/nginx:latest

 

nginx 가 정상 구동 된것을 확인하였습니다.

# oc get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5fb558b844-jp4jt   1/1     Running   0          11s

 

설치가 다 되었으므로 위에서 주었던 권한을 제거 합니다.

oc adm policy remove-scc-from-user anyuid -z default
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid removed: "default"

 

--------------------------------------------------

* 참고 : MySQL 설치시 에러가 발생할때

MySQL 설치시 에러가 출력되는데 이는 다음과 같이 해결이 가능합니다.

# oc new-app docker.io/mysql:latest

# oc get pods
NAME                     READY   STATUS             RESTARTS      AGE
mysql-cb5c58bfc-n2zmq   0/1     CrashLoopBackOff   4 (28s ago)   2m5s

# oc logs mysql-cb5c58bfc-n2zmq
2023-02-16 00:19:35+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started.
2023-02-16 00:19:35+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following as an environment variable:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

 

데이터베이스가 초기화되지 않았으며 암호 옵션이 지정되지 않았다고 합니다.

Pod, Deployment, Service 를 지우고, 아래와 같이 환경 변수를 포함하여 MySQL 응용프로그램을 다시 배포 합니다.

# oc delete pod mysql-cb5c58bfc-n2zmq

# oc delete deployment mysql

# oc delete service mysql

# oc new-app docker.io/mysql:latest -e MYSQL_ROOT_PASSWORD=<mysql root 패스워드>

 

* 참고 : 컨테이너 환경 변수 확인

# oc set env pod <Pod 이름> --list
# pods/mysql-bd544cdb8-2w8dz, container mysql
MYSQL_ROOT_PASSWORD=12345678

--------------------------------------------------

 

2) 응용프로그램 삭제 

응용프로그램을 삭제할때는 Pod 와 Deployment, Service 까지 지워줍니다.

 

(1) Pod 확인 후 삭제

# oc get pods
NAME                    READY   STATUS             RESTARTS      AGE
mysql-cb5c58bfc-n2zmq   0/1     CrashLoopBackOff   3 (34s ago)   90s

# oc delete pod mysql-cb5c58bfc-n2zmq
pod "mysql-cb5c58bfc-n2zmq" deleted

 

(2) Deployments 확인 후 삭제

# oc get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
mysql   0/1     1            0           30m
# oc delete deployments mysql
deployment.apps "mysql" deleted

 

(3) Service 확인 후 삭제

# oc get services
NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
mysql   ClusterIP  172.30.186.165   <none>        3306/TCP,33060/TCP   26m
# oc delete service mysql
service "mysql" deleted

 

3) 응용프로그램 컨테이너 접근

컨테이너 쉘을 통하여 nginx 서비스에 접근하는 방법입니다. (rsh : remote shell)

# oc rsh nginx-5fb558b844-jp4jt

# hostname
nginx-5fb558b844-jp4jt

# pwd
/
# whoami
root

 

4) 라우팅 설정

외부에서 컨테이너 접근이 가능하도록 포트를 노출시킵니다.

뒤에 --port 80 옵션은 추가하지 않아도 컨테이너의 열려진 포트로 자동 설정됩니다.

# oc expose service nginx --port 80
route.route.openshift.io/nginx exposed
# oc get route
NAME    HOST/PORT                               PATH   SERVICES   PORT   TERMINATION   WILDCARD
nginx   nginx-project412.apps.az1.sysdocu.kr           nginx      80                   None

 

출력된 호스트명과 포트로 서비스 접근을 확인합니다.

# curl --head nginx-project412.apps.az1.sysdocu.kr

HTTP/1.1 200 OK
server: nginx/1.23.3
date: Thu, 16 Feb 2023 23:19:57 GMT
content-type: text/html
content-length: 615
last-modified: Tue, 13 Dec 2022 15:53:53 GMT
etag: "6398a011-267"
accept-ranges: bytes
set-cookie: 7769a7256fe4dda43770015df5735002=e53f29e3aa14fd7cc39e7efd9f5e8535; path=/; HttpOnly
cache-control: private

 

 

3. 스케일 아웃 (Replica)

 

1) Pod 복제

스케일 아웃은 성능 향상 및 부하 분산을 위해 사용하며, 동일한 Pod 가 복제 구성 되어집니다.

위에서 경험했듯 nginx 는 Pod 생성 전에 SCC 권한을 부여해야 합니다.

그리고 replica 를 2 로 조정하면 2개의 Pod 가 자동 생성되어집니다.

# oc adm policy add-scc-to-user anyuid -z default

# oc scale deployment nginx --replicas=2
deployment.apps/nginx scaled

 

복제되는 과정에서 컨테이너 양만큼 시간이 소요되며 모니터링을 해보면 아래와 같이 Ready 와 AVAILABLE 값이 2까지 늘어나는 것이 보입니다.

# oc get deployment nginx

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           17m

 

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

# oc get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5fb558b844-8nz5f   1/1     Running   0          2m7s
nginx-5fb558b844-jp4jt   1/1     Running   0          19m

 

# oc get ep nginx
NAME    ENDPOINTS                       AGE
nginx   10.128.2.56:80,10.131.1.42:80   19m

 

Pod 가 추가 생성이 확인 되었으므로 SCC 권한을 제거 합니다.

oc adm policy remove-scc-from-user anyuid -z default

 

Pod 하나를 삭제 해보세요. 또다른 이름의 Pod 가 자동 생성되어 replica 개수 2 로 유지하는 것을 볼 수 있습니다.

 

2) 클러스터 접근 허용 설정

현재의 서비스 정보에서 nginx type 이 ClusterIP 로 되어있습니다.

# oc get service
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   172.30.252.2   <none>        80/TCP    20m

 

기존 서비스를 삭제하고 LoadBalancer 형태로 다시 생성해 줍니다.

# oc delete service nginx
service "nginx" deleted

 

# oc expose deployment nginx --type=LoadBalancer --port 80
service/nginx exposed

 

다시 서비스 정보를 출력해보면 nginx 가 LoadBalancer 형태로 바뀌었습니다.

# oc get service
NAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx   LoadBalancer   172.30.167.95   <pending>     80:31574/TCP   31s

 

(이부분 생략, 위에서 했었음)

외부에서 컨테이너 접근이 가능하도록 포트를 노출시킵니다.

# oc expose service nginx --port 80
route.route.openshift.io/nginx exposed
# oc get route
NAME    HOST/PORT                               PATH   SERVICES   PORT   TERMINATION   WILDCARD
nginx   nginx-project412.apps.az1.sysdocu.kr           nginx      80                   None

route 정보에 출력된 호스트명과 포트로 서비스에 접근할 수 있는데,

두개의 컨테이너에 번갈아 가며 접근하는 것이 확인됩니다.

 

확인을 위해 각각의 컨테이너 쉘로 로그인하여 index.html 파일 내용을 변경합니다.

# oc rsh nginx-5fb558b844-8nz5f
# echo "one" > /usr/share/nginx/html/index.html
# exit

# oc rsh nginx-5fb558b844-jp4jt
# echo "two" > /usr/share/nginx/html/index.html
# exit

 

curl 명령을 반복하여 호출하는 페이지 내용을 확인합니다.

# curl nginx-project412.apps.az1.sysdocu.kr
one
# curl nginx-project412.apps.az1.sysdocu.kr
one
# curl nginx-project412.apps.az1.sysdocu.kr
two
# curl nginx-project412.apps.az1.sysdocu.kr
one

 

반응형

댓글()