NHN Cloud의 Kubernetes 환경을  구성과 활용

NHN Cloud의 Kubernetes 환경을  구성과 활용하기 위해 기본 구성부터 응용까지 쉽게 따라갈 수 있게 정리하고자 한다.

NCR 서비스 활성화

NCR(NHN Container Registry; 컨테이너 이미지 관리) 를 활용하기 위하여 서비스를 활성화 한다.
서비스 활성화하기 위해서 최 상단에 서비스 선택 탭을 클릭하면 Container 그룹이 보이고
여기서 2번째 NCR을 클릭한다.

nhn cloud 서비스 선택
nhn cloud 서비스 선택

클릭을 통해 활성화 하면 왼쪽 메뉴에 Container하위 메뉴에 NCR이 추가 된다.

nhn cloud menu
nhn cloud menu > container > NCR

보안키 생성

NCR 서비스를 활용을 위해 보안키 생성이 필요하다.
보안키 생성을 위해서
우측 상단 계정(email) 부분을 클릭하여 메뉴를 펼친다.
메뉴에서 API보안 설정을 클릭한다.


API 설정
API 보안 설정

API 보안 설정 화면에 진입하면 User Access Key ID 생성을 클릭 > User Access Key ID와 Secret Access Key 생성 클릭 > 확인 을 통하여 보안키를 생성 한다.

User access key ID생성
User access key ID생성
보안키 생성
보안키 생성

 

 

 

 

 

 

 

 

 

 

생성 완료 창에 나오는 키는 Secret Access Key로 패스워드와 같은 보안키 이다.
이를 별도로  메모 해두길 바란다.

Secret Access Key(비밀키) : WfAPOfckkxNebzAf
User Access Key ID : ARpKqDnCahZxzicOUAya

생성 후 API 보안 설정 창으로 돌아오면 새로운 User Access Key ID 가 생성 되어 있다.
User Access Key ID도 메모 해두어야 한다.
이렇게 메모 된 User Access Key ID와 Secret Access Key는 NCR 접속시 ID와 Passwd로 활용 된다.

Kubernetes 클러스터 구성

해당 프로젝트로 이동 후,
왼쪽 메뉴에서 Container > NHN Kubernetes Service(NKS)를 클릭한다.
NKS 화면으로 변경 되면 리스트 위에 클러스터 생성을 클릭한다.
생성 창이 열리면 다음과 같이 설정한다.

  • 클러스터 이름 :  kube-cluster
  • Kubernetes 버전 : v1.25.4
  • 기본 노드그룹 > 공용 이미지 : Ubuntu 20.40 LTS
  • 가용성 영역 : 임의의 가용성 영역
  • 인스턴스 타입 : m2.c1m2
  • 노드수 : 3
  • 키 페어 :  기존 키페어나 새로 생성(.pem)으로 선택한다.
  • 블록 스토리지 타입 : HDD
  • 블록 스토리지크기(GB) :  60

위와 같이 설정하고 클러스터 생성을 누르면 클러스터가 생성된다.

kubenetes 클러스터 생성
kubenetes 클러스터 생성

생성 이후 NKS 리스트에서 생성한 클러스터의 작업상태가 초록색으로 바뀌면 생성 완료 상태가 된다.


Instance 생성 (kube-mgmt)

Kubernetes 및 Image 관리를 위한 Instance 를 생성한다.
왼쪽 메뉴 창에서  Compute > Instance 클릭, 인스턴스 생성 을 클릭하여 인스턴스를 생성 한다.

  • 이미지 > 공용 이미지 : Ubuntu 20.40 LTS
  • 인스턴스 이름 :  kube-mgmt
  • Kubernetes 버전 : v1.25.4
  • 가용성 영역 : 임의의 가용성 영역
  • 인스턴스 타입 : t2.c1m1
  • 인스턴스수: 1
  • 키 페어 :  기존 키페어나 새로 생성(.pem)으로 선택한다.
  • 블록 스토리지 타입 : HDD
  • 블록 스토리지크기(GB) :  20 (기본)
  • 플로팅 IP : 사용
  • 보안그룹 : 원격접속 정보  오픈

    kube mgmt 인스턴스 생성
    kube mgmt 인스턴스 생성



