Browsing Tag

centos7

IT/Linux/Kubernetes

CentOS7, Rocky 8에서 HTTP/2(h2) 사용하기

안녕하세요. ManVSCloud 김수현입니다.

오늘은 CentOS 7 버전과 Rocky Linux 8.4 버전에서 HTTP/2를 적용해보려 합니다.
이전 포스팅 중에 CentOS 6에서 적용 후 CentOS 7를 포스팅하려고 했는데 Rocky Linux 8버전의 경우 버전 자체가 높아서 한 번에 포스팅하기로 했습니다.

먼저 HTTP/2(H2)에 대해 궁금하신 분들은 아래 먼저 포스팅된 링크를 참고하시기 바랍니다.


Using HTTP/2 on CentOS 7

먼저 CentOS 7 버전에서는 CentOS 6과 같이 버전이 안맞는 것들이 있습니다.
CentOS 6 포스팅에서 업로드 됐던 이미지를 참고해서 한 번 알아보도록 합시다.

CentOS 7 설치 후 Apache를 yum으로 설치해보면 2.4.6 버전이 설치가 됩니다.
Nginx는 따로 repo를 추가해줘야하고 php도 5.4 버전, curl도 7.29 버전이 설치되어있죠.
물론 openssl은 1.0.2g 이상 버전인 1.0.2k 버전이 설치되어있습니다.

오늘은 크게 CentOS 7에서 nginx yum 설치 방법, PHP remi repo로 yum 설치를 작성해보겠습니다.
(PHP 컴파일은 아래 링크를 참고해주세요. 물론 8버전이라 참고용입니다.
특정 버전 컴파일이 어려우실 경우 댓글 남겨주시면 따로 특정 버전 컴파일 방법에 대해 포스팅 해드리겠습니다.)


? Nginx 설치용 repo

CentOS 7에서 nginx를 yum으로 설치하려면 아래와 같이 repo 파일을 생성해야 yum으로 설치할 수 있습니다.

vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[root@manvscloud ~]# yum list | grep nginx
nginx.x86_64                                1:1.20.1-1.el7.ngx         nginx   

? PHP remi repo를 이용하여 설치 방법

PHP를 remi repo로 설치하는 방법은 매우 간단합니다.
아래와 같이 두 줄만 입력한다면?!

[root@manvscloud ~]# yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm 
[root@manvscloud ~]# yum -y install epel-release yum-utils

끝입니다. 이미 준비가 완료됐습니다.

yum install php 를 하면 아직 php5.4 버전으로 설치가 되려고할텐데 yum-config-manager 명령어를 이용해서 버전을 변경해줄 것입니다!

어떤 버전이 있나 한 번 봅시다.

[root@manvscloud ~]# yum list | grep -E 'php[50-90]' | grep -v 'x86_64' | awk -F- '{print $1}' | sort | uniq
php54
php55
php56
php70
php71
php72
php73
php74
php80
php81

php5.6 으로 설치를 한다고 예를 들었을 때 아래와 같이 사용할 수 있습니다.

[root@manvscloud ~]# yum-config-manager --enable remi-php56

이후 yum install php를 하면 php 5.6이 설치가 될 것입니다.
이후 php를 7.4버전으로 재설치를 해야할 경우 yum remove php로 5.6버전 제거하고 아래와 같이 7.4 버전을 설치할 수 있습니다.

[root@manvscloud ~]# yum-config-manager --disable remi-php56
[root@manvscloud ~]# yum-config-manager --enable remi-php74
[root@manvscloud ~]# yum -y install php

Using HTTP/2 on Rocky Linux 8

우선 8버전대부터는 HTTP/2 설정을 위해 버전에 대한 걱정이 필요가 없습니다.
아래는 Rocky Linux 8.4버전에서 dnf 설치 시 또는 이미 설치되어있던 버전들입니다.

apache : 2.4.37
nginx : 1.14.1
php : 7.2.24
openssl : 1.1.1g
curl : 7.61.1

버전에 대한 필요 조건이 이미 완성되어있는 상태입니다…
그냥 편하게 설치해서 쓰면 됩니다.?


Personal Comments

CentOS 6 에서 HTTP/2 사용하기 포스팅과 이번 CentOS 7, Rocky Linux 8에서 HTTP/2 사용하기를 보면 HTTP/2를 적용하는데에 큰 어려움이 없을 거라 생각됩니다.

만약 포스팅을 읽어보시고 특정 버전에서 설정하기가 어렵거나 잘 설정이 되지않을 경우 댓글 남겨주시면 답변드리도록 하겠습니다.
다들 코로나 조심하시고 다음 포스팅으로 찾아뵙겠습니다.

긴 글 읽어주셔서 감사합니다.

NCP

[NCP] 네이버 클라우드에서 2TB 초과하는 파티션 사용하기 – Linux편

안녕하세요. ManVSCloud 김수현입니다.

오늘은 네이버 클라우드 Linux 환경에서 2TB 용량을 초과하는 파티션 사용법에 대해 포스팅하였습니다.

원래 Windows 부터 자료 다 준비해놨는데 포스팅 이미지들을 전부 회사에 두고온 관계로…
Linux편을 먼저 포스팅해보겠습니다.?

우선 테스트 환경와 어떻게 2TB를 초과하는 용량의 파티션을 생성할 것인가에 대해 알아보도록 합시다.


Environment and Description

? 사용된 OS : centos-7.8-64

네이버 클라우드에서 스토리지를 추가하여 생성할 때 최대 볼륨 크기는 2000GB로 제한되어 있습니다.

그렇다면 어떻게 2000GB가 넘는 파티션을 생성할 것이냐?

우선 결론부터 말하자면 LVM(Logical Volume Manager)을 사용하여 파티션을 생성할 것입니다.

LVM에 대해 깊게 설명하는 포스팅은 아니니 간단하게 설명하자면 LVM을 이용한다면 여러 개의 물리적인 디스크 파티션을 논리적인 그룹으로 묶은 뒤 개별적인 논리 디스크로 할당하여 유연성있게 사용할 수 있습니다.

