Browsing Tag

centos7

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로 포트포워딩 해두어 해당 페이지로 이동하면
아파치와 톰캣이 잘 연동된 것을 확인 할 수 있습니다.

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

읽어주셔서 감사합니다.