Browsing Category

IT/Linux/Kubernetes

IT/Linux/Kubernetes category

IT/Linux/Kubernetes

[AKOS] Amazon EKS Study 시작

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

오늘부터 CloudNet@에서 진행하는 AKOS(AWS Kubernetes Online Study)가 시작되었습니다. 2020년도는 Linuxer님, 2021년도는 가시다(Gasida)님과 함께하고 있습니다.

Kubernetes 스터디도 함께 했고 현재는 AWS의 EKS를 공부하고 있으며
Naver Cloud Platform의 NKS는 아마 따로 공부하게 될 것같습니다.


AWS Kubernetes Online Study

이전에 했던 DKOS(Docker Kubernetes Online Study)에 이어 AKOS(AWS Kubernetes Online Study)는 이제 배웠던 Kubernetes 과정을 이해한 뒤 AWS에서의 Kubernetes를 배워보는 시간이었습니다.

클러스터 구축
파드 생성 및 확인
RDS DB 확인

개인적으로 저는 이미 클라우드 환경에서는 AWS보다 Naver Cloud Platform을 이용해 Kubernetes를 먼저 사용해보았기 때문에 NKS가 조금 더 편하게 느껴졌습니다.

사용하기 편하고 쉬운건 Naver Cloud Platform의 NKS고 활용할 수 있는 범위는 넓은데 난이도가 높은 건 AWS의 EKS라고 해야하나? 개인적으로 그렇게 느껴졌습니다.

네이버 클라우드 플랫폼에서는 기본적으로 서비스를 만들 때 사용자가 편하게 사용할 수 있도록 배려하는 부분이 많다보니 아직 기능적인 부분에서는 다소 추가되어야할 부분이 있으나 추가된 이후가 기대되기는 합니다.


Personal Comments

끊임없이 공부하는 습관은 엔지니어에게 정말 좋은 습관이라고 생각합니다.
물론 부하가 생기지 않도록 컨디션 조절도 중요하지만요…

스케줄을 너무 가득 채워서 많은 것을 흡수 하려고 하면 오히려 번아웃이 한 번 찾아와 다시 시작하기가 너무 힘들더라구요.

오늘도 공부하는 엔지니어 분들 수고가 많으십니다.
과하게 하지말고 꾸준히 합시다.

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

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를 적용하는데에 큰 어려움이 없을 거라 생각됩니다.

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

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

IT/Linux/Kubernetes

What is HTTP/2(h2)? & CentOS6 HTTP/2

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

오늘은 CentOS 6에서 HTTP/2를 적용해보려 합니다.
CentOS 6은 2020년 11월 30일 이미 지원이 중단된 OS지만 아직 쓰고 계시는 사용자들이 많아 CentOS 6부터 적용 방법을 작성하기로 했습니다.


WHAT IS HTTP/2(H2)?

현재 HTTP/3 까지 출시되었으나 아직까지 많은 유저들은 1999년에 출시된 HTTP1.1을 가장 많이 사용하고 있습니다.
최근들어 HTTP/2를 적용하는 분들이 늘어나고 있어 HTTP/2에 대해 소개를 해드리고자 합니다.

우선 HTTP/2는 HTTP/1.1을 대체하는 것이 아닌 확장한 것인데 HTTP 메소드, 상태 코드, URI, 헤더 필드를 사용하여 동일하게 유지되고 있습니다.

HTTP/1.1로 시작하여 클라이언트가 HTTP/2를 지원하면 연결이 업그레이드 되는 방식입니다.

https://blog.knoldus.com/still-not-switch-to-http-2/

HTTP1.1은 연결 시 하나의 요청과 응답만 처리하기에 동시 데이터 전송이나 여러개의 리소스를 처리하는데에 속도와 성능이 떨어집니다.(전체 용량에 도달하기 전 여러 번의 소규모 전송으로 인한 지연 발생) 또한 서버와 클라이언트 간에 추가 요청이나 메타데이터 교환으로 반복적인 헤더와 쿠키 전송으로 응답 속도가 느려지는 현상이 나타납니다.

HTTP/2를 사용하게되면 이러한 문제를 해결할 수 있습니다. 클라이언트가 단일 TCP 연결을 통해 다수의 모든 요청을 동시에 보낼 수 있게 됩니다.
다만 무조건적으로 HTTP/2가 좋은 것만은 아니기에 내가 운영하는 서비스가 HTTP/2를 사용하기에 적합한지 판단이 필요합니다.

HTTP/2를 사용하게될 경우 단일 연결을 사용하여 동시 요청을 보내게 됩니다. 이는 예측할 수 없는 스파이크가 발생할 수 있는 원인이 될 수 있습니다. 게다가 HTTP/2 Server Push 기법을 이용하여 클라이언트가 요청하기 전에 서버가 클라이언트로 리소스를 보낼 수 있습니다. 이는 리소스를 선점적으로 로드하는데 도움이 되지만 이 또한 재방문자가 캐시된 파일 복사본이 있을 수 있으며 이 경우 서버에서 리소스를 푸시하지 않도록 Push Cache를 인식하도록 해주어야 합니다.(Cache-Control max-age 등 헤더 적용)

HTTP/2 사용은 응답 시간이 중요하지 않은 애플리케이션, 제한된 IoT 장치나 안정적인 연결이 필요한 곳 그리고 WebSockets, Server-Sent Events (SSE), Pub/Sub 메시징과 같이 적절한 기술이 사용되는 경우 등이 적합하다고 볼 수 있겠습니다.

HTTP/2를 적용하기 위해서는 조건이 있습니다.
만약 Apache를 사용할 것이라면 Apache 2.4.17버전 이상이 이어야하며 openssl 버전도 1.0.2 이상이 되어야합니다. PHP의 경우 libcurl 사용 즉, cURL을 이용하여 HTTP/2 POST를 요청하기 위해서는cURL 7.43 이상, PHP 버전도 5.5.24 이상의 환경이 필요합니다.

오늘은 간단하게 CentOS6에서 Apache로 http2 사용하기를 준비했습니다.


Using HTTP/2 on CentOS 6

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_org
vi /etc/yum.repos.d/CentOS-Base.repo

우선 CentOS6은 지원 중단으로 Base repo를 아래와 같이 변경해주었습니다.

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=https://vault.centos.org/6.10/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#released updates 
[updates]
name=CentOS-$releasever - Updates
release=$releasever&arch=$basearch&repo=updates&infra=$infra
baseurl=https://vault.centos.org/6.10/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
release=$releasever&arch=$basearch&repo=extras&infra=$infra
baseurl=https://vault.centos.org/6.10/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
baseurl=https://vault.centos.org/6.10/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
release=$releasever&arch=$basearch&repo=contrib&infra=$infra
baseurl=https://vault.centos.org/6.10/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

만약 위와 같이 Base repo를 변경했는데도 정상적으로 yum 설치가 되지 않는다면
지원이 중단된 다른 repo가 있는지 확인해보신 후 중단된 repo를 제거 및 yum clean all 후 재진행 해보시기 바라며 그 후에도 되지않는다면 /etc/resolv.conf 에 nameserver가 정상적으로 등록되어 있는지 확인해보시기 바랍니다.

[root@manvscloud ~]# yum update -y
[root@manvscloud ~]# yum install wget perl gcc zlib-devel epel-release -y

위는 필수 설치 패키지 입니다.

기존에 운영하고 계시던 서비스가 존재한다면 yum update 전에 update 시 예외처리가 필요한 패키지들을 반드시 exclude해주시기 바랍니다.