LVM에 대해 더 자세히 알고 싶으시다면 LVM에 대한 개념과 명령어에 대해 검색하여 확인 해보시기 바랍니다.


Create partitions using LVM

우선 위 이미지와 같이 서버에 추가할 스토리지 2개를 생성합니다.
2000GB 용량으로 2개의 스토리지를 생성해주었습니다.

[root@s17ab8051000 ~]# fdisk -l

Disk /dev/xvda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000ac8f2

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *        2048     2099199     1048576   83  Linux
/dev/xvda2         2099200   104857599    51379200   83  Linux

Disk /dev/xvdb: 2147.5 GB, 2147483648000 bytes, 4194304000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/xvdc: 2147.5 GB, 2147483648000 bytes, 4194304000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

서버 내에서 fdisk -l 명령어로 확인해보면 추가된 두개의 스토리지를 확인할 수 있습니다.

[root@s17ab8051000 ~]# fdisk /dev/xvdb

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-4194303999, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-4194303999, default 4194303999): 
Using default value 4194303999
Partition 1 of type Linux and of size 2 TiB is set

fdisk /dev/xvdb 를 이용하여 파티션을 생성해줍시다.

1. n을 눌러 새로 생성해줍니다.
2. p를 눌러 주 파티션을 생성해줍니다.
3. 파티션 넘버를 정해주는데 default가 1로 되어있어 그냥 엔터만 쳐도 됩니다.
4. First sector는 섹터 시작점 Last sector는 섹터가 끝나는 부분을 지정해주는 건데 그냥 엔터를 눌러주어 전체 용량 지정해줍시다.

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): l

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS    
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep        
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
1e  Hidden W95 FAT1 80  Old Minix   
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): w

이어서 해당 파티션의 타입을 지정해주어야하는데 타입의 종류는 l(L)을 입력하여 타입에 대한 모든 Hex code를 볼 수 있습니다.
우리는 Linux LVM을 사용해야하니 8e를 사용 해줄 것입니다.

5. t를 입력하여 파티션 타입 지정
6. 8e 입력하여 Linux LVM로 지정해줍니다.
7. w (저장)

위 과정을 추가한 두 디스크 /dev/xvdb, /dev/xvdc 모두 설정해주어야 합니다.

[root@s17ab8051000 ~]# fdisk -l

Disk /dev/xvda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000ac8f2

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *        2048     2099199     1048576   83  Linux
/dev/xvda2         2099200   104857599    51379200   83  Linux

Disk /dev/xvdb: 2147.5 GB, 2147483648000 bytes, 4194304000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x09ecabef

    Device Boot      Start         End      Blocks   Id  System
/dev/xvdb1            2048  4194303999  2097150976   8e  Linux LVM

Disk /dev/xvdc: 2147.5 GB, 2147483648000 bytes, 4194304000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0a3c26f7

    Device Boot      Start         End      Blocks   Id  System
/dev/xvdc1            2048  4194303999  2097150976   8e  Linux LVM

두 스토리지 전부 정상적으로 생성했다면 /dev/xvdb1, /dev/xvdc1가 Linux LVM으로 잘 생성된 것을 확인할 수 있습니다.

[root@s17ab8051000 ~]# rpm -qa | grep lvm2
lvm2-libs-2.02.186-7.el7_8.2.x86_64
lvm2-2.02.186-7.el7_8.2.x86_64

이제 논리적 볼륨으로 관리해줄 것입니다.
lvm2가 설치되어 있어야하지만 네이버 클라우드에서는 이미 설치가 되어 있었습니다.

[root@s17ab8051000 ~]# pvcreate /dev/xvdb1
  Physical volume "/dev/xvdb1" successfully created.
[root@s17ab8051000 ~]# pvcreate /dev/xvdc1
  Physical volume "/dev/xvdc1" successfully created.

pvcreate 명령어를 이용하여 fdisk로 만든 파티션을 물리적 볼륨(PV)으로 생성해줍니다.

[root@s17ab8051000 ~]# pvdisplay
  "/dev/xvdb1" is a new physical volume of "1.95 TiB"
  --- NEW Physical volume ---
  PV Name               /dev/xvdb1
  VG Name               
  PV Size               1.95 TiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               gcpy02-Fe7l-4Klb-pQed-z726-sgmY-JQXe6R
   
  "/dev/xvdc1" is a new physical volume of "1.95 TiB"
  --- NEW Physical volume ---
  PV Name               /dev/xvdc1
  VG Name               
  PV Size               1.95 TiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               I6W7l7-Rxce-QllJ-n6nl-nULX-PZ3j-PQGJe3

pvdisplay 명령어를 이용하여 생성된 PV를 자세히 볼 수 있습니다. (pvs, pvscan 명령어를 사용해도 좋습니다.)

[root@s17ab8051000 ~]# vgcreate vg_data /dev/xvdb1 /dev/xvdc1
  Volume group "vg_data" successfully created

[root@s17ab8051000 ~]# vgdisplay
  --- Volume group ---
  VG Name               vg_data
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <3.91 TiB
  PE Size               4.00 MiB
  Total PE              1023998
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1023998 / <3.91 TiB
  VG UUID               Kl29bl-HIIm-NXxt-RPRI-1mfr-VMtO-0qOO7I

PV 생성 후에 VG, 즉 볼륨 그룹을 생성해주어야합니다.
vgcreate 명령어로 위와 같이 볼륨 그룹을 생성해줍시다.
vgcreate VG 이름 디바이스명1 디바이스명2 과같이 사용할 수 있습니다.

[root@s17ab8051000 ~]# lvcreate -l 100%FREE -n lv_data vg_data
  Logical volume "lv_data" created.