NCR(NHN Container Registry) 설정

NCR은 클러스터 구성을 해서 여러 Instance를  제어하기 위해서 공통의 Conatiner 이미지를 관리 하여야 한다. 이 역할을 수행하는 모듈이  NCR이다. 이를 활용하기 위해서는 우선 활성화를 진행 하여야 한다.
NCR 활성화 : NCR서비스 활성화를 위해 서비스 설정에서 NCR를 선택하여 활성화 한다.

ncr서비스 활성화
NCR서비스 활성화(서비스선택 [탭] > Container > NCR)
NCR활성화는 왼쪽 메뉴 중 Container > NCR 메뉴가 추가 되어있다.

NCR 레지스트리 생성

왼쪽 메뉴 > Conatiner > NCR 클릭하여 NCR>관리 화면으로 이동한다.
파란 바탕의 레지스트리 생성을 클릭한다.

NCR생성
NCR생성
  • 이름 : kube-ncr
  • 용도 : 일반

NCR이 생성 되면, Public URI값을 메모장에 추가함.

Secret Access Key(비밀키) : WfAPOfckkxNebzAf
User Access Key ID : ARpKqDnCahZxzicOUAya
NCR Public URI : d30be173-kr1-registry.container.nhncloud.com/kube-ncr



클라우드 클러스터 운영

kube-mgmt 접속

Computer > Instance 의  인스턴스 목록 중에 kube-mgmt 인스턴스의 접속정보를 확인 한다.

kube-mgmt 접속정보 확인
kube-mgmt 접속정보 확인

접속 정보를 활용하여 terminal 창에서 접속한다.

kube mgmt 접속
kube-mgmt 접속

docker 설치

docker 공식 홈페이지 설치 부분을 참조 하여 설치한다.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

위 shell script는 공식 홈페이지에  게시 된 ubuntu 환경 docker 설치 스크립트이다. 이를 복사하여 설치한다.

설치가 완료 되면 docker version 명령을 실행하여 실행을 확인한다.

kube-mgmt docker 설치
kube-mgmt docker 설치

kubectl 설치

kubectl은 kubenetes를 운영하기 위한 기본 명령어이다.
이를 설치하여 다양한 kubenetes 에 대한 제어를 가능하게 한다.
설치하기 위해서 Kubenetes 공식 사이트를 참조할 수 있다.

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client --output=yaml

위 코드를 terminal 창에 복사하여 설치 할 수 있다. ( 사이트 업데이트 주의)

kube-mgmt kubectl 설치
kube-mgmt kubectl 설치

설치 성공을 확인 하기 위해 kubectl version을 활용한다.


NKS 접근을 위한 설정

현재 kube-mgmt에서 kubectl get nodes하면 어떤 정보 연결 되어 있지 않음을 확인 할 수 있다.

kube-mgmt kubectl 노드 없음
kube-mgmt kubectl 노드 없음

kube-mgmt kubeconfig

연결 할  NKS를 kube-mgmt에 설정하기 위해서 NKS 리스트 중에 kubeconfig 파일을 다운로드 할 수 있다.

