brunch

2. nhn클라우드- nhn NKS 사용

by Master Seo

<1> nhn NKS 사용해 보자.

<2> NKS 생성 = 클러스터 생성

<3> 각종 툴 설치

<4> 간단한 게임 올려보자.

<5> 정리



<1> nhn NKS 사용해 보자.


한국(평촌) 리전에서 사용

어느 리전이든 상관은 없다.




<2> NKS 생성 = 클러스터 생성


1

Container > NHN Kubernests Service(NKS) > 클러스터 생성



2

mario-nhn-nks

32자 이내로 작성해 주세요.

소문자와 숫자, '-'만 입력 가능하며 소문자로 시작해야 하고 소문자 또는 숫자로 끝나야 합니다.

v1.25.4 (2023-04월 현재)

노드수 2

키페어 기존 것 사용

오토스케일러 사용으로 변경

최소 2

최대 10

클러스터는 최대 3개까지 생성할 수 있습니다.

// 노드수는 4개도 된다. 클러스터는 최대 3개까지 가능하다.

생성에 10분 걸린다.


Centos등 다양한 OS를 지원한다.

다른 CSP와 다른 점이다.



3

kubeconfig 파일 다운로드 한다.


4

기존에 만들어 놓은 명령 서버 (instance)에 접속하여 node 생성 확인

다운로드한 kubeconfig 파일의 내용을 config 파일에 설정을 넣자.


mkdir ~/.kube

sudo vim ~/.kube/config


cd ~/.kube/

more config



5

명령서버에 우선 kubectl 만 설치


curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl


kubectl get nodes



최소 2 node라 2개 work node가 보임


[root@mario-nhn-command1 .kube]# kubectl get nodes

NAME STATUS ROLES AGE VERSION

mario-nhn-nks-default-worker-node-1 Ready <none> 29m v1.25.4

mario-nhn-nks-default-worker-node-2 Ready <none> 29m v1.25.4






<3> 각종 툴 설치


각종 tool을 설치해 유용하게 사용해 보자.


1

kubectl 자동 완성 기능과 alias 사용하기


# 자동 완성 및 alias 축약 설정

source <(kubectl completion bash)

echo 'source <(kubectl completion bash)' >> ~/.bashrc

echo 'alias k=kubectl' >> ~/.bashrc

echo 'complete -F __start_kubectl k' >> ~/.bashrc


bash

k get nodes


[root@kops-ec2 ~]# k get nodes

NAME STATUS ROLES AGE VERSION

i-002186eeab26ccd9a Ready node 27m v1.24.10

i-00d730519589b5519 Ready control-plane 29m v1.24.10

i-0c3ef584d2e10254b Ready node 27m v1.24.10



2

kube-ps1 설치 및 사용- 프롬프트에 Context와 Namespace를 표시


# 설치 및 설정


yum install git -y


git clone https://github.com/jonmosco/kube-ps1.git /root/kube-ps1


cat <<"EOT" >> /root/.bash_profile

source /root/kube-ps1/kube-ps1.sh

KUBE_PS1_SYMBOL_ENABLE=true

function get_cluster_short() {

echo "$1" | cut -d . -f1

}

KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short

KUBE_PS1_SUFFIX=') '

PS1='$(kube_ps1)'$PS1

EOT


sudo su -



# default 네임스페이스 선택

(⎈|default:default) [root@2048game-nhn-web01 ~]# kubectl ns default

Context "default" modified.

Active namespace is "default".



3

krew ?


kubectl cli 플러그인 매니저, 쿠버네티스 크루(krew) 설치

macOS의 brew, Ubuntu의 apt와 비슷한 역할

Krew를 통해 현재 90가지 이상의 플러그인 1을 설치할 수 있다.



# 설치



curl -fsSLO https://github.com/kubernetes-sigs/krew/releases/download/v0.4.3/krew-linux_amd64.tar.gz


tar zxvf krew-linux_amd64.tar.gz


./krew-linux_amd64 install krew


yum install -y tree

tree -L 3 /root/.krew/bin



# PATH 추가

export PATH="${PATH}:/root/.krew/bin"

echo 'export PATH="${PATH}:/root/.krew/bin"' >>~/.bashrc


# krew 확인

kubectl krew update

kubectl krew search

kubectl krew list

kubectl krew install pluginxxxxxx



4

krew로 kube-ctx, kube-ns 설치 및 사용

kube-ctx : 쿠버네티스 콘텍스트 사용


# 설치

kubectl krew install ctx


# 콘텍스트 확인

kubectl ctx

masterseo0.link


# 콘텍스트 사용

kubectl ctx <각자 자신의 콘텍스트 이름>



5

kube-ns : 네임스페이스(단일 클러스터 내에서 가상 클러스터) 사용


# 설치

kubectl krew install ns


# 네임스페이스 확인

kubectl ns


[root@kops-ec2 ~]# kubectl ns

default

kube-node-lease

kube-public

kube-system



# 터미널 1

watch kubectl get pod


# kube-system 네임스페이스 선택 사용

kubectl ns kube-system


# default 네임스페이스 선택 - 디폴트로 변경.

kubectl ns -

혹은

kubectl ns default



설치된 리스트 확인

kubectl krew list


[root@kops-ec2 ~]# kubectl krew list

PLUGIN VERSION

ctx v0.9.4

krew v0.4.3

ns v0.9.4



6

krew로 기타 플러그인 설치 및 사용 : df-pv get-all ktop neat oomd view-secret


# 설치

kubectl krew install df-pv get-all ktop neat oomd view-secret


# get-all 사용

kubectl get-all -n kube-system

kubectl get-all


# ktop 사용

kubectl ktop