[root@s17ab8051000 ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg_data/lv_data
  LV Name                lv_data
  VG Name                vg_data
  LV UUID                66UDwi-kBvC-lJFc-Nc0g-QcSA-dxJL-0eYTUG
  LV Write Access        read/write
  LV Creation host, time s17ab8051000, 2021-07-18 15:30:36 +0900
  LV Status              available
  # open                 0
  LV Size                <3.91 TiB
  Current LE             1023998
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

VG으로 물리적 볼륨을 하나로 묶어주었습니다.
생성된 VG에서 여러개의 LV로 또는 하나의 LV로 생성하실 수 있습니다.
lvcreate로 논리적 볼륨(LV)를 생성해줄 것입니다.
-l 옵션은 PE 단위이며 -L 옵션은 MB, GB, TB 단위입니다.
(사용할 수 있는 PE와 용량은 vgdisplay 명령어에서 Free PE / Size 를 확인하면 볼 수 있습니다.)

lvcreate -l 100%FREE 를 주고 -n 옵션으로 lv의 이름을 지정해줬습니다 이후 위에서 생성했던 vg의 이름을 써줍니다.

[root@s17ab8051000 ~]# mkfs.xfs /dev/vg_data/lv_data
meta-data=/dev/vg_data/lv_data   isize=512    agcount=4, agsize=262143488 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1048573952, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=511999, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

이제 마지막으로 파일시스템 작업과 마운트 작업만 해주면 끝입니다.
저는 xfs 파일시스템으로 포맷해줬는데 이 부분은 원하시는 파일시스템으로 포맷해주시면 됩니다.

[root@s17ab8051000 ~]# mkdir /data
[root@s17ab8051000 ~]# mount /dev/vg_data/lv_data /data
[root@s17ab8051000 ~]# df -h /data
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data  4.0T   33M  4.0T   1% /data

위와 같이 생성한 디렉토리에 마운트까지 정상적으로 완료되었습니다.
하지만 최종적으로 부팅 후에도 정상적으로 마운트되려면 /etc/fstab 파일을 수정해주어야합니다.

[root@s17ab8051000 ~]# blkid /dev/vg_data/lv_data
/dev/vg_data/lv_data: UUID="4240c1b1-ac89-477c-933b-eff8db839adf" TYPE="xfs" 

blkid 명령어로 UUID를 확인하고 /etc/fstab 파일에 아래와 같이 추가해주었습니다.

#
# /etc/fstab
# Created by anaconda on Mon Aug 31 14:44:01 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0692fdb8-bb3c-4094-83f0-fe95a339b8c1 /                       xfs     defaults        0 0
UUID=f95bed0a-11af-4b2c-bfcc-4afb91a68fc1 /boot                   xfs     defaults        0 0
UUID=4240c1b1-ac89-477c-933b-eff8db839adf /data                   xfs     defaults        0 0

네이버 클라우드에서 2TB가 초과되는 파티션을 사용하는 것 생각보다 쉽지 않나요?

그럼 이제 이렇게 논리적으로 생성한 볼륨을 확장하는 방법도 알아봅시다.
4TB의 용량도 다 써버려서 확장이 필요할 때 이미 생성된 LV는 추가적인 확장이 가능할까요?


Volume Expansion

LV 확장은 충분히 가능합니다. 아래 예시로 준비하였습니다.

먼저 2000GB 크기의 스토리지를 하나 더 추가 생성하였습니다.

[root@s17ab8051000 ~]# fdisk /dev/xvdd
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5840d763.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-4194303999, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-4194303999, default 4194303999): 
Using default value 4194303999
Partition 1 of type Linux and of size 2 TiB is set

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

위에서 배운 그대로 fdisk를 이용하여 파티션을 생성해줍니다.

[root@s17ab8051000 ~]# pvcreate /dev/xvdd1
  Physical volume "/dev/xvdd1" successfully created.

[root@s17ab8051000 ~]# vgdisplay
  --- Volume group ---
  VG Name               vg_data
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <3.91 TiB
  PE Size               4.00 MiB
  Total PE              1023998
  Alloc PE / Size       1023998 / <3.91 TiB
  Free  PE / Size       0 / 0   
  VG UUID               Kl29bl-HIIm-NXxt-RPRI-1mfr-VMtO-0qOO7I
   
[root@s17ab8051000 ~]# 
[root@s17ab8051000 ~]# vgextend vg_data /dev/xvdd1
  Volume group "vg_data" successfully extended

자 여기서부터가 중요한데 pvcreate를 이용하여 PV를 생성해주는 것까지는 동일합니다.
하지만 이번엔 볼륨 그룹을 따로 생성해주지 않았습니다.
볼륨 그룹을 따로 생성할 수도 있겠지만 vgextend를 이용하여 기존 볼륨 그룹을 확장하는 방식으로 해보았습니다.

[root@s17ab8051000 ~]# vgdisplay
  --- Volume group ---
  VG Name               vg_data
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <5.86 TiB
  PE Size               4.00 MiB
  Total PE              1535997
  Alloc PE / Size       1023998 / <3.91 TiB
  Free  PE / Size       511999 / 1.95 TiB
  VG UUID               Kl29bl-HIIm-NXxt-RPRI-1mfr-VMtO-0qOO7I
   

[root@s17ab8051000 ~]# lvextend -l +511999 /dev/vg_data/lv_data
  Size of logical volume vg_data/lv_data changed from <3.91 TiB (1023998 extents) to <5.86 TiB (1535997 extents).
  Logical volume vg_data/lv_data successfully resized.

vgdisplay를 이용해서 보면 정상적으로 VG가 확장되어 Free PE / Size가 추가적으로 여유가 생긴 것을 확인할 수 있습니다.

여기서 lvextend 명령어를 이용해줍시다!
lvextend를 이용하면 논리적 볼륨을 확장할 수 있습니다.
이번엔 -l 명령어로 PE를 지정해서 줘봅시다. (1PE 당 4MB의 용량이라고 합니다.)

[root@s17ab8051000 ~]# lvscan
  ACTIVE            '/dev/vg_data/lv_data' [<5.86 TiB] inherit
[root@s17ab8051000 ~]# df -h /data
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data  4.0T   33M  4.0T   1% /data

끝이 아닙니다.
LV는 확장되었지만 df 명령어로 보면 그대로 전체 크기가 4T로 머물러 있을 것입니다.