kubeconfig.yml 파일을 클러스터에 접속하기 위한 접속 정보가 기입되어 있다.

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMzakNDQWNhZ0F3SUJBZ0lRSjdKUTV6M0xTQ3FINkpCaDVuT3IzakFOQmdrcWhraUc5dzBCQVFzRkFEQVgKTVJVd0V3WURWUVFEREF4cmRXSmxMV05zZFhOMFpYSXdIaGNOTWpNeE1qRTNNVEV3TkRNeldoY05Namd4TWpFMgpNVEV3TkRNeldqQVhNUlV3RXdZRFZRUUREQXhyZFdKbExXTnNkWE4wWlhJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDK3ZseXBOT3ErYzFSd041cUoxM2U5TUtMYnRkWVdZWS8yYXdsdHF1MjIKMDFtMkJ4SmhkcHNGbVlTZ3pkMzhrTXhJQzhiOEZVNHYxS3RlV09FL2tvdHk1am96MXJhMDNGYUZPakFhUi80dQo1NTNWRlBlZTdhYnRadGF0V2xNa1U4RTZlc0VXL2ttTFIzd0RIT05sMVFKVDREd1NsaHFMcXBBZWxsb0txaFJuCnpMNzlVd083Y0ZpTnFNN3VOTUQxTHRJa0I1cFY0Q3g4RTVsZkZ3dzZRK2Myd2ZKNnZFVmd5N0hXNlZDeFl6V3cKMGdtc1RhbEFHV1RRdFJCZXBtMWlUeEJYbEl2Z2ZSNWdmVVF6UUQrVGpvYXJRODZETWFFUzhYK0hLWndxR01oYgovSHRhWVFVRUs4bEs5UDdTMXAwWDlVWnJXUUJGV09SY0dlOEhPdXVlUFhhYkFnTUJBQUdqSmpBa01CSUdBMVVkCkV3RUIvd1FJTUFZQkFmOENBUUF3RGdZRFZSMFBBUUgvQkFRREFnSUVNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUIKQVFBVHIralBYVjR2WVVNVG1Fa1MwYUZzSW5VME1sbHhvRlF4QlNJVEF5bnlhUU5Xa2prdUV4TjhyM3p0Q2lKawpQQ1R6L3RSbTIwQ1BNcFRyNWFLY09QZ3BPYjNXSXZJMEE5VkhyZU4wNU9WUjYvcEVwenYxOGtLTWNud3pkQUlZCkxvemE0Q3RLSS8xdEdWOElJV2dQRFVNTTFkNVkxakFnRUZzVFlxaUQyWTJzSlc2VnQwR3VYSGlaVFRqVWtzMW0KN2xUbXV4YXBRR3lpOXROaUJXSFd2MGovbjYyQnVDaHBJeFRqNXlMMFppS2RYbUJ6TjBDTHJlRWdKZmdQVDNPNwpXbnRPNnJzNkJLdHI5M1JCalYxMnFlL3JsMGwvb1VjUEtCT0ZRM1B3bEttOTJvWWtmS1NTb3F0RTM2eThyc2hsCjc5TVlZSG0vMFpKRG8wakV2R3ZEaUNGYgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
    server: https://13070ad7-nks-kr1.container.nhncloud.com:6443
  name: "toast-kube-cluster"