yum update –exclude= 방식으로 exclude할 수 있으며 /etc/yum.conf에 exclude 설정을 해줄 수도 있습니다.


Install openssl and upgrade version

<OpenSSL Site>

openssl부터 설치해보도록 합시다.
CentOS 6은 기본적으로 1.0.1버전의 openssl이 설치되는데 1.0.2를 설치해주기 위해 컴파일 작업을 진행할 것입니다.

// 컴파일 설치 진행
[root@manvscloud ~]# cd /usr/local/src
[root@manvscloud src]# wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz
[root@manvscloud src]# tar zxvf openssl-1.0.2u.tar.gz
[root@manvscloud src]# cd openssl-1.0.2u
[root@manvscloud openssl-1.0.2u]# ./config --prefix=/usr/local/openssl shared zlib
[root@manvscloud openssl-1.0.2u]# make
[root@manvscloud openssl-1.0.2u]# make install

// ldconfig 및 버전 확인
[root@manvscloud openssl-1.0.2u]# echo "/usr/local/openssl/lib" >  /etc/ld.so.conf.d/openssl.conf
[root@manvscloud openssl-1.0.2u]# cat /etc/ld.so.conf.d/openssl.conf 
/usr/local/openssl/lib
[root@manvscloud openssl-1.0.2u]# ldconfig
[root@manvscloud openssl-1.0.2u]# mv /usr/bin/openssl /usr/bin/openssl-1.0.1
[root@manvscloud openssl-1.0.2u]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
[root@manvscloud openssl-1.0.2u]# openssl version
OpenSSL 1.0.2u  20 Dec 2019

// 기존 certs 복사 
[root@manvscloud certs]# cp -avp /etc/pki/tls/certs /usr/local/openssl/ssl/
`/etc/pki/tls/certs/ca-bundle.crt' -> `/usr/local/openssl/ssl/certs/ca-bundle.crt'
`/etc/pki/tls/certs/Makefile' -> `/usr/local/openssl/ssl/certs/Makefile'
`/etc/pki/tls/certs/renew-dummy-cert' -> `/usr/local/openssl/ssl/certs/renew-dummy-cert'
`/etc/pki/tls/certs/ca-bundle.trust.crt' -> `/usr/local/openssl/ssl/certs/ca-bundle.trust.crt'
`/etc/pki/tls/certs/make-dummy-cert' -> `/usr/local/openssl/ssl/certs/make-dummy-cert'

위와 같이 진행해준다면 openssl 버전이 1.0.2로 설치가 된 것입니다!


Apache + apr, apr-util, pcre

yum install -y nghttp2 libnghttp2 libnghttp2-devel gcc-c++ libstdc++-devel expat-devel pcre-devel

이제 HTTP/2 적용을 위한 Apache를 설치해봅시다.

apache 2.4 버전부터는 apr과 apr-util도 설치해주어야하는데 우선 apr 설치 과정입니다.

[root@manvscloud ~]# cd /usr/local/src
[root@manvscloud src]# wget http://mirror.apache-kr.org/apache/apr/apr-1.6.5.tar.gz
[root@manvscloud src]# tar zxvf apr-1.6.5.tar.gz 
[root@manvscloud src]# cd apr-1.6.5
[root@manvscloud apr-1.6.5]# ./configure --prefix=/usr/local/apr
[root@manvscloud apr-1.6.5]# cp -arp libtool libtoolT
[root@manvscloud apr-1.6.5]# make
[root@manvscloud apr-1.6.5]# make install

아래는 apr-util 과정입니다.

[root@manvscloud ~]# cd /usr/local/src
[root@manvscloud src]# wget http://mirror.apache-kr.org/apache/apr/apr-util-1.6.1.tar.gz
[root@manvscloud src]# tar zxvf apr-util-1.6.1.tar.gz 
[root@manvscloud src]# cd apr-util-1.6.1
[root@manvscloud apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@manvscloud apr-util-1.6.1]# make
[root@manvscloud apr-util-1.6.1]# make install

pcre도 설치해줄 건데 이후 modsecurity를 사용하기 위해서도 pcre가 필요합니다.

[root@manvscloud ~]# cd /usr/local/src
[root@manvscloud src]# wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
[root@manvscloud src]# tar zxvf pcre-8.43.tar.gz 
[root@manvscloud src]# cd pcre-8.43
[root@manvscloud pcre-8.43]# ./configure --prefix=/usr/local/pcre
[root@manvscloud pcre-8.43]# make
[root@manvscloud pcre-8.43]# make install

Apache 2.4버전을 컴파일할 모든 준비가 되었습니다.
우선 아래 옵션을 보시면 event방식으로 설치했습니다.

[root@manvscloud ~]# cd /usr/local/src
[root@manvscloud src]# wget http://archive.apache.org/dist/httpd/httpd-2.4.48.tar.gz
[root@manvscloud src]# tar zxvf httpd-2.4.48.tar.gz 
[root@manvscloud src]# cd httpd-2.4.48
[root@manvscloud httpd-2.4.48]# ./configure --prefix=/usr/local/apache \
--enable-mods-shared=all --enable-http2 \
--enable-ext-filter --enable-ssl --with-ssl=/usr/local/openssl \
--enable-so --enable-cache --enable-proxy \
--enable-deflate --enable-suexec --enable-file-cache \
--with-mpm=event --with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--with-pcre=/usr/local/pcre/bin/pcre-config \
--enable-modules=all --enable-module=shared
[root@manvscloud httpd-2.4.48]# make
[root@manvscloud httpd-2.4.48]# make install

(event 방식으로 설치 시 event + fcgi proxy + php-fpm 구조가 일반적입니다.)
왜 event 방식으로 설치했느냐?

prefork 방식은 http/2를 지원하지 않습니다.
prefork 방식이 지원되지 않는 이유는 무엇인가?에대한 질문에 대답은 간단합니다.
HTTP/2는 클라이언트가 단일 TCP 연결을 통해 서버에서는 다수의 모든 요청 즉, 동시 요청을 보내야합니다.

prefork의 단일 스레드 요구 사항을 HTTP/2에 매핑하는 것이 불가능한 것입니다.
처리 모델의 충돌이라고 볼 수있죠. (worker와 event는 다중 스레드 지원)

[root@manvscloud ~]# echo "PATH=$PATH:$HOME/bin:/usr/local/apache/bin" >> /etc/profile
[root@manvscloud ~]# echo "export PATH"  >> /etc/profile
[root@manvscloud ~]# tail -n 2 /etc/profile
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/apache/bin
export PATH
[root@manvscloud ~]# source /etc/profile

/usr/local/apache/bin 아래 명령어들을 편하게 사용할 수 있게 위와 같이 등록해주었습니다.
이제 apache에서 모듈을 추가해줍시다.

// 모듈 확인
[root@manvscloud ~]# apachectl -M | grep http2

//http2 모듈 확인
[root@manvscloud ~]# cat -n /usr/local/apache/conf/httpd.conf | grep http2
   144	#LoadModule http2_module modules/mod_http2.so

//주석 제거
[root@manvscloud ~]# sed -i '144s/#LoadModule/LoadModule/g' /usr/local/apache/conf/httpd.conf

//모듈 적용 확인
[root@manvscloud ~]# apachectl -M | grep http2
 http2_module (shared)