왜냐? 파일시스템을 확장해주지 않았으니까…

[root@s17ab8051000 ~]# xfs_growfs -d /data
meta-data=/dev/mapper/vg_data-lv_data isize=512    agcount=4, agsize=262143488 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1048573952, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=511999, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1048573952 to 1572860928
[root@s17ab8051000 ~]# 
[root@s17ab8051000 ~]# df -h /data
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data  5.9T   33M  5.9T   1% /data

xfs_growfs 명령어로 위와 같이 파일시스템을 확장해줄 수 있습니다.
※ 파일시스템이 EXT4일 경우 resize2fs 명령어를 사용할 수 있습니다.

파일시스템 확장 후 df 명령어로 다시 확인 해보면 정상적으로 6T까지 용량이 늘어난 것을 볼 수 있습니다.


Note

이렇게 스토리지 LVM을 이용하여 파티션을 구성했을 경우 백업을 스냅샷 백업이 아닌 이미지 백업으로 해야합니다.

이후 서버에 문제가 생겼을 때 생성된 이미지로 서버를 재생성하면 구성된 LVM까지 전부 다 그대로 올라오는데 스냅샷은 그렇게 할 수 없습니다.
스토리지 여러개를 하나로 묶어 놓았는데 스냅샷으로 백업해버리면 스냅샷으로 볼륨 생성 후 이걸 다시 묶어주고 파일시스템을 포맷하면 데이터가 살아있지 못하죠..

단 이미지 백업으로 서버를 생성하면 서버 생성 시 스토리지 종류를 SSD로 선택할 경우 나머지 볼륨들도 전부 SSD로 생성된다는 점이죠…

나머지 볼륨들을 다시 HDD로 변경하려면 스토리지를 HDD로 생성 하고 LVM으로 PV,VG, LV전부 구성 해준 뒤 데이터를 복사해줘야합니다…?


Personal Comments

지금까지 네이버 클라우드 리눅스 환경에서 2000GB를 초과하는 파티션을 만들어보았습니다.
오늘 설명드린 LVM을 이용한 파티션 생성 및 확장 뿐만이 아니라 축소, 스냅샷 등 다양하게 사용할 수 있으니 관심있으시면 다양하게 써보시면 좋을 것같습니다.

Windows편도 금방 포스팅하도록 하겠습니다.

긴 글 읽어주셔서 감사합니다.

IT/Linux/Kubernetes

PHP8.0.1 컴파일 설치 (APM+wordpress)

안녕하세요. ManVSCloud 김수현입니다.

오늘은 2021-01-07에 나온 PHP 8.0.1 버전을 컴파일 설치해보려고 합니다.

테스트는 WordPress까지 연동하여 정상적으로 플러그인 설치 및 글쓰기가 되는지까지 확인할 것입니다.

Environment

CentOS Linux release 7.7.1908 (Core) x86_64
CPU : Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz (4core)
Memory : 16G
(PHP 컴파일 시 out of memory 발생하여 인스턴스 크기를 m4.xlarge로 하여 테스트 했습니다.)
Apache : httpd-2.4.6-97.el7.centos.x86_64
PHP : PHP 8.0.1 (cli)
MariaDB : MariaDB-server-10.4.17-1.el7.centos.x86_64
WordPress : 5.6

Apache와 MariaDB는 RPM으로 설치하였습니다.

Basic Install & Setting

1  cat -n /etc/selinux/config
2  sed -i '7s/enforcing/disabled/g' /etc/selinux/config
3  yum install gcc gcc* make cmake libtool wget zip unzip autoconf automake libjpeg-devel libpng-devel freetype-devel libxml2-devel libicu* hspell libvoikko enchant-devel libffi-devel libcurl-devel libldap* sqlite-devel "Image*" *imap-devel pam-devel openssl-devel firebird-devel aspell-devel readline-devel net-snmp-devel libsodium-devel yum install libtidy libtidy-devel libxslt-devel git bzip2-devel 

#(위에서 설치가 안될 수도 있습니다. 이후 epel 추가 후 재설치하면 나머지가 설치됩니다.)

4  init 6

원활한 설치를위해 selinux 기능을 꺼주고 기본 라이브러리들을 설치해준 뒤
재시작을 해줍니다.
(기본 라이브러리는 사용하실 부분만 골라서 설치하셔도 됩니다.)

Apache & MariaDB Install

[Apache]

yum install httpd httpd-devel -y
cp -avp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_org

#[root@ip-10-0-1-238 conf]# cat -n /etc/httpd/conf/httpd.conf | grep Indexes
#135 # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#144 Options Indexes FollowSymLinks

sed -i '144s/Indexes//g' /etc/httpd/conf/httpd.conf
#(144번줄에 있는 Indexes를 제거해주도록 하겠습니다.)

#[root@ip-10-0-1-238 ~]# cat -n /etc/httpd/conf/httpd.conf | grep -A 3 "Directory /"
#102 <Directory />
#103 AllowOverride none
#104 Require all denied
#105 </Directory>

perl -p -i -e '$.==104 and print " Require all granted\n"' /etc/httpd/conf/httpd.conf
sed -i '105s/ Require all denied/#&/' /etc/httpd/conf/httpd.conf
#(104 번줄에 접근 허용 설정 및 denied 부분은 주석 처리해주겠습니다.)

#[root@ip-10-0-1-238 ~]# cat -n /etc/httpd/conf/httpd.conf | grep -A 4 "Directory /"
#102 <Directory />
#103 AllowOverride none
#104 Require all granted
#105 # Require all denied
#106 </Directory>

cat << EOF >> /etc/httpd/conf/httpd.conf
ServerTokens Prod
ServerSignature Off
<IfModule mpm_prefork_module>
StartServers 40 
MinSpareServers 25 
MaxSpareServers 100 
ServerLimit 1024 
MaxRequestWorkers 1024 
MaxConnectionsPerChild 0
</IfModule>
IndexIgnore *
EOF