contexts:
- context:
    cluster: "toast-kube-cluster"
    user: admin
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lRSHhiMXN0U25Ub3FsYlhyeThMOHFKekFOQmdrcWhraUc5dzBCQVFzRkFEQVgKTVJVd0V3WURWUVFEREF4cmRXSmxMV05zZFhOMFpYSXdIaGNOTWpNeE1qRTNNVE0wTVRReVdoY05Namd4TWpFMgpNVE0wTVRReVdqQXBNUTR3REFZRFZRUUREQVZoWkcxcGJqRVhNQlVHQTFVRUNnd09jM2x6ZEdWdE9tMWhjM1JsCmNuTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNERPNE9wVnpsdFN1MElsRk4KZmorT3BWQlc0VmxzQ3BXUFJTelFLRWV1ckFQdTZhSkZQMU1uU1l1dzVFaUVzbUhuVURVN2I4QnVFYklaamRpTAp5QS9mNFJNd1FJUVg1NENzOU9jdFU5NWlrWGhjN3p4VnJabHJQZENURzVqNGU1TlFCWGJ6UnNrQ2JLb1RabndBCmlFcE9CVjd6YWhTeFdBdlpCUDhwN3VMSGNZWHI5dzhIcVkvWlBYdWpUS01hN2g4WTcyOXJSYzU3QU4rVGdhRDAKV0k1M1pkWlFXWEpzdzE5Ym01WFRLVGZsSFFWUzFuVGNzL0IyazBkWFpTMitiMHJaMFhZZXlXTWhQSkkwZWxMVgplZ0dpSkYxKzAzNlFZTGpFUVpKdDFVdUI0SlBIalBMaDFCbWVXdEN3QW9qU1VxWnYvSUNqbFlZa0cvdDI5MUNpClNIL0RBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFBeTNGd295c1d2QXdlNDl6K05wZGJGMWJYVk0KU2liRi8rdmRtM0Vqdk5PcDJPeWt5Y1dXVEFBRHpIN25LUEU2VkdkZkxSRTdyeERUQ1owZ2twOGJTQWJ2ZUQybgpzY01xdi9vZGdGcE1YakRJVFVIUEhWSTBRNUcrTE9oS1Rib0VBVjMvSWI5L1EwZW9Qb0NnKzZjSW1zYnFUbUw0CkVjeWl2UXh1WW9XZ2QwdUUrNUxYOFFJZ0RPbklKOHloNStscVd5Y3ZNeFIyajJCU1FVTzlvRjNMaTVIeTExOHcKZlJVdi9zL3NNTzUvd0RzcDUwS1NNdldTUjlPRTI4QkpxZTUzeHdieHVFR0t2U2doU2dmWHZFK0w1aVdNVGdxWQowNXRyUmdxSDhWcys5TDhCTnRWTHhZS1RQcmlrRnk3UFVCTE9NelNkS05rZllxeCtNZ2Z5WC95Nm0vST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBdUF6dURxVmM1YlVydENKUlRYNC9qcVZRVnVGWmJBcVZqMFVzMENoSHJxd0Q3dW1pClJUOVRKMG1Mc09SSWhMSmg1MUExTzIvQWJoR3lHWTNZaThnUDMrRVRNRUNFRitlQXJQVG5MVlBlWXBGNFhPODgKVmEyWmF6M1FreHVZK0h1VFVBVjI4MGJKQW15cUUyWjhBSWhLVGdWZTgyb1VzVmdMMlFUL0tlN2l4M0dGNi9jUApCNm1QMlQxN28weWpHdTRmR085dmEwWE9ld0RmazRHZzlGaU9kMlhXVUZseWJNTmZXNXVWMHlrMzVSMEZVdFowCjNMUHdkcE5IVjJVdHZtOUsyZEYySHNsaklUeVNOSHBTMVhvQm9pUmRmdE4ra0dDNHhFR1NiZFZMZ2VDVHg0enkKNGRRWm5sclFzQUtJMGxLbWIveUFvNVdHSkJ2N2R2ZFFva2gvd3dJREFRQUJBb0lCQVFDZjZhd1ZVWnhMZ1lROQplT3ZITndBbUFvQ3hYQThFRHBZdjYxeXFaN1VRa1NqQnRvRmxSVVlNaHB3Mno4SXFlWXNUSGQrQ2l2QlpNa3JhClpTSlhJVGFad01lWlR4VDJhQkNuTmdwK21iWkpVamVRRjlVR1pGVStsbkRZd0V2QzZpdnVoVEQ2NHUvWGlXNmsKZUpFWkxWSFNSRnhoaGpRQWVvMmd1L1N3REgxQjUyY1ZNZzN5dWIvdVFGYW0xamVwcmx6VGd3Y3FFbzl2VEx6SgpCN29kc09ZcjArNkZsWjQrcko3TGpBVzV5SlFOY1pjU3UzS3VzdWtBcng3NDUvYzdJZmNZZGVWNXpRWUhWZklwCjBJQXdxaSsyKzFJN0VSZjIyZlFsSU5zNjhOTEJwNnh2eE9POFc3V255M1kvZUlmeGNKVkJ1bDF1Qk1ja3RkWnYKalBvelRwQXhBb0dCQVBUS0V5ZUxTOFFxdE5GMzNreUw2S0plY0pEcllIVEpXYnJHVkx6dW5QN2FhVGVJVUl5QwpqZVZlQml0Vk9WSy8ycTFON2tuWkN3RzNYQzliZ09SN2s3R3NmRE41dlB1Rnh3UmVhSko3eVlLTVZGOTU4NDY0CnhBbi9ackFiZjVsQ0FhZDZXN0ZldWF6b0RpaytzanlIajdoeWc5MTRlblFHK2swbUgwTVMwYU1QQW9HQkFNQjYKdjhudmxnL28rbUx4SGRXQytQcEZGWGRzZ3VCamlzUVAwK3d3ZTdHNVgzSUYrakJJZTJOK0tQSE1haG5La2trdQplMVBJRlZZMHg2Yzg4MmFEMFJoYU9VTEJCT04wdmRBV1lpQ1hYSFdNZ1lqNU85RkZZY1l5TzcrLzg0QVZTeW5nCjZOYjVWaG9VMis5anB1UEtyc0lpL0dVcEdZVGJwQ3ZDcTl3L3lVZ05Bb0dCQUs2Y0ppV2kreHlteWV4UThNVHgKVjdQYVliazk3TVBoakp2cU5TKy9sVVZGVHFCS0lBcmFaWlVqQ0l1SWN5ZFBxeERMOGhuRE5GSzVGSXpEWEtHZQpkSy9jTll3U1huZWI2V1o0WVdkNzNUVytHOEV2SUVqQ0N6U0dkaDFRd0NmMktXL3BtOVpkbDF4Nit2NzR0Zkx2ClQ5bGw5aUhZZXFDaENaSldpeDR4SWxDSkFvR0JBSWQvNGpRT2JkMlZiVzdwdnM3bi9NNXlnOEltcVp1OWQ1cSsKYWJvRUI0LzlwNnRsZWRNenMyay9EeVBwZTJmY3EwN0pZaGlBNmtSZHM0K1A0T2x5TW1pcVcxVWEvSTREU1B5TQpSVmdjTmdLcWZ5WW1EbTRzSWNDYzdHTDRoanJNd3JVZ2w4bCtqWmFleUpXbDJYN1MyR1BpclR1cHkwVTBPa1owCkxQaElEektoQW9HQVhQMjl1ZDBmWVkyeFRrTUJMYys1RWRyMVo1amp1NlRocG5IMU1iNUlWbEZvb2tyYTBaSEcKK09WbVduTWdCeWJpSWlUbURjMzB2OU5QKzNubERMMk9zY0tlbEhic0JFSXJSRTJ0VTZBUERESjZJb2trK2l1Nwpub3BTOWdDNEwwWHFzTHB1WXNWUnAzbHJVR0F0YUUxKzh4WUtOVU1IamRyM3dvSCt6K0ZDUVNNPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=이