// Protocols 추가
[root@manvscloud ~]# cat << EOF >> /usr/local/apache/conf/httpd.conf 
> <IfModule http2_module>
>         ProtocolsHonorOrder On
>         Protocols h2 h2c http/1.1
> </IfModule>
> EOF

위 작업 후 apachectl start를 하여 apache를 실행해주고 웹사이트가 정상적으로 잘 출력되는지 확인해보시기 바랍니다. Apache가 정상적으로 실행됐는데 페이지 출력이 안되면 iptables가 실행되어있지 않은지? 상단 방화벽 등 어딘가에 막히는 것이 없는지 확인해보시고 그래도 출력이 안되신다면 /usr/local/apache/logs 아래 생성된 로그를 참고하여 해결이 필요합니다.

HTTP2.Pro에서 HTTP/2가 잘 적용되었는지 확인해보니 잘 적용되었다고 나오는군요.
해당 사이트는 아래 링크를 통해 바로 접속이 가능합니다.


Nginx

[root@manvscloud ~]# yum list nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * epel: d2lzkl7pfhq30w.cloudfront.net
Available Packages
nginx.x86_64                                                                                                                         1.10.3-1.el6                                                                                                                         epel

[root@manvscloud ~]# nginx -V
nginx version: nginx/1.10.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=' -Wl,-E'

CentOS 6에서 Nginx는 epel에서 1.10.3으로 주네요.
openssl 버전만 맞춰준 뒤에 yum 설치만 해도 됩니다. nginx -V 옵션으로 보면 –with-http_v2_module 옵션이 보이시나요?

단 Nginx에서 http2 적용 테스트 시 주의할 점이 있다면 아래와 같이 HTTPS(443) SSL 설정을 해줍시다.
listen 80 http2 default_server; 으로 설정할 경우 사이트 접속이 안되고 다운로드가 됩니다.🤣

server {
    listen       443 ssl http2 default_server;
    listen       [::]:443 ssl http2 default_server;
.
. 생략
.
}

CentOS 6에서 Nginx는 크게 어려움이 없을 것으로 보입니다.


Et cetera

나머지는 도움될만한 내용만한 자료만 첨부해두도록 하겠습니다.

cURL은 위 링크를 참고하면 HTTP/2 적용을 위해 cURL을 설치하는 과정이 나와있습니다.
물론 무작정 영상 그대로 따라하기보다 영상에서 주는 옵션을 보며 해당 옵션과 경로가 나의 환경에 맞는지 검토하는 것은 필수입니다.

마지막으로 Tomcat은 className을 org.apache.coyote.http2.Http2Protocol로 설정해주어야합니다.

<Connector port="8080" protocol="HTTP/1.1">
.
. //생략
.
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
.
. //생략
.
</Connector>

Tomcat 역시 버전만 맞춰주면 크게 어려울 것 없어보입니다. 😎


Personal Comments

지금까지 CentOS 6에 HTTP/2를 적용에 대해 알아보았습니다.
앞으로 CentOS 7, Rocky 8, Naver Cloud Platform Load Balancer, AWS ELB 등에서 HTTP/2를 적용하는 방법에 대해서도 추가적으로 포스팅 될 예정입니다.

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

IT/Linux/Kubernetes

[K8S] Study the Kubernetes command in preparation for the CKA

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

요즘 CKA 자격증 준비로 꾸준히 Kubernetes 공부를 하고 있습니다.
CKA 시험은 아무래도 실습 시험이다보니 꾸준히 실습 환경에서 다양한 연습을 필요로 합니다.

오늘은 제가 요즘 공부하고 있는 Kubernetes의 명령어들과 CKA 공부법 및 링크(Docs) 모음을 공유하고자 합니다.


Kubectl 명령어

kubernetes에서 클러스터에 명령을 내리기 위해서는 우선적으로 kubectl 명령어가 익숙해져야합니다. 자주 사용되는 kubectl 명령어에 대해 간단히 알아보도록 하겠습니다.

그런데… 명령어가 아~~~주 많습니다. create 명령어를 공부하기 위해 docs에 들어가서 create페이지를 들어가면 아래 명령어처럼 별거 아닌듯이 나와있지만 스크롤을 아무리 내려도 create가 끝나지 않을 것입니다.

$ kubectl create -f FILENAME

좌측 카테고리를 다시 한 번 봤는데 숨겨진 리스트들이 나오더군요…

처음부터 다~ 외우지 않아도 됩니다.
자주 사용하다보면 자주 사용하는 것들은 손이 익히게 되는 것이니까요?

CKA 시험도 kubernetes.io docs를 볼 수 있게 해주기 때문에 명령어를 한번씩 사용해보고 특정 상황에 맞게 필요한 명령어를 찾아서 사용할 수만 있다면 크게 문제 없을 것이라 생각됩니다.

The most basic commands for importing workloads 📢
  • create
  • get
  • run
  • expose
  • delete
APP MANAGEMENT 🔨
  • apply
  • annotate
  • autoscale
  • debug
  • diff
  • edit
  • kustomize
  • label
  • patch
  • replace
  • rollout
  • scale
  • set
  • wait
WORKING WITH APPS 🚢
  • attach
  • auth
  • cp
  • describe
  • exec
  • logs
  • port-forward
  • proxy
  • top
CLUSTER MANAGEMENT 💻
  • api-versions
  • certificate
  • cluster-info
  • cordon
  • drain
  • taint
  • uncordon
KUBECTL SETTINGS AND USAGE 🔎
  • alpha
  • api-resources
  • completion
  • config
  • explain
  • options
  • plugin
  • version

CKA(Certified Kubernetes Administrator)를 제대로 준비하자!

우선 CKA를 준비하는 지금 docs에서 yaml 파일을 구해서 쓴다기보다 명령어를 이용하여 yaml 파일을 생성하는 연습을 하고 있습니다. 예를 들어봅시다.

네임스페이스는 manvscloud이고 레이블은 name=kim을 사용해야하는 1.12버전의 nginx를 생성조건에 맞게 명령어를 써본다면 아래와 같이 쓸 수 있습니다.

root@cka-k8s-master:/home/k8s# kubectl run nginx --image=nginx:1.12 --labels=name=kim --namespace=manvscloud --dry-run=client -o yaml > nginx.yaml

생성된 yaml 파일을 보면 아래와 같이 생성되어 있습니다.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    name: kim
  name: nginx
  namespace: manvscloud
spec:
  containers:
  - image: nginx:1.12
    name: nginx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

명령어로 yaml 생성에 익숙해진다면 yaml 파일을 생성하지 않고 옵션에 맞게 pod를 생성하는 것도 해봅니다.

root@cka-k8s-master:/home/k8s# kubectl run nginx --image=nginx:1.12 --labels=name=kim --namespace=manvscloud --dry-run=client -o yaml | kubectl create -n manvscloud -f -

이런 방법으로 연습을 해주면 명령어 옵션도 빠르게 익힐 수 있고 이후 yaml에 익숙하지 않더라도 어떠한 옵션을 넣어야하는데 어디에 넣어야할지 모를 때 명령어로 원하는 옵션을 주고 yaml 파일로 뽑아서 확인도 해볼 수 있을 것같습니다.


또 다른 주제로 Multi-container pod 환경에서 확인 방법에 대해서도 적응했습니다.
우선 예시로 Multi-container pod 하나를 생성하겠습니다.

vi multicon.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: multi-con
  name: multi-con
spec:
  containers:
  - image: nginx
    name: nginx-con
  - image: redis
    name: redis-con
  - image: mongo
    name: mongo-con
  restartPolicy: Always