cat /etc/httpd/conf/httpd.conf | tail -n 11
#위 명령어로 httpd.conf에 옵션이 잘 들어갔는지 확인합니다.

cat << EOF > /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
ServerName php.manvscloud.com
DocumentRoot /home/php/wordpress/
</VirtualHost>
EOF

mkdir -p /home/php/wordpress

apachectl -S
#위 명령어로 virtual host가 정상적으로 추가되었는지 확인합니다.

systemctl enable httpd
systemctl start httpd

[MariaDB]

cat << EOF > /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF

yum install MariaDB-server MariaDB-client -y

systemctl enable mariadb
systemctl start mariadb

mysql -uroot -p

create database wordpress;
create user 'manvscloud'@'localhost' identified by 'PW';
grant all privileges on wordpress.* to 'manvscloud'@'localhost';
flush privileges;
exit

PHP 8.0.1

cd /usr/local/src
wget https://www.php.net/distributions/php-8.0.1.tar.gz
tar zxvf php-8.0.1.tar.gz
./configure –help > phpconf_help.txt

생성한 phpconf_help.txt 를 잘 읽어보자. ★★★★★

아래는 php 컴파일 중에 설치가 덜 되거나 추가로 설정해주어야하는 부분이 있어
정리해보았습니다.
(oracle, postgresql 제외)

컴파일 중 oniguruma가 없다는 에러가 발생했습니다.
(No package ‘oniguruma’ found)

oniguruma-devel를 설치해주어야하는데 epel-release 설치를 하지 않고
oniguruma-devel를 설치할 경우 패키지를 찾을 수 없습니다.

(No package oniguruma-devel available.)

yum install epel-release
yum install oniguruma-devel

-. libzip
configure: error: Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met:No package ‘libzip’ found

CentOS7에서 libzip yum으로 설치할 경우 0.10.1-8.el7으로만 설치되어 따로 컴파일해주었습니다.

cd /usr/local/src
wget https://libzip.org/download/libzip-1.7.3.tar.gz
tar zxvf libzip-1.7.3.tar.gz
cd libzip-1.7.3
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/libzip

libzip 1.7.3 버전을 컴파일 하기위해서는 cmake 3.0.2 이상이 필요했습니다.
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
CMake 3.0.2 or higher is required. You are running version 2.8.12.2


wget https://github.com/Kitware/CMake/releases/download/v3.18.5/cmake-3.18.5-Linux-x86_64.tar.gz
tar zxvf cmake-3.18.5-Linux-x86_64.tar.gz
mv cmake-3.18.5-Linux-x86_64 /usr/local/cmake

/usr/local/cmake/bin/cmake -DCMAKE_INSTALL_PREFIX=/usr/local/libzip
make && make install

export PKG_CONFIG_PATH=/usr/local/libzip/lib64/pkgconfig
(이후 /etc/profile 에 넣어 줍시다.)

-. ldap
cp -frp /usr/lib64/libldap* /usr/lib

./configure --prefix=/usr/local/php \
--with-apxs2=/usr/bin/apxs \
--with-config-file-path=/etc/ \
--with-config-file-scan-dir=/etc/php.d \
--enable-gd \
--with-zlib \
--with-freetype \
--with-jpeg \
--with-curl \
--with-pear \
--with-openssl \
--enable-bcmath \
--with-bz2 \
--enable-calendar \
--enable-ctype \
--enable-dba \
--enable-dom \
--with-enchant \
--enable-exif \
--with-ffi \
--enable-fileinfo \
--enable-filter \
--enable-ftp \
--with-gettext \
--with-gmp \
--with-iconv \
--enable-intl \
--with-ldap \
--enable-mbstring \
--with-mysqli \
--enable-mysqlnd \
--enable-pcntl \
--enable-pdo \
--with-pdo_firebird \
--with-pdo_mysql \
--with-pdo_sqlite \
--enable-phar \
--enable-posix \
--with-pspell \
--with-readline \
--enable-session \
--enable-shmop \
--with-snmp \
--enable-soap \
--enable-sockets \
--with-sodium \
--with-sqlite3 \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-tidy \
--enable-tokenizer \
--with-xsl \
--with-zip \
--enable-simplexml \
--with-libxml \
--enable-xml \
--enable-xmlreader \
--enable-xmlwriter \
--enable-opcache
make -j `grep processor /proc/cpuinfo | wc -l`
#(j옵션을 주어 컴파일 속도를 최적화 합니다.)

/bin/ld: ext/ldap/ldap.o: undefined reference to symbol 'ber_memfree'
#(make 중에 ldap 쪽에서 위와 같은 에러가 발생했습니다.)
#(아래처럼 Makefile을 수정할 필요가 있었습니다.)

vi Makefile
EXTRA_LIBS = -lcrypt -ltidy -lresolv -lcrypt -lreadline -lncurses -laspell -lpspell -lfbclient -lrt -lldap -llber -lstdc++ -lgmp -lbz2 -lutil -lrt -lm -ldl -lxml2 -lssl -lcrypto -lsqlite3 -lz -lcurl -lxml2 -lenchant -lgmodule-2.0 -lglib-2.0 -lffi -lssl -lcrypto -lz -lpng15 -ljpeg -lfreetype -licuio -licui18n -licuuc -licudata -lonig -lsqlite3 -lxml2 -lnetsnmp -lssl -lssl -lcrypto -lm -lxml2 -lsodium -lxml2 -lxml2 -lxml2 -lxslt -lz -ldl -lm -lxml2 -lexslt -lxslt -lz -lm -lgcrypt -ldl -lgpg-error -lxml2 -lzip -lz -lssl -lcrypto -lcrypt
#(위와 동일한 에러 발생 시 Makefile에 EXTRA_LIBS 쪽에 -llber 추가)

make -j `grep processor /proc/cpuinfo | wc -l`
make install

cp -avp php.ini-production /etc/php.ini


cat << EOF >> /etc/profile
export PKG_CONFIG_PATH=/usr/local/libzip/lib64/pkgconfig
PATH=$PATH:/usr/local/php/bin
export PATH
EOF