이 파일을 다운로드 받아 nodepad와 같은 편집기로 열어 Terminal 창의 에디터에 copy&pasts 할 수 있다.
복사하기 위해 먼저 root계정 홈 디렉토리에서 .kube 디렉토리 생성하고  .kube 디렉토리 이동 한 뒤 vi config로 파일 편집한다.

kube-mgmt kubeconfig 추가
kube-mgmt kubeconfig 추가

ls -al 명령어로  config 파일에 붙여넣기가 성공한 것을 알 수 있다.
이제 kubectl get nodes 명령어를 통해 클러스터 정보에 연결 된 것을 확인 할 수 있다.

kube-mgmt getnodes 확인
kube-mgmt getnodes 확인

위와 같이 클러스터에 연결 된 3개의 node를 확인 할 수 있다.
같은 정보를 Compute > Instance 의  인스턴스 리스트에서도 확인 할 수 있다.

kube-mgmt getnodes 확인
kube-mgmt getnodes 확인

NCR 설정
NCR은 클러스터의 인스턴스들을 동시에 업그레이드를 하기 위해 Container Image를 저장하고 버전관리를 해주는 모듈이다. 이를 활용하여 Container 이미지를 생성하고 업그레이드 하는 방법을 알아보자.

우선  kube-mgmt 인스턴스의 docker가 NCR에 접근 가능하여야 하므로 접근권한 부여가 필요하다.