10 ktop.png



# oomd 사용

kubectl oomd


[root@kops-ec2 ~]# k oomd

No out of memory pods found in default namespace.




# df-pv 사용

kubectl df-pv


[root@kops-ec2 ~]# kubectl df-pv

INFO[2023-03-13T19:22:57+09:00] Either no volumes found in namespace/s: 'all' or the storage provisioner used for the volumes does not publish metrics to kubelet



# view-secret 사용 : 시크릿 복호화

kubectl view-secret





7

helm 설치

curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash



8

기존에 만들어 놓은 명령 서버 (instance)에 접속하여 필요한 툴을 설치한다.


yum -y install tree jq git htop



wget https://github.com/andreazorzetto/yh/releases/download/v0.4.0/yh-linux-amd64.zip


yum install unzip -y

unzip yh-linux-amd64.zip

mv yh /usr/local/bin/





9

클러스터 와 네임스페이스 변경 유틸?

git clone https://github.com/ahmetb/kubectx /opt/kubectx

ln -s /opt/kubectx/kubens /usr/local/bin/kubens

ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx


kubens



10

watch -d kubectl get ns,svc,deploy,pods


kubectl delete ns sock-shop


kubectl delete deploy --all





<4> 게임을 올려보자



1

마리오 게임을 올려보자

https://brunch.co.kr/@topasvga/3179



2

간단한 2048 tile 게임 올려보자.



1

터미널하나를 더 띠운다. 터미널 2에서 모니터링


watch -d kubectl get ns,svc,deploy,rs,pods

or

watch -d kubectl get all

or

watch -d kubectl get ns,svc,deploy,rs,pods -o wide





2

2048 네임 스페이스 만들기


kubectl create namespace 2048


k ns 2048


(⎈|default:default) [root@2048game-nhn-web01 ~]# k ns 2048



3

디플로이 먼트 생성


cat <<EOF | kubectl create -f -

apiVersion: apps/v1

kind: Deployment

metadata:

name: deployment-2048

spec:

selector:

matchLabels:

app.kubernetes.io/name: app-2048

replicas: 2

template:

metadata:

labels:

app.kubernetes.io/name: app-2048

spec:

containers:

- image: alexwhen/docker-2048

name: app-2048

ports:

- containerPort: 80

EOF



4


NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR

deployment.apps/deployment-2048 2/2 2 2 13s app-2048 alexwhen/docker-2048 app.kubernetes.io/name=app-2048


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR

service/kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 62m <none>


NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

pod/deployment-2048-8445476958-6p798 1/1 Running 0 13s 10.200.38.4 game2048-nhn-nks-default-worker-node-1 <none> <none>

pod/deployment-2048-8445476958-h9xxl 1/1 Running 0 13s 10.200.171.204 game2048-nhn-nks-default-worker-node-2 <none> <none>



5

클래식 로드 밸런서 연결

외부에서 접속

kubectl expose deployment deployment-2048 --port=80 --type=LoadBalancer



6

Every 2.0s: kubectl get all Mon Apr 17 18:16:11 2023


NAME READY STATUS RESTARTS AGE

pod/deployment-2048-8445476958-s59bn 1/1 Running 0 4m50s

pod/deployment-2048-8445476958-xvqf7 1/1 Running 0 4m50s


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

service/deployment-2048 LoadBalancer 10.254.151.41 133.186.203.234 80:31320/TCP 39s


NAME READY UP-TO-DATE AVAILABLE AGE

deployment.apps/deployment-2048 2/2 2 2 4m50s


NAME DESIRED CURRENT READY AGE

replicaset.apps/deployment-2048-8445476958 2 2 2 4m50s




7

웹 접속

방향키로 사용

100 2048.png




8

사용자가 늘어나면 ?


kubectl scale deployment --replicas=10 deployment-2048



9

(선택)


k delete services "deployment-2048"


NodePort 서비스 생성 = 내부에서 접속하는 ip가 나온다.


cat <<EOF | kubectl create -f -

apiVersion: v1

kind: Service

metadata:

name: deployment-2048

spec:

ports:

- name: deployment-2048

port: 10000

targetPort: 80

selector:

app.kubernetes.io/name: app-2048

type: NodePort

EOF



10

설정을 변경하면 웹으로 접속 된다.


변경전

port: 10000

type: NodePort


변경후

port: 80

type: LoadBalancer



11

프로세스 확인

kubectl exec deploy/deployment-2048 -it -- ps axf


[root@2048game-nhn-web01 .kube]# kubectl exec deploy/deployment-2048 -it -- ps axf

PID USER TIME COMMAND

1 root 0:00 nginx: master process nginx -g daemon off;

6 nginx 0:00 nginx: worker process

7 root 0:00 ps axf



12

게임 소스 확인


kubectl exec deploy/deployment-2048 -it -- ls -lRa /usr/share/nginx/html



13

게임 웹 주소 확인


GAMENIP=$(kubectl get pod -l app.kubernetes.io/name=app-2048 -o jsonpath='{.items[0].status.hostIP}')


GAMENPORT=$(kubectl get svc deployment-2048 -o jsonpath={.spec.ports[0].nodePort})


echo -e "GAME URL = http://$GAMENIP:$GAMENPORT"


// node 정보

GAME URL = http://10.0.0.33:31320



14

삭제

kubectl delete deploy,svc deployment-2048




<5> 정리


nodeport로 타입을 하면 2048이 사설 ip로 서비스가 생긴다.

타입을 로드 밸런서로 해야 외부에서 접속 가능하다!




감사합니다.

keyword
매거진의 이전글1. nhn클라우드- 쿠버네티스 서비스를 위한 개발환경