source /etc/profile

< imagick 모듈 추가 >
cd /usr/local/src
wget https://pecl.php.net/get/imagick-3.4.4.tgz
tar zxvf imagick-3.4.4.tgz
cd imagick-3.4.4
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make

/usr/local/src/imagick-3.4.4/imagick_file.c:313:112: error: expected ??;??, ??,?? or ??)?? before ??TSRMLS_DC??
zend_bool php_imagick_stream_handler(php_imagick_object *intern, php_stream *stream, ImagickOperationType type TSRMLS_DC)
^
make: *** [imagick_file.lo] Error 1


(php8에서는 imagick이 정상적으로 설치가 되지않고 Error가 발생했습니다.
동일한 오류가 해외쪽에서도 있었는지 찾다보니 git에서 8버전에서 사용할 수 있는
imagick을 찾게 되었습니다.)

git clone https://github.com/Imagick/imagick.git
cd imagick
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make

mkdir -p /etc/php.d/modules
cp -a /usr/local/src/imagick/modules/imagick.so /etc/php.d/modules/imagick.so
< opcache 모듈 설치 >

컴파일 시 추가했던 opcache가 자동으로 올라오지 않아 수동으로 추가해주었습니다.

cd /usr/local/src/php-8.0.1/ext/opcache
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
cp -a /usr/local/src/php-8.0.1/ext/opcache/modules/opcache.so /etc/php.d/modules/opcache.so

(php.ini에 imagick과 opcache 모듈을 추가 해줍니다.)
cat << EOF >> /etc/php.ini
extension=/etc/php.d/modules/imagick.so
zend_extension=/etc/php.d/modules/opcache.so
EOF

마지막으로 httpd.conf에 아래 값을 추가 한 뒤 마무리합니다.

<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>

AddType application/x-httpd-php .php .htm .html .inc
AddType application/x-httpd-php-source .phps


WordPress Install & TEST

cd /home/php
wget https://ko.wordpress.org/latest-ko_KR.tar.gz
tar zxvf latest-ko_KR.tar.gz
cd wordpress
cp -a wp-config-sample.php wp-config.php

vi wp-config.php

wp.config.php에서 위 mariadb에서 만들어준 DB와 계정 정보를 넣어줍니다.

/** The name of the database for WordPress */
define( ‘DB_NAME’, ‘wordpress’ );
/** MySQL database username */
define( ‘DB_USER’, ‘manvscloud’ );
/** MySQL database password */
define( ‘DB_PASSWORD’, ‘PW’ );
/** MySQL hostname */
define( ‘DB_HOST’, ‘127.0.0.1’ );
/** Database Charset to use in creating database tables. */
define( ‘DB_CHARSET’, ‘utf8’ );
/** The Database Collate type. Don’t change this if in doubt. */
define( ‘DB_COLLATE’, ” );

임시로 /home/php 사용자/그룹 권한을 apache로 한 뒤 Apache를 재시작합니다.
(테스트 후 사용자/그룹 권한을 변경하는 것을 권장합니다.)

chown -R apache:apache /home/php
apachectl rstart

[ 사이트 접속 해보기 ]

글쓰기 테스트 및 플러그인 설치/활성화까지 잘 되었습니다.
(플러그인 설치를 원활히 하려면 wp-config.php에 추가 옵션이 필요할 수 있습니다.)

PHP8에서 추가되거나 달라지는 부분은 추가 링크로 남기도록 하겠습니다.
https://www.php.net/releases/8.0/en.php
https://www.inflearn.com/course/php8-new-features#

PHP 8버전 컴파일은 성공적이었습니다.
마지막으로 PHP 8 컴파일 컨텐츠를 해볼 수 있도록 제안해주신 리눅서님에게
감사의 인사 올립니다. 많은 공부가 되었습니다.
https://linuxer.name/

긴 글 읽어주셔서 감사합니다.

IT/Linux/Kubernetes

KUBERNETES 1.19 설치 및 APM + WORDPRESS 연동 – 2부

안녕하세요. ManVSCloud 김수현입니다.

1부 “VirtualBox를 이용한 Kubernetes 1.19 설치” 편에 이어
2부에서는 설치된 Kubernetes를 이용하여 APM + WordPress 연동을 작성하겠습니다.

1부 “VirtualBox를 이용한 Kubernetes 1.19 설치”를 못보신 분들을 위해
해당 포스트 하단에 추가로 링크를 추가해두었습니다.

APM + WordPress를 연동하여 wordpress 웹 서비스를 운영할 수 있도록 해보겠습니다.

PV, PVC, Service & Pod Deploy

| PV

1. vi pv_01.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv0001
  labels:
    type: local
spec:
  capacity:
    storage: 25Gi
  accessModes:
    - ReadWriteOnce
  hostPath:

    path: "/data001/pv0001"

2. vi pv_02.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv0002
  labels:
    type: local
spec:
  capacity:
    storage: 25Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data001/pv0002"

위 .yaml 파일을 만든 뒤 아래 명령어를 이용하여 퍼시스턴트 볼륨을 생성하고
정상적으로 생성되었는지 확인 해봅니다.

 kubectl create -f pv_01.yaml
 kubectl create -f pv_02.yaml
 kubectl get pv

| Mysql, PVC + Services + Pod

  • vi mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

| WordPress, PVC + Services + Pod

  • vi wordpress-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
  externalIPs:
  - 192.169.0.31
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pvc

위 파일은 PVC와 Pod, Services .yaml 파일입니다.
따로 분리하여 만들어줄 수도 있고, 위 방법과 같이 합쳐서 한 파일로 만들 수도 있습니다.

| Add Secret Generator

  • vi kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=rlatngus1!
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml
  • kubectl apply -k ./

| Confirm Settings

지금까지 설정한 것들을 아래의 방법으로 모두 확인해보시기 바랍니다.
위 wordpress-deployment.yaml에서 External-IP를 Kube-Node1의 IP로 설정해두었습니다.

  • kubectl get secrets
  • kubectl get pvc
  • kubectl get pods
  • kubectl get services