Docker NCR 접근권한 부여

NCR에 접근하기 위해서는 아까 메모 해 둔 접속 정보를 활용해야 할 차례이다. 먼저 메모해둔 접속정보를 확인한다.

User Access Key ID : ARpKqDnCahZxzicOUAya 
Secret Access Key(비밀키) : WfAPOfckkxNebzAf 
NCR Public URI : d30be173-kr1-registry.container.nhncloud.com/kube-ncr

docker 접근 명령어를 확인하기 위해서는 NCR 리스트 중 특정 NCR를 선택한다.
선택 되면 아래 상세 기본정보가 나오는데 여기서 Docker 접근 명령어를 확인 한다.

NCR접속정보
NCR기본정보 > Docker 접근 명령어

Docker Login

위 이미지에 있는 접근 명령어를 Terminal 실행 하면 Username, Password 를 물어 본다
이는 위 메모해두었던 USer Access Key , Secret Access Key를 복사한다.

NCR접속
NCR 접속

Docker Image  준비

NCR에 Docker Image를 업데이트하는 테스트를 하기 위해
잘 알려진 nginx Image를 가져와 Image를 업데이트하는 테스트를 진행 하고자 한다.

docker pull nginx
docker images #이미지 확인
docker run -d --name=container_nginx --network=host nginx #nginx 실행
docker ps -a
curl localhost
docker_image_run
docker_image_run

curl로 웹서버가 잘 작동하는 것을 확인 할 수 있으며,  kube-mgmt 인스턴스의  플로팅IP를 참고 하여 브라우저에서도 실행 되는 것을 확인 할 수 있다.

docker_image 실행 부라우저 확인
docker_image 실행 브라우저 확인을 위한 플로팅 IP확인
docker_image 부라우저 확인
docker_image 브라우저 확인



Docker Image 변경

docker cp container_nginx:/usr/share/nginx/html/index.html ./index.html
vi index.html # nginx를 container_nginx 1.0으로 변
docker cp ./index.html container_nginx:/usr/share/nginx/html/index.html
docker image container_nginx 1.0
container_nginx 1.0

Conatiner 내 index.html 파일을 꺼내와
index.html 파일 내부의 타이틀들을 nginx에서 container_nginx 1.0으로 변경 하였다.
이를 S/W 업데이트 행위라고 생각하자.
index.html 파일을 cp 명령어를 써서 다시 container 안으로 넣는다.

자 이제 브라우저로 확인해보자.

docker_image_brw_run_1.0
docker_image_brw_run_1.0

Docker Image  등록

Docker Image를 NCR에 등록하기 위해서는 우선 docker 에서 실행 되고 있는 container를  이미지화 해야 한다.
이를 위한 실행 명령어는 docker commit 이 준비 되어 있다.

docker commit container_nginx ncr-nginx:latest
docker image

위 명령어를 실행하면 실행 중인 container 이미지가 docker(local) image에 ncr-nginx 최종버전으로 저장 된다.
docker(local)에 저장 된 이미지를  docker images로 확인 가능하다.

docker_image_commit
docker_image_commit

NCR에 Image 등록