하나의 pod 내에 3개의 컨테이너 이미지가 존재하는 것입니다.

root@cka-k8s-master:/home/k8s# kubectl get pod --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
multi-con   3/3     Running   0          17m   run=multi-con

아래 명령어들로 컨테이너 이미지 목록을 볼 수 있습니다.

root@cka-k8s-master:/home/k8s# kubectl describe pod | grep Image
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9
    Image:          redis
    Image ID:       docker-pullable://redis@sha256:b6a9fc3535388a6fc04f3bdb83fb4d9d0b4ffd85e7609a6ff2f0f731427823e3
    Image:          mongo
    Image ID:       docker-pullable://mongo@sha256:fe44eb6a2ea2bb1548718ec05eb9cb165f1bded37595ebea507bddc413ab99ae

// 레이블이 run=multi-con으로 필터링된 컨테이너 이미지 목록
root@cka-k8s-master:/home/k8s# kubectl get pods --all-namespaces -o=jsonpath="{.items[*].spec.containers[*].image}" -l run=multi-con
nginx redis mongo

그렇다면 하나의 pod안에 다수의 컨테이너가 있다면 어떻게 다를까요?
-c 옵션으로 pod 내에 컨테이너를 지정하여 명령어를 사용하거나 해당 컨테이너로 접속이 가능합니다.

// nginx-con 컨테이너 내에 nginx.conf 파일 여부 확인
root@cka-k8s-master:/home/k8s# kubectl exec multi-con -c nginx-con -- ls -l /etc/nginx/nginx.conf
-rw-r--r-- 1 root root 648 Jul  6 15:11 /etc/nginx/nginx.conf

//mongo-con 컨테이너 접속
root@cka-k8s-master:/home/k8s# kubectl exec -it multi-con -c mongo-con -- /bin/bash
root@multi-con:/#

생각보다 간단하지만 이런 케이스를 경험해보지 않는다면 당황할 수 있으니 어떠한 케이스라도 한번씩 다 해보는 게 중요하다고 봅니다.
(이해하지 못하고 무작정 외우는 건 제가 선호하는 타입이 아니라서…)


마지막으로 하나를 더 알아보겠습니다.

이번에는 마스터의 kubectl, kubelet, kubeadm의 버전을 업그레이드 할 것입니다.
단, 작업 전 예약 불가능으로 설정할 것이며 작업 후 예약 가능하도록 설정해줄 것입니다.
또한 업그레이드 하기 전 유지 관리를 위해 마스터를 drain 해줄 것입니다.

작업 전 master에서 kubernetes 패키지를 확인해보니 현재 kubectl, kubelet, kubeadm 버전은 1.21.1이네요. 해당 버전을 1.21.2로 업그레이드 하겠습니다.

[root@manvscloud-k8s-m ~ (kube:default)]# dpkg -l | grep kube
hi  kubeadm                              1.21.1-00                         amd64        Kubernetes Cluster Bootstrapping Tool
hi  kubectl                              1.21.1-00                         amd64        Kubernetes Command Line Tool
hi  kubelet                              1.21.1-00                         amd64        Kubernetes Node Agent
ii  kubernetes-cni                       0.8.7-00                          amd64        Kubernetes CNI

업그레이드 전 조건이 있으니 우리는 kubectl 명령어 중 cordon, uncordon, drain 을 사용하게 됩니다.

// 아래와 같이 명령어를 사용해주면 해당 노드는 스케줄이 불가능하게 표시됩니다.
[root@manvscloud-k8s-m ~ (kube:default)]# kubectl cordon manvscloud-k8s-m
node/manvscloud-k8s-m cordoned

// 이제 drain을 해주는데 이는 유지 관리를 위해 지정된 노드에 있는 pod들을 다른곳으로 이동시키는 명령어입니다. 자세한 옵션은 kubectl docs를 참고해주세요.
[root@manvscloud-k8s-m ~ (kube:default)]# kubectl drain manvscloud-k8s-m --delete-local-data --ignore-daemonsets --force
Flag --delete-local-data has been deprecated, This option is deprecated and will be deleted. Use --delete-emptydir-data.
node/manvscloud-k8s-m already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-xqbt6, kube-system/kube-proxy-jqvxn
evicting pod kube-system/coredns-558bd4d5db-gv4dn
evicting pod kube-system/calico-kube-controllers-78d6f96c7b-5nnlh
evicting pod kube-system/coredns-558bd4d5db-62njr
pod/calico-kube-controllers-78d6f96c7b-5nnlh evicted
pod/coredns-558bd4d5db-gv4dn evicted
pod/coredns-558bd4d5db-62njr evicted
node/manvscloud-k8s-m evicted

// 이제 1.21.2 버전을 설치해줍시다.
[root@manvscloud-k8s-m ~ (kube:default)]# apt-get install kubeadm=1.21.2-00 kubelet=1.21.2-00 kubectl=1.21.2-00

--- 설치 내용 생략 ---

// 이후 daemon-reload와 kubelet을 재시작 해줍니다.
[root@manvscloud-k8s-m ~ (kube:default)]# systemctl daemon-reload
[root@manvscloud-k8s-m ~ (kube:default)]# systemctl restart kubelet

kubectl, kubelet, kubeadm의 버전이 1.21.2 버전으로 설치되었습니다.

[root@manvscloud-k8s-m ~ (kube:default)]# dpkg -l | grep kube
ii  kubeadm                              1.21.2-00                         amd64        Kubernetes Cluster Bootstrapping Tool
ii  kubectl                              1.21.2-00                         amd64        Kubernetes Command Line Tool
ii  kubelet                              1.21.2-00                         amd64        Kubernetes Node Agent
ii  kubernetes-cni                       0.8.7-00                          amd64        Kubernetes CNI

이제 마스터 노드가 정상적으로 스케줄 예약이 가능하도록 uncordon 해줍니다.

[root@manvscloud-k8s-m ~ (kube:default)]# kubectl uncordon manvscloud-k8s-m
node/manvscloud-k8s-m uncordoned

kubectl get nodes로 마스터 노드 버전을 보시면 마스터 노드의 버전이 1.21.2로 올라 가있는 것을 보실 수 있습니다.

[root@manvscloud-k8s-m ~ (kube:default)]# kubectl get nodes
NAME                STATUS   ROLES                  AGE   VERSION
manvscloud-k8s-m    Ready    control-plane,master   23d   v1.21.2
manvscloud-k8s-w1   Ready    <none>                 23d   v1.21.1
manvscloud-k8s-w2   Ready    <none>                 23d   v1.21.1
manvscloud-k8s-w3   Ready    <none>                 23d   v1.21.1

CKA(Certified Kubernetes Administrator) 공부 시 참고한 링크 모음


Personal Comments

지금까지 CKA 시험에 대비한 kubectl 명령어에 대해 간단하게 알아보았습니다.
다음 포스팅은 etcdctl 명령어로 CKA 공부를 이어서 진행해보도록 하겠습니다.

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

IT/Linux/Kubernetes

[K8S] CKA(Certified Kubernetes Administrator) Study 참고 링크 모음

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

해당 포스팅은 CKA(Certified Kubernetes Administrator)를 공부하며 참고했던 링크들의 모아둔 글입니다.

이 포스팅은 CKA 시험 합격 포스팅이 올라오기 전까지 주기적으로 업데이트 됩니다.


※ A collection of links that have been referenced

🎹 kubectl Commands Reference Docs


Personal Comments

