Openshift 4.12.0 응용프로그램 배포 - 웹서버, 데이터베이스

리눅스/OpenShift|2023. 2. 17. 10:45
반응형

여기에서는 다양한 응용프로그램을 배포해보겠습니다.

배포하면서 겪는 오류 및 해결책을 포함하였습니다.

1. 웹서버 : Nginx, Httpd

2. DB : MySQL, Redis, MongoDB, PostgreSQL

 

개발 언어를 배포하는 방법은 다음 포스팅을 확인해주세요.

( https://sysdocu.tistory.com/1778 )

개발언어 : Java, Node.js, PHP, Python, Ruby, Go

 

 

[ 사전 작업 ]

 

1) 프로젝트 생성

응용프로그램을 배포하기 전에 프로젝트를 생성해 놓아야 합니다.

사용자를 만들고 프로젝트 생성 권한을 주어도 되지만

본 매뉴얼에서는 편의를 위해 관리자 (system:admin) 로 작업을 진행하도록 하겠습니다.

# 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 project project412

 

2) 컨테이너 관리 도구 준비

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

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

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

- Template 를 통해 생성하는 방법

 

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

Docker 패키지를 설치합니다.

# yum -y install docker

 

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

# systemctl enable docker

# systemctl start docker

 

3) registry.redhat.io 로그인

몇가지 응용프로그램 이미지를 다운로드하고 배포하기 위해서 redhat 에 가입 합니다.

registry.redhat.io 에서는 다양한 이미지를 제공하고 있으므로 종류 및 버전을 확인하고자 할 경우

레드햇 사이트나 회원 가입 후 로그인하여 명령어로 살펴 볼 수 있습니다.

가입 하였을 경우 아래와 같이 로그인 합니다.

# docker login registry.redhat.io
Username: <redhat 계정>
Password: 
Login Succeeded

 

 

1-1. Nginx 배포

 

1) Nginx 배포

nginx 최신 버전 이미지를 다운로드 합니다.
# docker pull docker.io/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 권한을 부여한뒤 다시 설치합니다.

(팁 : deployment 를 먼저 삭제하면 pod 도 같이 삭제 됩니다)

# 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"

 

2) 라우팅 설정

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

뒤에 --port 80 옵션을 주어 특정 포트로 허용할 수도 있습니다.

# oc expose service nginx
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-tcp               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

 

 

1-2. Httpd 배포

 

1) Httpd 배포

httpd 최신 버전 이미지를 다운로드하고 배포합니다.
# docker pull docker.io/httpd:latest

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

 

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

# oc get pods
NAME                    READY   STATUS    RESTARTS   AGE
httpd-c9ccd7f68-9h7cd   1/1     Running   0          2m19s

 

2) 라우팅 설정

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

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

 

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

# curl --head httpd-project412.apps.az1.sysdocu.kr
HTTP/1.1 200 OK
date: Wed, 22 Feb 2023 00:33:05 GMT
server: Apache/2.4.55 (Unix)
last-modified: Mon, 11 Jun 2007 18:53:14 GMT
etag: "2d-432a5e4a73a80"
accept-ranges: bytes
content-length: 45
content-type: text/html
set-cookie: e391fcb731862e31c8659df26b916428=7b084df01e88111b96161caf6bb84603; path=/; HttpOnly
cache-control: private

 

 

2-1. MySQL 배포

 

MySQL 최신 버전 이미지를 다운로드하고 배포합니다.
# docker pull docker.io/mysql:latest

 

어플리케이션 배포 전 필요한 환경 변수를 필수로 입력해야 합니다.

- 택일 : MYSQL_ROOT_PASSWORD
            MYSQL_ALLOW_EMPTY_PASSWORD
            MYSQL_RANDOM_ROOT_PASSWORD

# oc new-app docker.io/mysql:latest -e MYSQL_ROOT_PASSWORD=12345678

 

아래와 같이 정상으로 구동되는 것이 확인되었습니다.

# oc get pods
NAME                    READY   STATUS    RESTARTS   AGE
mysql-bd544cdb8-zt87x   1/1     Running   0          12s

 

접속 테스트를 해봅니다.

# oc rsh mysql-bd544cdb8-zt87x
sh-4.4# mysql -u root -p12345678
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

 

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

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

 

 

2-2. Redis 배포

 

Redis 최신 버전 이미지를 다운로드하고 배포합니다.
# docker pull docker.io/redis:latest

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

 

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

# oc get pods
NAME                    READY   STATUS    RESTARTS   AGE
redis-6b68567b5-2dgk6   1/1     Running   0          11s

 

접속 테스트를 해봅니다.

# oc rsh redis-6b68567b5-2dgk6
# redis-cli
127.0.0.1:6379> ping
PONG

 

 

2-3. MongoDB 배포

 

MongoDB 이미지를 다운로드합니다.

# docker pull registry.redhat.io/rhscl/mongodb-34-rhel7

 

어플리케이션 배포 전 필요한 환경 변수를 필수로 입력해야 합니다.

- 필수 : MONGODB_ADMIN_PASSWORD

- 선택 : MONGODB_USER
            MONGODB_PASSWORD
            MONGODB_DATABASE

# oc new-app -e MONGODB_ADMIN_PASSWORD=12345678 registry.redhat.io/rhscl/mongodb-34-rhel7

 

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

# oc get pods
NAME                                READY   STATUS    RESTARTS   AGE
mongodb-34-rhel7-7477746d74-fdsjb   1/1     Running   0          45s


접속 테스트를 해봅니다.

# oc rsh mongodb-34-rhel7-7477746d74-fdsjb
sh-4.2$ mongo
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user

 

 

2-4. PostgreSQL 배포

 

PostgreSQL 이미지를 다운로드합니다.

# docker pull registry.redhat.io/rhscl/postgresql-95-rhel7

 

어플리케이션 배포 전 필요한 환경 변수를 필수로 입력해야 합니다.

- 필수 : POSTGRESQL_ADMIN_PASSWORD 

- 선택 : POSTGRESQL_USER

            POSTGRESQL_PASSWORD

            POSTGRESQL_DATABASE

# oc new-app -e POSTGRESQL_ADMIN_PASSWORD=12345678 registry.redhat.io/rhscl/postgresql-95-rhel7

 

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

# oc get pods
NAME                                   READY   STATUS    RESTARTS   AGE
postgresql-95-rhel7-8666588965-tf28s   1/1     Running   0          16s


접속 테스트를 해봅니다.

# oc rsh postgresql-95-rhel7-8666588965-tf28s
sh-4.2$ psql        
psql (9.5.14)
Type "help" for help.

postgres=# \q

sh-4.2$

 

 

 

 

반응형

댓글()