이제 local docker에 등록되어 있는 이미지를 NCR로 등록 하기 위해서는 이미지명에 대한 체계에 따라야 한다. 이미지명 체계는 (NCR URI)/(이미지명):(버전)과 같다. NCR URI를 확인하기 위해 메모해 두었던 정보를 소환한다.

User Access Key ID : ARpKqDnCahZxzicOUAya  
Secret Access Key(비밀키) : WfAPOfckkxNebzAf 
NCR Public URI : d30be173-kr1-registry.container.nhncloud.com/kube-ncr

위 메모해 둔 NCR URI정보를 활용하여 다음 명령어를 통하여 NCR에 이미지 등록한다.

docker tag ncr_nginx:latest d30be173-kr1-registry.container.nhncloud.com/kube-ncr/ncr_nginx:1.0
# docker tag 정보를 등록한다.
docker push d30be173-kr1-registry.container.nhncloud.com/kube-ncr/container_nginx:1.0

docker_image_push

성공적으로 NCR에 Image를 등록하였으면 이를 확인하기 위하여 NCR 목록 중 해당 NCR의 이미지보기>> 아티팩트보기 를 클릭한다.
레지스트리 > kube-ncr > kube-ncr / ncr_nginx 에서  확인 할 수 있다.

docker_image_push_chk
docker_image_push_chk

Image 업데이트
container 를 업데이트 한다는 것은 개발 등 추가/보완 작업으로 코드가 변경 되는 상황이라 생각할 수 있다.
위에서 했던 작업 처럼 container 의 파일을 복사하여 수정(타이틀 container_nginx 2.0)하고 다시 container 안에  복사 하여 업데이트 할 수 있다.
docker_image_2.0

 

docker_image_brw_run_2.0

 

 

 

 

 

 

 

 

 

 

 

 

웹브라우저를 통하여 2.0으로 업데이트 된 container 를 확인 할 수 있습니다.
업데이트 된 container 이미지를 commit하여 다시 NCR Image 등록하여 업그레이드 한다.

docker commit container_nginx d30be173-kr1-registry.container.nhncloud.com/kube-ncr/ncr_nginx:2.0 # docker에 commit 하여 local image를 등록한다.
docker push d30be173-kr1-registry.container.nhncloud.com/kube-ncr/ncr_nginx:2.0

위와 같은 명령어를 실행하면 NCR에 성공적으로 업로드 된다.
docker_image_commit_2.0

위 이미지를 보면 push 명령어를 실행하면 index.html 변경에 따른 추가부분만 업로드 하는 것을 확인 할 수 있다.

NHN Cloud 의 NCR 목록에서도 추가 된 이미지를 확인 할 수 있다.
docker_image2.0_push_chk

이제 Container Image를 변경하고 업로드 하는 방법을 알아 보았다.
이렇게 등록 된 Container Image를 활용하여 Cluster로 배포하는 방법을 알아보자.


Kubernetes 배포

NHN Cloud의 Kubernetes 환경을  구성과 활용하기 위해 가장 중요한 것은 배포이다.
배포 작업 단위는 POD이다. kubectl get nodes 명령을 이용해 POD 클러스터 구성을 확인한다.

kube-mgmt getnodes 확인

이제 kubectl 에서 NCR에 접근가능 하게 설정이 필요하다.

kubectl의 NCR 접근 권한 설정

kubectl이 NCR 접근을 하기 위해서는 메모 해 둔 Key정보를 활용할 수 있느나, 아래와 같이 기존 docker에 등록 된 정보를 바로 활용할 수 있다.

kubectl create secret generic regcred --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson  #접근권한 등록
kubectl get secrets regcred  #접근권한 등록확인
kubectl describe secrets regcred #적근권한 상세정보 확

kubectl_ncr_reg

 

배포 스크립트 작성