이 포스팅은 주기적으로 업데이트되니 확인하실 때마다 링크가 추가될 수 있습니다.

읽어주셔서 감사합니다.

IT/Linux/Kubernetes

Rocky Linux 8.4 GA (Green Obsidian) 등장!

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

오늘은 좋은 소식이 있어 포스팅을 하게 되었습니다. 2021년 06월 21일 Rocky Linux 8.4 GA가 출시되었습니다. 이전 RC와 GA는 다음 과 같은 차이가 있습니다.

RC(Release Candidate) 즉 베타 버전으로 버그가 발생하지 않는 이상 출시 전 상태라고 보시면 되고 GA(General Availability)은 웹이나 물리적인 환경에서 사용할 수 있도록 출시된 것이라 보면되는데 그렇기때문에 RC는 일반 물리적인 장비에 설치가 되지않는 반면 GA는 설치가 잘 되었습니다.(VirutalBox에서는 RC 설치됨, 다만 서비스 용도로 사용하기 부적절)

엔지니어로서 이런 운영체제가 생기거나 버전업이되거나 할 때마다 설렙니다.
(물론 너무 자주 버전이 변경되면 조금…😐)

NAME="Rocky Linux"
VERSION="8.4 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel fedora"
VERSION_ID="8.4"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.4 (Green Obsidian)"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:rocky:rocky:8.4:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky Linux"
ROCKY_SUPPORT_PRODUCT_VERSION="8"
Rocky Linux release 8.4 (Green Obsidian)
Rocky Linux release 8.4 (Green Obsidian)
Rocky Linux release 8.4 (Green Obsidian)
//appstream 기준
httpd.x86_64                                                                              2.4.37-39.module+el8.4.0+571+fd70afb1  
php.x86_64                                                                                7.2.24-1.module+el8.4.0+413+c9202dda  
mysql.x86_64                                                                               8.0.21-1.module+el8.3.0+242+87d3366a   
mariadb.x86_64                                                                            3:10.3.28-1.module+el8.4.0+427+adf35707 
postgresql.x86_64                                                                             10.17-1.module+el8.4.0+548+9eccbe3f  
redis.x86_64                                                                               5.0.3-2.module+el8.4.0+393+5af13779 
openssl.x86_64                                                                                       1:1.1.1g-15.el8_3 

ROCKY LINUX 8.4 GA

GREEN OBSIDIAN 이라는 이름으로 출시된 ROCKY LINUX 8.4는 출시된지 며칠밖에 지나지않아 물론 어느정도의 버그가 발생할 수 있다는 것도 생각해야합니다.

설치 과정은 Rocky Linux 8.3 RC 버전과 동일합니다.

당장 서비스에 사용하기 전에 여러가지 테스트를 해보는 것만큼 좋은 것이 없습니다.
그렇기때문에 현재 물리 서버에 ROCKY LINUX 8.4 GA를 설치 후 여러가지 환경 테스트와 기존 CentOS 7에서 서비스 하던 것들을 이전 작업을 진행하여 ROCKY LINUX 8.4에서 이상없이 정상적인 운영이 되는지 이상 증상이 발생하지 않는지 검토할 준비가 되어있습니다.

현재 기본적인 환경 테스트는 거의 마무리가 다 되어가고 곧 이전 작업 및 서비스 테스트까지 완료될 예정입니다.

테스트가 끝나면 실제 서비스 사용이나 이전도 고려해볼 수 있으니 문서화 해야겠습니다.

또한 Rocky Linux는 클라우드 환경에서도 사용될 예정입니다.
Cloud Offerings으로 이미 AWS와 GCP가 공식 문서에 올라왔으며 네이버 클라우드 역시 현재 후원 및 파트너로 존재하니 클라우드에서도 Rocky Linux를 사용하게 될 날이 얼마남지 않은듯 합니다.

또한 컨테이너 이미지도 준비 중인 것으로 보입니다.

아직 Docker Hub에 Official Images로는 없는 상태지만 곧 올라올 것같네요.


Personal Comments

모든 테스트가 끝나면 문서화 후 공유하기 좋은 내용들은 추가로 공유하도록 하겠습니다.
요즘엔 할 것이 많네요. 자고 일어나면 늘 새로운 것들이 반기는듯한?…
할 것이 많다는 것은 좋은 것같습니다.

내일이나 모레 중으로 네이버 클라우드의 Container Registry에 대한 포스팅이 올라갈 예정입니다. 현재 임시글 작성은 완료된 상태라 곧 포스팅됩니다.

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

IT/Linux/Kubernetes

YAML language 와 Kubernetes에서 요구되는 필드

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

이번 주 일요일부터 Docker Kubernetes Online Study에서 Kubernetes 소개와 설치가 시작됩니다. 그러므로 오늘은 Yaml 파일에 대한 이해를 돕기 위해 노션에 정리해두었던 Yaml파일에 대한 내용을 정리하여 포스팅해보았습니다.


What is Yaml?

Yaml 또는 Yml 이란 사람이 쉽게 읽을 수 있는 형태로 표현된 데이터 직렬화 양식입니다.

데이터 직렬화는 메모리의 객체를 디스크에 저장하거나 통신하는 대상에게 올바른 형식으로 맞추어 전달하기 위해 바이트 스트림 형태로 만드는 것!
쉽게 말하자면 사람이 읽고 쓰기 쉽도록 만들어진 하나의 약속이라고 볼 수 있습니다.

쿠버네티스 매니페스트는 YAML과 JSON을 사용하게 되는데 주로 YAML을 이용하여 구성 파일을 작성하므로 YAML에 대해 알고 있으면 큰 도움이 됩니다.

  • 역직렬화 : 디스크에 저장된 데이터를 읽거나 네트워크를 통해 전송된 데이터를 받아 메모리에 재구축
  • 바이트 스트림 : 1 byte를 입출력 할 수 있는 스트림, JAVA에서 입출력 스트림을 통해 흘러가는 데이터의 기본 단위 (InputSteam과 OutputStream이 존재)
  • 스트림 : 데이터 처리연산을 지원하도록 소스에서 추출된 연속된 요소이며 데이터를 읽고 쓸 수 있도록 도와준다.
  • 매니페스트 : 컴퓨팅에서 집합의 일부 또는 논리정연한 단위인 파일들의 그룹을 위한 메타데이터를 포함하는 파일 (애플리케이션에 대한 필수적인 정보가 담겨있음)

Grammar

📢 Yaml 문법 포인트

  • Key: Value
  • mappings(해시 or 딕셔너리), sequences(배열 or 리스트), scalars(스트링 or 넘버 등)
  • 각 블록 부모-자식 관계는 들여쓰기로 구분
  • 를 이용하여 시퀀스 사용
  • # 는 주석
  • 는 문서의 시작 (스트림 시작)
  • 는 문서의 끝 (스트림 끝)
  • & 를 이용하여 anchor 설정 (정의)
  • * 를 이용하여 alias 설정 (참조)
  • 띄어쓰기

Scalars
integer: 100
string: “100” 또는 ‘100’
(“”는 이중 문자열, ”는 단일 문자열)
float: 100.0
boolean: yes

(yes/no, true/false, on/off)

→ Example
count: “1”
→ int가 아닌 string

size: ‘3.14’
→ float가 아닌 string

question: ture
→ boolean

answer: “true”
→ string

