brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Apr 17. 2023

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

<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




# 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

웹 접속

방향키로 사용




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로 서비스가 생긴다.

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




감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari