Openshift 4.12.0 응용프로그램 배포 - 웹서버, 데이터베이스
여기에서는 다양한 응용프로그램을 배포해보겠습니다.
배포하면서 겪는 오류 및 해결책을 포함하였습니다.
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$
'리눅스 > OpenShift' 카테고리의 다른 글