Check Service (192.168.0.31:80)

Kube-Node1 IP인 192.168.0.31로 80포트를 타고 wordpress가 실행되었습니다.
정상적으로 운영되는 것을 웹 페이지에서 볼 수 있었습니다.

C o m m a n d

1 kubectl get svc
2 kubectl get nodes
3 kubectl get pods
–all-namespaces
-o wide
4 kubectl delete pod [pod이름]
namespace가 default가 아닌 다른 것일 때 ex) -n kube-system
5 kubectl describe pod [pod이름]
6 kubectl get events
7 kubectl get pv
8 kubectl get pvc
9 kubectl edit svc [service이름]
10 kubectl create -f [파일] ex) mysql.yaml

마지막으로 자주 쓰이게 됐던 명령어들을 10가지 뽑아 정리하였습니다.
이 포스팅이 실습에 많은 도움이 되셨길 바라며 이론적인 부분은 따로 찾아보시기 바랍니다.

1,2부에 걸쳐 긴 글 읽어주셔서 감사합니다.

IT/Linux/Kubernetes

Kubernetes 1.19 설치 및 APM + WordPress 연동 – 1부

안녕하세요. ManVSCloud 김수현입니다.

오늘은 Kubernetes 1.19 설치 후 APM + WordPress를 연동하여
wordpress 웹 서비스를 운영하는 것이 목표입니다.

1부에서는 VirtualBox를 이용한 Kubernetes 1.19 설치,
2부에서는 설치된 Kubernetes를 이용하여 APM + WordPress 연동을 작성하겠습니다.

설치 환경은 아래와 같습니다.

Environment

  • VirtualBox [각 VM 정보]
    CentOS 7.8 2003 (core) + 3.10.0-1127.19.1.el7.x86_64
    MEMORY : 4G
    CPU : 2
    HDD : 50G
    네트워크 방식 : 어댑터에 브리지

“테스트하는데 저렇게 많은 메모리와 많은 node를 생성할 필요는 없습니다.
그냥 제 노트북 스펙이 괴물이라 퍼줬습니다.”


최소 2G 메모리면 충분히 설치가 가능합니다.

Kubernetes Install & Environment Setup

  • Master – 1
    Kubernetes 설치를 위해서는 기본적인 설치 환경을 만들어주어야 합니다.

    VirtualBox를 이용하여 CentOS 7를 설치해 kube-master를 생성해주고
    Master에서 아래 환경들을 구성합니다.

1 setenforce 0
2 sed -i ‘s/^SELINUX=enforcing$/SELINUX=permissive/’ /etc/selinux/config
3 sestatus
4 systemctl stop firewalld && systemctl disable firewalld
5 systemctl stop NetworkManager && systemctl disable NetworkManager
6 swapoff -a && sed -i ‘/ swap / s/^/#/’ /etc/fstab
7 cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
8 sysctl –system
9 cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
10 yum -y update
11 cat << EOF >> /etc/hosts
192.168.0.30 kube-master
192.168.0.31 kube-node1
192.168.0.32 kube-node2
192.168.0.33 kube-node3
EOF
12 cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.30 kube-master
192.168.0.31 kube-node1
192.168.0.32 kube-node2
192.168.0.33 kube-node3
13 yum install -y yum-utils device-mapper-persistent-data lvm2
14 yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
15 yum update -y && yum install -y docker-ce
16 mkdir /etc/docker
17 cat > /etc/docker/daemon.json <<EOF
{
“exec-opts”: [“native.cgroupdriver=systemd”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”
},
“storage-driver”: “overlay2”,
“storage-opts”: [
“overlay2.override_kernel_check=true”
]
}
EOF
18 mkdir -p /etc/systemd/system/docker.service.d
19 yum install -y kubelet kubeadm kubectl –disableexcludes=kubernetes

여기까지 구성하셨다면 기본적인 노드 복제 전 모든 설정들이 구성된 것입니다.
다음 작업을 진행하기 전에 스냅샷을 생성하시기 바랍니다.

이 스냅샷은 앞으로 당신의 쿠버네티스 모험으로부터 많은 도움을 줄 것입니다.

이제 설정을 마친 Kube-Master를 아래와 같은 방법으로 Kube-Node1,2,3으로 복제할 것입니다.

모든 Kube-Node 복제를 완료하셨다면 이제 아래 작업으로 넘어가셔도 좋습니다.

  • Node – 1
    Master를 복제하여 Node를 만들었기때문에 Node들은 Master와 동일한 IP를 갖고있습니다.
    Node 복제가 완료되면 가장 먼저 IP 변경과 hostname 변경을 해주는 것이 우선입니다.

1 /etc/sysconfig/network-scripts/ifcfg-enp0s3
IPADDR=192.168.0.
2 systemctl restart network
3 hostnamectl set-hostname kube-node

  • Master – 2
    Node의 네트워크 설정이 완료되면 다시 Master로 돌아와서 설정을 마저합니다.
    아래 설정 중에 kubeadm join 값을 반드시 저장해두시기 바랍니다.

20 systemctl daemon-reload
21 iptables -nL
22 systemctl enable –now docker
23 docker run hello-world
24 systemctl enable –now kubelet

25 kubeadm init –pod-network-cidr=20.96.0.0/12

# kubeadm join value 값을 따로 저장해두자.
# –token 7ovjlh.znruevaiqj9cbrk8 \ –discovery-token-ca-cert-hash sha256:77ef7 – 이하 생략

26 mkdir -p $HOME/.kube
27 cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
28 chown $(id -u):$(id -g) $HOME/.kube/config
29 yum install bash-completion -y
30 source <(kubectl completion bash)
31 echo “source <(kubectl completion bash)” >> ~/.bashrc

  • Node – 2
    Master-2 의 작업이 모두 완료되면 Node로 돌아와 아래와 같은 작업을 해줍니다.
    Master에서 저장해둔 본인의 kubeadm join 값을 아래에 추가하여 붙여줍니다.