→ 추가 내용
◎ 값이 비어있으면 null (nil이 아님)
port: “80” 이라고 선언할 수 있으며 템플릿 엔진과 YAML Parser를 정상적으로 통과합니다. 하지만 쿠버네티스가 포트를 integer로 받아야할 경우 실패할 수 있습니다.
이때 YAML 노드 태그를 사용하여 특정 유형 추론을 강제화 할 수 있습니다.
port: !!int “80”
위와 같이 선언할 경우 port가 “”로 감싸져 있어도 int로 취급됩니다.
ex) age: !!str 21 (int가 아닌 string으로 강제)
◎ 추가적인 심화 내용은 아래
TIP의 YAML 기법 링크 참고


Sequences

→ Level 1

- one
- two
- three

Level 2

-
  - Lion
  - Tiger
  - Bear
-
  - Orange
  - Lemon
  - Pear

Level 3

-
  -
    - Golf
    - Soccer
    - Basketball

Mappings

Level 1

Language: English

Level 2

Language: English
  - A
  - B
  - C

Anchor & Alias

Level 1

Linux:
  - linux1: &linux1 centos
  - linux2: &linux2 ubuntu
  - linux3: &linux3 rocky
  - linux4: &linux4 suse

web_linux: *linux1
db_linux: *linux3

Level 2
(<< 를 이용하여 Override(자식 클래스에서 부모 클래스 재정의))

base: &default
  web: apache
  db: mysql
env:
  dev:
    <<: *default
    db: oracle

  prod:
    <<: *default
    web: nginx

⚠️ YAML 앵커 및 별칭은 ‘ [ ‘, ‘ ] ‘, ‘ { ‘, ‘ } ‘및 ‘ , ‘문자를 포함 할 수 없습니다.


Example

Kubernetes에서 퍼시스턴트볼륨을 생성하는 YAML 파일의 예시입니다.
(용량은 25GiB이며 ReadWriteOnce Mode로 생성)

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

In-depth course

CKAD 시험까지 생각하고 있다면 k8s의 yaml 파일 작성법까지 깊게 알아보는 것도 좋지않을까 생각합니다. 생성하고자 하는 쿠버네티스 오브젝트에 대한 YAML 파일 내에 필드 값들을 설정해주게 되는데 그 필드 값에 대한 내용을 알아보도록 하겠습니다.

  • apiVersion
    : 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지

종류
v1
: 쿠버네티스에서 발행한 첫 stable release API
(대부분의 api가 포함되어 있음)
apps/v1
: 쿠버네티스의 common API 모음, Deployment, RollingUpdate, ReplicaSet을 포함
batch/v1
: 배치 프로세스, job-like task를 위한 배포 api
autoscaling/v1
: pod의 autoscale 기능을 포함하는 API, 현재는 CPU metric을 사용한 scaling만 가능
(추후에 alpha, beta version에서 memory, custom metric으로 scaling 기능 추가예정)
batch/v1beta1
: batch/v1에서 cronJob으로 job을 돌리는 api가 추가
certivicates.k8s.io/v1 beta
: 클러스터의 secure network function들이 추가된 API
(TLS 등의 기능 추가)
extensions/v1beta
: Deployments, DaemonSets, ReplicatSets, Ingress 등 상당수 feature들이 새롭게 정의된 API 그러나 상당수의 api들이 apps/v1과 같은 그룹으로 이동되어서, 쿠버네티스 1.6버젼 이후부터는 deprecated 됨
policy/v1beta1
: pod에 대한 security rule이 정의된 API
rbac.authorization.k8s.io/v1
: 쿠버네티스의 role-based access control이 가능한 function이 정의됨

  • kind
    : 어떤 종류의 오브젝트를 생성하고자 하는지 (원하는 kind에 따라 apiVersion 종류가 달라짐)

종류
Pod
: pod을 정의하여 쿠버네티스 선언(아직 배포되지 않은 상태)
ReplicationController(or ReplicaSet)
: 쿠버네티스에 선언된 pod을 배포하기 위한 선언(replicas 갯수, readiness probe 등 선언)
Service
: 동적으로 생성된 pod(각각 다른 ip)을 라벨(label)과 라벨 셀렉터(label selector)을 사용하여 하나의 서비스로 묶어주는 역할
(ex. pod에 라벨이 “wonyoung”이 선언되어 있으면, service는 “wonyoung” label이 붙은 서비스만 골라내서 그 pod간에만 로드벨런싱을 동해 서비스를 외부에 제공)

  • metadata
    : 이름, 문자열, UID, 그리고 선택적인 네임스페이스를 포함하여 오브젝트를 유일하게 구분지어줄 데이터
  • spec
    : 오브젝트에 대해 어떤 상태를 의도하는지

🔑 생성 가능한 오브젝트에 대한 모든 spec 확인

🔑 Pod에 대한 spec 포맷

🔑 Deployment에 대한 spec 포맷


TIP

📌 YAML 기법
📌 YAML 유효성 검사
📌 YAML to JSON
📌 JSON to YAML

Personal Comments

YAML을 전혀 모르던 때에 띄어쓰기 조차 문법인지 몰라서 당황했던 기억이 있습니다.
이 포스팅을 통해 많은 분들이 YAML 문법이 무엇인지 그리고 Kubernetes를 시작하기 전 많은 도움이 되길 바랍니다.

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

IT/Linux/Kubernetes

Docker Kubernetes Online Study 스터디 시작! (Docker의 장점과 Network)

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

CloudNet@에서 진행하는 DOCKER KUBERNETES ONLINE STUDY가 시작되었습니다.
1주차 Docker의 기초를 시작으로 Kubernetes를 제대로 배우게 되어 흥미롭습니다.

지금까지 Docker는 Docker-compose를 이용하여 임의적으로만 사용하거나 kubernetes도 wordpress 사이트를 올려본 것이 전부라 아직 미숙했는데 이번 기회에 깊이있게 공부하고 다양한 테스트를 시작할 수 있게 되었습니다.

오늘 스터디 이전에 정리해두었던 내용 중 몇가지를 포스팅하려 합니다.
Docker의 장점과 네트워크 관련 내용입니다.


Advantages of Docker

한국어 자막 지원합니다.

위 영상은 컨테이너가 무엇인지 알려주는 영상입니다.
한국어 자막도 지원하고 설명이 잘 되어있어 1분 30초만 투자하면 컨테이너가 무엇인지 알 수 있습니다.

도커의 장점 TOP 5
  • 신속한 애플리케이션 배포 – 컨테이너에는 애플리케이션 의 최소 런타임 요구 사항이 포함되어 크기를 줄이고 신속하게 배포 할 수 있습니다.
  • 머신 간 이식성 – 애플리케이션 및 모든 종속 항목을 Linux 커널, 플랫폼 배포 또는 배포 모델의 호스트 버전과 독립적인 단일 컨테이너로 번들링 할 수 있습니다. 또한 이 컨테이너는 Docker를 실행하는 다른 머신으로 전송할 수 있으며 호환성 문제없이 실행할 수 있습니다.
  • 버전 제어 및 구성 요소 재사용 – 컨테이너의 연속 버전을 추적하고 차이점을 검사하거나 이전 버전으로 롤백 할 수 있습니다. 또 컨테이너는 이전 레이어의 구성 요소를 재사용하므로 매우 가볍습니다.
  • 공유 – 원격 저장소를 사용하여 다른 사람과 컨테이너를 공유 할 수 있습니다. 
  • 가벼운 설치 공간 및 최소한의 오버 헤드 – Docker 이미지는 일반적으로 매우 작기 때문에 신속한 제공이 가능하고 새로운 애플리케이션 컨테이너를 배포하는 시간이 단축됩니다.
  • 단순화 된 유지 관리 – Docker는 애플리케이션 종속성으로 인한 노력과 문제의 위험을 줄여줍니다.

