Openshift 4.12.0 응용프로그램 관리 (Pod, Deployment, Service), 스케일아웃 (Replica), 로드발란서 (LoadBalancer) 설정
본 문서는 공식 Documents 를 참고하여 작성하였습니다.
https://docs.openshift.com/container-platform/4.12/applications/index.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
'리눅스 > OpenShift' 카테고리의 다른 글
Openshift 4.12.0 응용프로그램 배포 - 웹서버, 데이터베이스 (0) | 2023.02.17 |
---|---|
Openshift 4.12.0 내부 이미지 레지스트리 (Private Image Registry) 구성 (0) | 2023.02.16 |
Openshift 4.12.0 사용자 생성 및 권한 설정 (0) | 2023.02.14 |
[Openshift] machine-config 에러 : Failed to resync 4.12.0 because: error during syncRequiredMachineConfigPools (0) | 2023.02.13 |
[Openshift] 브라우저에서 OpenShift web-console 에 접근하지 못할때 (0) | 2023.02.13 |