4 systemctl daemon-reload
5 systemctl enable –now docker
6 systemctl enable –now kubelet
7 kubeadm join 192.168.0.30:6443 –token 7ovjlh.znruevaiqj9cbrk8 \
–discovery-token-ca-cert-hash sha256:77ef7c8c7325d309fa91cab608ce0eb94f30f300bd053db4c08341bf083ef53d

  • Master – 3
    이제 99% 설치가 완료됐다고 보시면 됩니다.
    kubectl get nodes를 하여 Master에서 각 Node들의 상태를 확인해보시기 바랍니다.

    STATUS 값이 READY 상태여야합니다.

32 kubectl get nodes

33 kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
34 kubectl get pods –all-namespaces

calico도 설치해줍니다.
calico는 컨테이너 기반에서 사용되는 네트워크 플러그인 중에 하나입니다.

calico가 정상적으로 Running 중이십니까?
여기까지 성공하셨다면 Kubernetes 1.19 설치가 정상적으로 완료되었습니다.

많은 도움이 되셨길 바라며,
함께 Kubernetes 자격증 도전중인 용사님들 화이팅입니다!

2부에 이어서 설치된 Kubernetes로 APM + WordPress 연동하여
서비스를 운영해보도록 하겠습니다.

읽어주셔서 감사합니다.

IT/Linux/Kubernetes

Tomcat 8.5.58 설치 + Apache 연동

안녕하세요? ManVSCloud 김수현입니다.

오늘은 Tomcat 설치 및 Apache 연동을 해보겠습니다.
(전에 했던 거 미루고 미루다 이제서야 글을 올립니다)

-. Env
* OS : CentOS 7 + 3.10.0-1127.19.1.el7.x86_64
* Apache : 2.4.6
* Tomcat : 8.5.58
* jdk : 1.8

설치 환경은 위 내용과 같으며 apache와 tomcat만 연동할 것입니다.

-. 기본 설치

yum install httpd httpd-devel -y
yum install gcc autoconf libtool -y
yum install java-1.8.0-openjdk-devel.x86_64 -y
wget http://mirror.apache-kr.org/tomcat/tomcat-8/v8.5.58/bin/apache-tomcat-8.5.58.tar.gz
wget https://downloads.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz

tar zxvf apache-tomcat-8.5.58.tar.gz

tar zxvf tomcat-connectors-1.2.48-src.tar.gz
cd tomcat-connectors-1.2.48-src/native
./buildconf.sh
./configure –with-apxs=/usr/bin/apxs
make && make install

-. /etc/httpd/conf/httpd.conf

LoadModule jk_module modules/mod_jk.so

-. /etc/httpd/conf/uriworkermap.properties

/*.do=ajp13
/*.jsp=ajp13

-. /etc/httpd/conf/workers.properties

# tomcat location
workers.tomcat_home=”/usr/local/src/apache-tomcat-8.5.58″

# jdk
# ll /usr/lib/jvm | grep openjdk
workers.java_home=”/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64″

worker.list=manvscloud

worker.manvscloud.port=8009
worker.manvscloud.host=localhost
worker.manvscloud.type=ajp13

-.server.xml_sample

116 <!–
117 <Connector protocol=”AJP/1.3″
118 address=”::1″
119 port=”8009″
120 redirectPort=”8443″ />
121 –>

152 <Host name=”localhost” appBase=”webapps”
153 unpackWARs=”true” autoDeploy=”true”>

설치한 tomcat의 conf 디렉토리에 server.xml 파일이 있습니다.
기존 server.xml을 백업해두고 아래와 같이 설정값을 변경합니다.

-. server.xml

116 <Connector protocol=”AJP/1.3″
117 port=”8009″
118 secretRequired=”false”
119 redirectPort=”8443″ />

152 <Host name=”localhost” appBase=”/home/manvscloud/public_html/”
153 unpackWARs=”true” autoDeploy=”true” xmlValidation=”false” xmlNamespaceAware=”false”>
154 <Context path=”” docBase=”.” reloadable=”true”/>

-. /home/manvscloud/public_html/index.jsp
tomcat이 apache와 연동되는지 확인하기 위해 테스트를 확인할 index.jsp를 준비합니다.

<%– JSP test.jsp –%>
<%@ page language=”java”%>
<%!
int a= 192;
int b= 168;
%>
<%
int c = 0;
c=a+b;
%>

<html>
<head><title> JSP Test </title></head>
<body>
c= <%=c%>
</body>
</html>

-. /etc/httpd/conf/jk.conf

<IfModule jk_module>
JkWorkersFile “/etc/httpd/conf/workers.properties”
JkMountFile “/etc/httpd/conf/uriworkermap.properties”
JkLogFile logs/mod_jk.log
JKLogStampFormat “[%y %m %d %H:%M:%S]”
JkLogLevel info

JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
</IfModule>

-. /etc/httpd/conf/vhost.conf

<VirtualHost *:80>
DocumentRoot “/home/manvscloud/public_html/index.jsp”
ServerName localhost

JkMount /* manvscloud
JkMount /*.jsp manvscloud
JkMount /servlet/* manvscloud
</VirtualHost>

-. Execution
이제 설정이 끝났으니 실행하여 테스트 페이지가 잘 나오는지 확인해보아야합니다.
int a= 192;
int b= 168;
c = a+b; 를 해두고 c= <%=c%>로 불러냈으니 c는 192+168인 360이라는
결과의 페이지가 나오면 정상적으로 해낸 것입니다.

systemctl enable httpd
systemctl start httpd
/usr/local/src/apache-tomcat-8.5.58/bin/startup.sh

-. 페이지 출력


저같은 경우 기존 VirtualBox에 NAT로 쓰고있던 가상 서버를 이용하여 테스트 하였습니다.

80을 8888로 포트포워딩 해두어 해당 페이지로 이동하면
아파치와 톰캣이 잘 연동된 것을 확인 할 수 있습니다.

정상적으로 테스트를 마쳤습니다.

읽어주셔서 감사합니다.