Network

root@dkos-master:~# ip route show
default via 192.168.0.1 dev enp0s3 proto static
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.30

제가 docker를 처음 사용했을 때 생겼던 궁금증이었는데 이제는 많은 블로그에 포스팅된 내용이기도 합니다.
docker 설치 및 실행 후 ip route show 또는 ip a 명령어로 확인 시 docker 0의 bridge 네트워크 IP 대역이 default 설정으로 172.17.0.0/16 대역으로 설정되어 있을 것입니다.
이 ip대역 변경이 가능합니다.

/etc/docker 디렉토리 아래 daemon.json라는 .json 파일이 없는데 이걸 만들어주면 됩니다.

root@dkos-master:~# vi /etc/docker/daemon.json

예를 들어 아래와 같은 대역대로 설정해주고 저장합니다.

{
"bip": "10.3.0.1/16"
}
root@dkos-master:~# systemctl restart docker

root@dkos-master:~# ip route show
default via 192.168.0.1 dev enp0s3 proto static
10.3.0.0/16 dev docker0 proto kernel scope link src 10.3.0.1 linkdown
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.30

root@dkos-master:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 10.3.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN

docker를 재시작해주면 설정해줬던 10.3.0.0/16 대역으로 변경된 것을 알 수 있습니다.

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:2a:78:b0:a3 brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.1/16 brd 10.3.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:2aff:fe78:b0a3/64 scope link
       valid_lft forever preferred_lft forever

브리지 네트워크 구성 방법에 대해 자세하게 알고싶으신 경우 아래 링크를 참고하시기 바랍니다.

또한 Docker에서는 다양한 네트워크 작동 방식이 존재합니다.
bridge, host, overlay, macvlan, none 등이 있는데 기본 네트워크 드라이브는 bridge로 설정되어 있으며 각 네트워크 작동 방식에 대해 설명하기에는 내용이 너무 방대하여 간단한 요약만 작성하겠습니다. 더 자세히 알고싶으신 경우 링크를 남겨두었으니 확인해보시기 바랍니다.

  • bridge : 동일한 Docker 호스트에서 통신하기 위해 여러 컨테이너가 필요할 때 사용
  • host : 네트워크 스택이 Docker 호스트에서 격리되어서는 안되지만 컨테이너의 다른 측면을 격리하려는 경우 사용
  • overlay : 통신을 위해 서로 다른 Docker 호스트에서 실행되는 컨테이너가 필요하거나 여러 애플리케이션이 스웜(swarm) 서비스를 사용하여 함께 작동 할 때 사용
  • macvlan : VM 설정에서 마이그레이션하거나 컨테이너가 각각 고유 한 MAC 주소를 가진 네트워크의 물리적 호스트처럼 보이도록해야 할 때 사용
  • ipvlan : ipvlan은 macvlan과 유사하지만 엔드포인트의 MAC 주소가 동일하며 L2 및 L3 모드를 지원합니다.
  • none : 모든 네트워킹을 비활성화, 스웜(swarm) 서비스 사용 불가

아래 링크는 Macvlan과 IPvlan의 차이점을 알 수 있습니다.


TIP

Docker는 단일 컨테이너 관리에 적합하도록 만들어져 있습니다.
컨테이너가 세분화되어 다수의 컨테이너화 된 앱을 사용하게 되면 관리와 오케스트레이션이 어려워집니다. 그렇다면 여기서 오케스트레이션은 무엇입니까?
오케스트라(orchestra)라는 말은 많이 들어보셨으리라 생각합니다.

오케스트레이션은 컴퓨팅, 네트워킹, 리소스 배포, 관리, 배치, 정렬을 자동화합니다.
위 컨테이너를 지휘하고 있는 이미지와 함께 보면 어떤 느낌인지 이해가 가시나요?
다수의 컨테이너가 네트워킹, 보안, 텔레메트리와 같은 서비스를 쉽게 제공하려면 이 컨테이너들을 그룹화해야 할 필요가 있습니다. 그렇기 때문에 Kubernetes, Docker Swarm, Apache Mesos, Nomad 와 같은 툴을 사용합니다.
Kubernetes는 무엇입니까? 컨테이너 오케스트레이션 툴입니다.


Personal Comments

이번 주 일요일부터는 Kubernetes에 대한 내용이 시작됩니다.
아직 화요일인데 벌써 일요일이 기다려지네요.
DKOS 스터디 진행 및 운영 해주시는 모든 운영진 분들에게 감사의 인사 올립니다.

마지막으로 컨테이너는 chroot와 namespace, cgroups과 같은 커널 기반 기술이 사용되는데 이에 대해 잘 설명이 되어있는 사이트가 있어 아래 링크로 공유합니다.

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

IT/Linux/Kubernetes

xcp-ng 8.2 install (xen server)

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

오늘은 XenServer의 무료 버전인 XCP-ng 오픈소스 하이퍼바이저를 설치하도록 하겠습니다.
비유를 하지면 Xen이 Redhat, XCP-ng가 CentOS라고 보면 이해하기 쉬울 것입니다.

XCP-ng를 설치하는 이유는 곧 CloudNet@에서 진행하는 DKOS(Docker Kubernetes Online Study)를 실제 서버에 올려서 운영 테스트까지 하는 것이 목적이기 때문입니다.

서버 여러대 사용하는 것도 조금 아닌 것같고 그렇다고 약 8주간 스터디 동안 클라우드에 테스트용 서버를 계속 올렸다가 스냅샷찍고 내렸다가 반복하는 것도 아닌 것같아서 Xcp-ng를 설치하게 되었습니다.

알고계신가요? 네이버 클라우드도 XenServer으로 만들어졌다는 사실?
Xen Server와 가상화에 대한 개념이 궁금하신 분을 위해 아래 링크를 추가해두었습니다.


XCP-ng Install

XCP-ng는 위 링크에서 .iso파일을 다운로드할 수 있습니다.