접근권한이 설정 완료 되면 이 권한을 통하여 deploy 할 수 있다. deploy하기 위한 deployment를 작성하는 방법은 다음과 같다.
아래 yaml파일을 ncr_nginx-deployment.yaml 파일로 저장한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ncr-nginx-deployment
  labels:
    app: ncr_nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ncr_nginx
  template:
    metadata:
      labels:
        app: ncr_nginx
    spec:
      containers:
      - name: ncr-webserver
        image: d30be173-kr1-registry.container.nhncloud.com/kube-ncr/ncr_nginx:1.0  #NCRURL
        ports:
        - containerPort: 80
      imagePullSecrets:
      - name: regcred     #NCR Secret

kubectl_deploy

이제 배포 스크립트를 kubectl에 적용시키는 방법을 알아보자.

kubectl 배포 적용

kubectl 적용은 간단하다.
kubectl apply -f ncr_nginx-deplyment.yaml  명령을 terminal 창에 실행한다.

kubectl_deploy_ok

배포가 성공적인지 확인하기 위해 pods중 하나의 서버에 접속하여 curl localhost를 실행하여 html code를 확인하면
1.0 버전이 성공적으로 업데이트 되어 있음을 확인 할 수 있다.


LoadBalancer 설정

kubernetes  cluster 에 구성되어 있는 3개의 node를 트래픽을 적절하게 분산할 수 있도록 LoadBalancer기능을 간단하게 설정 할 수 있다. 다음과 같은 명령어를 통하여 설정 할 수 있다.

kubectl expose deployment ncr-nginx-deployment --name=ncr-nginx-lb --port=80 --target-port=80 --type=LoadBalancer
kubectl get services -o wide
root@kube-mgmt:~/.kube# kubectl get services -o wide
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE     SELECTOR
kubernetes     ClusterIP      10.254.0.1      <none>            443/TCP        5h37m   <none>
ncr-nginx-lb   LoadBalancer   10.254.29.106   133.186.132.131   80:31695/TCP   14m     app=ncr_nginx
root@kube-mgmt:~/.kube#

위 실행 결과로 LoadBalancer 가 잘 동작하고 있는 것을 확인 할 수 있다. 위 외부 IP정보는 LoadBalancer 설정으로 자동 생성 되는 플로팅 IP로 이 IP를 통하여 LoadBalancer 적용된 Site에 접속 할 수 있다.

loadbalancer_brw_run_1.0

 

Cluster환경에서 Image 업데이트 및 배포

Kubenetes  pod에 새로운 Image를 업데이트 할 수 있다. pod단위 업데이트를 하기 위해서 다음 명령어를 실행한다.

root@kube-mgmt:~/.kube# kubectl set image deployment/ncr-nginx-deployment ncr-webserver=d30be173-kr1-registry.container.nhncloud.com/kube-ncr/ncr_nginx:2.0
deployment.apps/ncr-nginx-deployment image updated
root@kube-mgmt:~/.kube# kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
ncr-nginx-deployment-57494986cc-khl8d   1/1     Running   0          66s
ncr-nginx-deployment-57494986cc-ncdv8   1/1     Running   0          56s
ncr-nginx-deployment-57494986cc-s8dbx   1/1     Running   0          61s
root@kube-mgmt:~/.kube# kubectl get services -o wide
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE     SELECTOR
kubernetes     ClusterIP      10.254.0.1      <none>            443/TCP        5h47m   <none>
ncr-nginx-lb   LoadBalancer   10.254.29.106   133.186.132.131   80:31695/TCP   23m     app=ncr_nginx

위 command를 실행하면 간단하게 2.0으로 업데이트 수행 할 수 있다.

결론

NHN Cloud의 Kubernetes 환경을  구성하고 활용 하기 위해 단계적 접근으로
NCR을 통하여 Container Image를 등록하고
이 Image를 다시 Pod에 배포하고 업데이트 하는 과정을 알아 보았다.

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

 Google Map 정보를 활용 한 출퇴근 정보 정리 Python code  개발

Leave a Comment