설치 진행 시 첫 화면
키보드 레이아웃을 설정하는 곳입니다.
us로 선택하면 됩니다.
OS 설치가 진행되면 디스크에 기존 데이터들이 전부 삭제되니 백업을 하라는 내용입니다.
백업이 필요할 경우 Reboot 그냥 진행하려면 OK를 누르면 됩니다.
라이센스 동의하는지 묻는 내용입니다.
[Accept EULA]를 바로 선택해줍시다.
일반 서버에 설치하면 나오지않습니다.
일반 서버에 설치한 것은 화질이 좋지않아 제가 VirtualBox로 한번 더 이미지 뽑느라 나온 것!
VirtualBox에서 설치하면 가상화 지원에 이상이 있다고 알려주는 내용이니 무시합시다.
스토리지를 선택하는 곳입니다.
참고로 설치 시 최소 용량이 약 46G? 이상이 필요한 것으로 압니다.
일반 리눅스 설치할 때처럼 적게 용량을 주면 설치가 안될 것입니다.
설치한 .iso 파일을 마운트하여 설치하는 것이니 [Local media]를 선택하여 설치합니다.
위에서 선택한 media 설치 소스를 검증하기 위해 테스트할지 스킵할지 물어보는 것입니다.
Skip 해줍시다.
설치 후 XCP-ng Center의 초기 패스워드입니다.
계정은 root입니다.
네트워크 설정을 해줍시다.
DHCP를 체크 해제하고 Static configuration에서 고정 IP 설정이 가능합니다.
Host와 DNS 설정을 해주는 곳입니다.
위 이미지와 같이 원하는 host명과 DNS를 설정합니다.
Time Zone 설정하는 곳입니다.
[Asia]로 설정
[Seoul]을 선택합니다.
현지 시간 결정을 어떻게할지 물어봅니다.
NTP Server를 지정해줄 수 있습니다.
time.bora.net, time.nuri.net 등 공용 NTP 서버는 많으니 원하시는 NTP Server를 등록해주면 됩니다.
설정이 끝났습니다 Install 해줍시다.
이건 추가 패키지 설치할래? 물어보는 건데
추가 패키지 설치할 거 없으면 [No]를 선택하면 됩니다.
설치가 완료되면 위와 같은 화면을 볼 수 있습니다.
이 화면이 메인 화면인 Ctrl+Alt+F1 화면입니다.
Ctrl+Alt+F2는 시스템 메시지 화면이고 Ctrl+Alt+F3부터 아래와 같은 터미널 구경이 가능합니다.
Ctrl+Alt+F3
이건 제가 서버에 XCP-ng 설치 후 XCP-ng Center로 접속한 화면입니다. (XCP-ng-Center-20.04.00.32.msi)

XCP-ng Center는 아래 링크에서 다운로드 및 내용 확인이 가능합니다.


마무리

금일 저녁부터 DKOS가 시작됩니다.
스터디 이후에도 정기적으로 쿠버네티스 학습이 필요할 것으로 보입니다.
XCP-ng를 이용하여 쿠버네티스 Master,Node를 생성하고 각종 테스트 실습을 거칠 예정입니다.

집에 사용하지 않는 PC가 있다면 Xcp-ng를 설치하여 사용하면 생각보다 다양하게 사용할 수 있어 좋습니다.

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

IT/Linux/Kubernetes

Docker Kubernetes Online Study – Ubuntu 20.04 Install

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

CloudNet@에서 진행했던 ANOS 2기 스터디에 이어 DKOS(DOCKER KUBERNETES ONLINE STUDY)의 기회를 얻게되었습니다.

핵심만 콕! 쿠버네티스

위 책을 기반으로 공부를 하게 될 것으로 보이며 스터디가 6월 6일부터 시작되어 Ubuntu 설치와 사전 권장 학습을 진행해야합니다.

오늘은 간단하게 Ubuntu 20.04 설치에 대해서 포스팅했습니다.


Ubuntu 20.04 Install

VirutalBox

VirutalBox는 위 링크에서 다운로드 받을 수 있으며 Ubuntu는 20.04 Server 버전으로 VirtualBox를 이용하여 설치해줄 것입니다.

일단 DKOS-Ubuntu-Master라는 이름으로 생성해주었습니다.
이후 Node를 OS부터 하나씩 설치하지않고 Master를 특정 부분까지 설치 및 설정 해준 뒤 스냅샷으로 Node를 생성할 것입니다.

English 선택
키보드 레이아웃 고르는 것입니다.
저는 Korean으로 선택해주었습니다.
네트워크 설정해주는 곳인데 저는 이곳에서 설정을 해줬습니다.
이후 서버 내에서 설정하는 것도 알려드리겠습니다.
DHCP로 하지않고 고정으로 설정 해보겠습니다.
저는 VirtualBox에서 네트워크 연결 방식을 “어댑터에 브릿지” 으로 설정해두었으므로
위와 같이 설정해주었습니다.
192.168.0.30을 Master IP로 사용할 것입니다.
이전에 CentOS 환경으로 Kubernetes를 설치 및 테스트한 경험이 있습니다.
이전에 테스트 당시 만들어둔 표인데 대충 참고만하면 좋을듯합니다.
Disk 파티션을 설정하는 곳입니다.
Custom storage layout을 선택하면 사용자 설정을 할 수 있지만 저는 그냥 통으로 설치했습니다.
사용자 계정과 패스워드 등을 설정해줍시다.
위 Install OpenSSH Server를 체크해줍시다.
이후 따로 설치해줄 필요없습니다.
설치가 진행되고 이후 update&reboot이 나오면 reboot을 진행해주고 설치를 마무리합니다.
설치가 완료되면 설치 시 생성한 사용자 계정을 통해 접속이 가능합니다.
설치가 완료되었다면 VirtualBox에서 스냅샷을 찍어줍시다.★
스냅샷을 찍어두는 습관은 이후에도 많은 도움이 됩니다.
putty를 이용하여 생성한 OS에 접근
Ubuntu 20.04 설치 완료

Today’s Tips

Ubuntu는 CentOS와 다른 것들이 많았습니다.
저도 Redhat 기반의 경험이 많아 데비안 환경은 조금 불편할 때가 많았습니다.

  • sudo
    (sudo su – 를 하여 root 계정으로 사용할 수 있지만 사용자 계정 환경에 익숙해져보려고 합니다.)
  • apt-get
    (CentOS에서는 패키지관리자가 yum으로 사용되었지만 Ubuntu에서는 apt-get으로 사용해줍니다. +rpm과 dpkg의 차이)

또한 Ubuntu18 이후 버전부터는 네트워크 설정 파일이 yaml 파일로 설정되어있습니다.
/etc/sysconfig/network-scripts/가 아닌 /etc/netplan/ 아래 yaml 파일을 이용하여 네트워크 설정이 가능합니다.

//편의를 위한 root 권한으로 변경
manvscloud@dkos-master:~$ sudo su -
[sudo] password for manvscloud:

//작업 전 백업
root@dkos-master:~# sudo cp -avp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml_org
'/etc/netplan/00-installer-config.yaml' -> '/etc/netplan/00-installer-config.yaml_org'
root@dkos-master:~# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      addresses:
      - 192.168.0.30/24
      gateway4: 192.168.0.1
      nameservers:
        addresses:
        - 168.126.63.1
        search:
        - 169.126.63.2
  version: 2

위 yaml 파일을 보면 설치 시 설정했던 IP와 nameserver 등이 들어가있는 것을 볼 수 있습니다.
위 파일 수정 후 적용은 아래 명령어로 적용할 수 있습니다.

root@dkos-master:~# netplan apply

이후 스냅샷으로 생성한 Node들의 IP 설정을 해줄 때 사용하게 될 것입니다.
추가로 Hostname 변경 방법도 추가해두겠습니다.

//현재 hostname 확인
root@dkos-master:~# hostnamectl status

//hostname 변경
root@dkos-master:~# hostnamectl set-hostname dkos-node1

//hosts 파일 변경
root@dkos-master:~# vi /etc/hosts

network 및 hostname 설정간에 큰 어려움 없으시길 바랍니다.


Personal Comments

Kubernetes 시험 등록 후 다른 여러 일정으로 아직까지 시험을 못보고 있었습니다.
CloudNet@에서 진행하는 DKOS로 쿠버네티스 학습에 조금 더 집중을 할 수 있게 될 것같습니다. 2021-08-17 전에 시험 합격을 목표로 하고 있어 “네이버 클라우드에서의 보안” 포스팅을 제외하고는 쿠버네티스에 몰두할 예정입니다.

기회를 주신 CloudNet@ 팀에 다시 한 번 감사의 인사 올리며 포스팅을 마무리 하겠습니다.
긴 글 읽어주셔서 감사합니다.