본문으로 건너뛰기

· 약 1분
Andes Noh

scripts#

@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
    echo 관리 권한을 요청 ...
    goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"


    "%temp%\getadmin.vbs"
    rem del "%temp%\getadmin.vbs"
    exit /B


:gotAdmin
pushd "%CD%"
    CD /D "%~dp0"
:-------------------------
call C:\ABCD\EFG.bat or call C:\ABCD\EFG.exe
  • 마지막 라인에 실행할 .exe파일이나 .bat파일 설정

실행#

  • bat파일 작성
  • 실행

· 약 2분
Andes Noh

현상#

  • port
  • wsl내부에서 서버 프로그램 or 포트포워딩을 통해 포트 개방
  • 일반적으로 wsl과 local pc의 포트는 연결되지만 wsl에서만 포트가 열리고 local에서는 안되는 현상 발생
  • 이러한 현상을 아래의 스크립트를 통해 단편적으로 해소 가능

scripts#

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if( $found ){  $remoteport = $matches[0];} else{  echo "The Script Exited, the ip address of WSL 2 cannot be found";  exit;}
#[Ports]
#All the ports you want to forward separated by coma$ports=@(AAAA,BBB,CC,D);

#[Static ip]#You can change the addr to your ip config to listen to a specific address$addr='0.0.0.0';$ports_a = $ports -join ",";

#Remove Firewall Exception Rulesiex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
#adding Exception Rules for inbound and outbound Rulesiex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){  $port = $ports[$i];  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";}
  • $ports=@(AAAA,BBB,CC,D) 위치에 로컬pc로 포트포워딩 하길 원하는 포트번호 입력

실행#

  • PowerShell 관리자 모드로 실행
  • 스크립트 파일 위치 이동
  • .\FILE_NAME 으로 파일 실행
  • 일시적이지만 wsl과 local pc의 포트는 서로 열린다

· 약 2분
Andes Noh

선행조건#

  • k8s설치
  • ns 생성
  • aws profile 등록

aws profile 등록 방법#

  • 프로필 구성

    aws configure
  • 프로필 구성 데이터 설정(아래와 같이 따로 지정 혹은 터미널을 확인하면 값 입력)

    aws configure set aws_access_key_id XXXXXXXXXXX \aws configure set aws_secret_access_key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \aws configure set region ap-northeast-2 \aws configure set output json
  • 이름 설정이 필요할때는 --profile 옵션을 추가로 준다

aws configure --profile TESTUSER

Script#

  • default aws configure
ACCOUNT=xxxxxxxxxxxxREGION=xx-xxxx-xSECRET_NAME=${REGION}-ecr-registryEMAIL=email@email.comNAMESPACE=xxxx
#
# ~/.docker/config.json 생성
aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin \ ACCOUNT.dkr.ecr.REGION.amazonaws.com
#
# Create or replace registry secret
#
kubectl create secret SECRET_NAME aws -n NAMESPACE \ --from-file=.dockerconfigjson=$home.docker/config.json \ --type=kubernetes.io/dockerconfigjson
  • 특정 프로필로 자동 갱신 및 시크릿 생성 경우
ACCOUNT=xxxxxxxxxxxxREGION=xx-xxxx-xSECRET_NAME=${REGION}-ecr-registryEMAIL=email@email.comNAMESPACE=xxxx
#
# ~/.docker/config.json 생성
aws ecr get-login-password --region REGION --profile NAME | docker login --username AWS --password-stdin \ ACCOUNT.dkr.ecr.REGION.amazonaws.com
#
# Create or replace registry secret
#
kubectl create secret SECRET_NAME aws -n NAMESPACE \ --from-file=.dockerconfigjson=$home.docker/config.json \ --type=kubernetes.io/dockerconfigjson

crontab#

  • 12시간마다 토큰이 만료되기때문에 crontab로 위의 스크립트를 등록시켜 토큰 자동 갱신 및 시크릿 재생성

· 약 2분
Andes Noh

pem이란#

  • Privacy Enhanced Mail Certificate
  • 1993 IETF 표준 세트를 기반으로 암호화 키, 인증서 및 기타 데이터를 저장하고 보내기 위한 사실상의 파일 형식
  • 이메일용으롤 만들어 졌으나, 리눅스 접속 파일로 많이 쓰임

ppk로 변경#

  • mac#

    brew install putty
    • xcode-select --install 이라는 에러 발생시 xcode 설치
    puttygen key.pem -o key.ppk
    • 위의 명령어를 사용해 pem을 ppk 방식으로 변경후 putty를 통해 접속
    • auth에 ppk 등록후 기존의 putty 사용법처럼 접속
  • window#

    • puttygen 실행(없으면 설치)

    • ppm 파일 load(모든파일로 필터 변경할것)

    • save private key 선택

    • auth에 ppk 등록후 ssh 접속

terminal#

  • pem을 사용하여 바로 접속도 가능
ssh -i key.ppm user@host
  • key.ppm: ppm파일
  • user@host: 서버 접속 아이디 및 주소

· 약 1분
Andes Noh

환경#

  • A(localhost), B, C 라는 pc or 서버 or 통신기기가 존재
  • A는 B에 접근 가능 (ssh 접속)
  • B는 C에 접근 가능
  • A는 C에 바로 접근 불가

ssh 터널링#

  • 위와 같은 환경일때 A에서 C로 접근 가능하게 하는 옵션

사용법#

$ ssh [USER]@[HOSTNAME] -p[port] -L [LOCAL_PORT]:[DESTINATION_IP]:[DESTINATION_PORT]
  • local_port: A에서 사용할 포트
  • destination_ip: C의 아이피
  • destination_port: 연결할 C의 포트

· 약 2분
Andes Noh

순서#

  • vpc 구성(1)#

  • eks cluster 생성(2)#

  • worknode 생성 및 확인(3) - ★#

  • eks 삭제(4)#

worknode 생성 및 확인#

  • 노드 그룹용 role 생성#

    • iam -> 역할 -> 역할 만들기
    • 세팅 setting
    • 권한() auth
    • 역할 이름 확정 및 생성

  • 노드 그룹 추가#

    node group

  • 노드 그룹 구성#

    • 세팅 setting
      • 이름 및 노드 그룹용 역할 선택
    • 다음

  • 컴퓨터 및 조정 구성 설정#

    • 세팅 setting
    • 나머지 그대로, 노드 그룹 조정 크키의 최대 크기 2 -> 3으로 변경
    • 다음

  • 네트워킹 지정#

    • 세팅 setting
    • 서브넷 -> private 서브넷 2개 선택
    • 노드에 대한 SSH 엑세스 구성 활성화
    • SSH 키페어 -> vpc 구성하면선 만든 Bastion 서버 키선택
    • 보안 그룹 -> Bastion-SG 선택
    • 위 과정을 통해 Bastion 서버에서 worknode로 ssh 접속 가능

  • 생성 완료(수분 소요)#

    • 생성완료 complete

  • Bastion 서버 접속 및 user 등록#

    • ssh -i 'Bastion.pem' ec2-user@ip로 접속
    • aws configure로 user 등록

  • kubectl 설치 및 확인#

curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/amd64/kubectlchmod +x ./kubectlmkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/binecho 'export PATH=$PATH:$HOME/bin' >> ~/.bashrckubectl version --short --client

  • eksctl 설치 및 확인#

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmpsudo mv /tmp/eksctl /usr/local/bineksctl version

  • kubeconfig update#

aws eks update-kubeconfig --region '지역이름' --name 'eks 클러스터 이름'

  • 클러스터 및 노드 확인#

    check

· 약 2분
Andes Noh

순서#

  • vpc 구성(1)#

  • eks cluster 생성(2)#

  • worknode 생성 및 확인(3) - ★#

  • eks 삭제(4)#

worknode 생성 및 확인#

  • 노드 그룹용 role 생성#

    • iam -> 역할 -> 역할 만들기
    • 세팅 setting
    • 권한() auth
    • 역할 이름 확정 및 생성

  • 노드 그룹 추가#

    node group

  • 노드 그룹 구성#

    • 세팅 setting
      • 이름 및 노드 그룹용 역할 선택
    • 다음

  • 컴퓨터 및 조정 구성 설정#

    • 세팅 setting
    • 나머지 그대로, 노드 그룹 조정 크키의 최대 크기 2 -> 3으로 변경
    • 다음

  • 네트워킹 지정#

    • 세팅 setting
    • 서브넷 -> private 서브넷 2개 선택
    • 노드에 대한 SSH 엑세스 구성 활성화
    • SSH 키페어 -> vpc 구성하면선 만든 Bastion 서버 키선택
    • 보안 그룹 -> Bastion-SG 선택
    • 위 과정을 통해 Bastion 서버에서 worknode로 ssh 접속 가능

  • 생성 완료(수분 소요)#

    • 생성완료 complete

  • Bastion 서버 접속 및 user 등록#

    • ssh -i 'Bastion.pem' ec2-user@ip로 접속
    • aws configure로 user 등록

  • kubectl 설치 및 확인#

curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/amd64/kubectlchmod +x ./kubectlmkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/binecho 'export PATH=$PATH:$HOME/bin' >> ~/.bashrckubectl version --short --client

  • eksctl 설치 및 확인#

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmpsudo mv /tmp/eksctl /usr/local/bineksctl version

  • kubeconfig update#

aws eks update-kubeconfig --region '지역이름' --name 'eks 클러스터 이름'

  • 클러스터 및 노드 확인#

    check

· 약 2분
Andes Noh

순서#

  • vpc 구성(1)#

  • eks cluster 생성(2) - ★#

  • worknode 생성 및 확인(3)#

  • eks 삭제(4)#

eks cluster 생성#

  • 기존 VPC 구성도#

    vpc

  • role 생성#

    • IAM 로그인 -> IAM 검색 -> 역할(엑세스 관리) -> 역할 만들기
    • 사용 사례 EKS-Cluster 선택 role create
    • 권한 추가 -> 다음
    • 이름 지정(EKS-ControlPlane-Role), 검토 및 생성 -> 역할 생성
    • 역할 생성 완료 확인 role create complete

  • 보안 그룹 생성#

    • vpc 검색 -> 보안그룹 -> 보안 그룹 생성 SG create

  • eks 생성#

    • eks 검색 -> 클러스터 추가 -> 생성
    • 클러스터 구성 eks create1
      • 이름: EKS-Cluster
      • 버전: 기본
      • 서비스 역할: EKS-ControlPlane-Role
    • 네트워킹 지정 net
      • VPC: EKS-VPC
      • 서브넷: pub, pri 각각 2개씩 모두 선택(후에 private subnet에 존재하는 워크 노드들의 외부 통신을 대비해 public subnet도 포함해 클러스터 생성)
      • 보안 그룹: 위에서 생성한 보안 그룹 선택
    • 클러스터 엔드포인트 엑세스 ep
      • 프라이빗 선택
    • 로깅 구성 logging
    • 검토 및 생성 -> 생성

  • eks 생성중(수분 소요)#

    creating

  • eks 생성 완료#

    complete

· 약 7분
Andes Noh

순서#

  • vpc 구성(1) - ★#

  • eks cluster 생성(2)#

  • worknode 생성 및 확인(3)#

  • eks 삭제(4)#

vpc 구성하기#

  • VPC(Virtual Private Cloud) 란#

    • 사용자가 정의한 가상의 네트워크 환경
    • 정의한 네트워크 환경을 바탕으로 다양한 서비스 이용 가능
    • 가장 기본적인 vpc 구성도 vpc

  • vpc 생성(무료)#

    • IAM 로그인 -> vpc 검색 -> vpc 생성 클릭
    • 세팅 vpc create
    • 이름태그: 원하는 이름태그 작성(ex: EKS-TEST-VPC)
    • IPv4 CIDR: VPC의 아이피 대역 지정(여기서는 192.168.0.0/16 대역 사용)
    • 생성

  • 서브넷 생성(무료)#

    • 좌측 메뉴 서브넷 클릭 -> 서브넷 생성 클릭 subnet create
    • VPC ID: 기존 생성한 vpc 선택
    • 서브넷 이름: public 서브넷 2개, private 서브넷 2개 총 4개의 서브넷을 구분 가능하게 생성(ex: pub-a, pri-a, pub-c, pri-c)
    • 가용영역: 기본적인 구성도(AZ)참고, 이 글에서는 ap-northeast-2a와 ap-northeast-2c를 사용, 서브넷 이름 뒤의 알파벳이 AZ를 나타냄
    • IPv4 CIDR: 서브넷의 IPv4 지정, 기억 하기 쉽게 지정해야 확장시 혼란이 적음
      • pub-a: 192.168.10.0/24
      • pri-a: 192.168.11.0/24
      • pub-c: 192.168.20.0/24
      • pri-c: 192.168.21.0/24
    • 총 4개의 서브넷 생성

  • 인터넷 게이트웨이 생성(무료)#

    • 인터넷 통신을 위한 GW
    • 좌측 메뉴 인터넷 게이트웨이 클릭 -> 인터넷 게이트웨이 생성 클릭 IGW create
    • 이름태그: 원하는 이름태그 작성(ex: EKS-TEST-IGW)
    • 1개의 IGW 생성

  • NAT 게이트웨이 생성(유료: 만든 순간부터 과금, 테스트를 위해 만든다면 테스트후 삭제할것)#

    • 외부와 통신이 안되는 private-subnet이 외부와의 통신을 위해 연결하는 GW
    • 좌측 메뉴 NAT 게이트웨이 클릭 -> NAT 게이트웨이 생성 클릭
    • 각 AZ 별로 생성 NAT create
    • 이름 - 구분 가능하게 생성(라우팅 테이블 연결시 혼란 방지)
    • 서브넷: NAT GW를 생성할 서브넷 선택, private-subnet의 통신을 위해 만드는것이기때문에 혹시 private-subnet 안에 위치해야 한다고 생각할수 있지만 public-subnet에 위치해야 RT를 통해 통신 가능, 기존에 만든 ap-northeast-2a와 ap-northeast-2c의 public-subnet안에 각각 생성
    • 연결 유형: 퍼블릭
    • 탄력적 IP 할당 ID: 탄력적 IP 할당 클릭 해서 할당(한개의 탄력적 IP는 무료지만 2개이상부터는 과금 발생)
    • 총 2개의 NAT GW 생성

  • 라우팅 테이블 생성(무료)#

    • 좌측 메뉴 라우팅 테이블 -> 라우팅 테이블 생성 클릭

    • 서브넷이 4개이므로 4개의 라우팅 테이블 필요 RT create

    • 이름: 원하는 이름 지정, 총 4개를 만들어야하므로 혼란 방지를 위해 구분가능하도록 설정

    • VPC: 기존에 만든 VPC 선택

    • ※라우팅 테이블 연결

      • public subnet case

        • pub-a용으로 만든 라우팅 테이블 ID 클릭
        • 하단 라우팅 편집 클릭 -> 라우팅 추가 클릭 후 왼쪽 대상 0.0.0.0/0, 오른쪽 대상 인터넷 게이트웨이 선택 후 기존에 만든 게이트웨이 선택 후 변경사항 저장 RT setting
        • 서브넷 연결 -> 명시적 서브넷 연결 -> 서브넷 연결 편집 클릭
        • pub-a 서브넷 체크 및 연결 저장
        • 명시적 서브넷 연결 확인
        • pub-c도 위와 같은 방식으로 연결
      • private subnet case

        • pri-a용으로 만든 라우팅 테이블 ID 클릭
        • 하단 라우팅 편집 클릭 -> 라우팅 추가 클릭 후 왼쪽 대상 0.0.0.0/0, 오른쪽 대상 NAT 게이트웨이 선택 후 ap-northeast-2a용으로 만든 NAT GW 선택 후 변경사항 저장
        • 서브넷 연결 -> 명시적 서브넷 연결 -> 서브넷 연결 편집 클릭
        • pri-a 서브넷 체크 및 연결 저장
        • 명시적 서브넷 연결 확인
        • pri-c도 위와 같은 방식으로 연결
      • public RT의 경우 라우팅에 같은 IGW 연결

      • private RT의 경우 라우팅에 각각 다른 NAT GW 연결

  • Bastion 서버 구성#

    • vpc -> 보안그룹 -> 보안그룹 생성
      • 보안 그룹 이름
      • 설명
      • VPC: 기존 EKS-TEST-VPC 선택
      • 인바운드 규칙 추가
        • 유형: ssh
        • 소스: 가장 좋은건 내 IP지만 다른 장소에서 로그인을 많이 할시 Anywhere 선택(어떤 ip로 접속하든 ssh 접속 가능)
      • 보안 그룹 생성

    • ec2 검색 -> 인스턴스 시작
    • 이름 및 태그: Bastion
    • Amazon Linux 선택(프리티어 머신 이미지 선택)
    • 인스턴스 유형: t2.micro(프리티어)
    • 키페어: 새 키페어 생성 클릭 후 이름 입력 -> 생성
    • 네트워크 설정(편집)
      • VPC: 기존 생성 VPC(EKS-TEST-VPC) 선택
      • 서브넷: pub-a 선택(pub-c도 상관없음)
      • 퍼블릭 IP 자동 할당: 활성화
      • 보안그룹: 기존 보안 그룹 -> 위에서 생성한 보안 그룹 선택
    • 인스턴스 시작

  • Bastion 서버 연결#

    • 인스턴스 ID 클릭
    • 연결 클릭
    • SSH 연결 클릭하여 인스턴스 생성시 다운 받은 .pem 파일과 함께 ssh 접속(putty, mobaxterm)
    • 리눅스나 맥으로 ssh 연결시 .pem 파일 권한 chmod 600 ~.pem으로 권한 변경 후 접속
    • Bastion 서버로 vpc내 다른 인스턴스에 접속 가능

  • 기본 vpc 구성 완료#

· 약 2분
Andes Noh

sed 커맨드 사용하기#

  • sed command를 사용해서 image 변경후 deploy 재배포하기
  • CR: Container Registry

  • test.k8s.yaml 예시#

apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app.kubernetes.io/component: back    app.kubernetes.io/name: test    app.kubernetes.io/part-of: test  name: test  namespace: jenkinsspec:  revisionHistoryLimit: 1  selector:    matchLabels:      app.kubernetes.io/component: back      app.kubernetes.io/name: test      app.kubernetes.io/part-of: test  template:    metadata:      labels:        app.kubernetes.io/component: back        app.kubernetes.io/name: test        app.kubernetes.io/part-of: test    spec:      containers:        - image: ${YOUR CR}:latest          name: app          ports:            - containerPort: 3000          resources: {}---apiVersion: v1kind: Servicemetadata:  labels:    app.kubernetes.io/component: back    app.kubernetes.io/name: test    app.kubernetes.io/part-of: test  name: test  namespace: jenkinsspec:  ports:    - port: 3000      targetPort: 3000  selector:    app.kubernetes.io/component: back    app.kubernetes.io/name: test    app.kubernetes.io/part-of: test
  • image 라인 변경 sed command 예시 및 설명#

pipeline {    agent any
    environment {        dockerHubRegistry = 'dockerHubRegistry'    }
    stages {        stage('Pull') {            steps {                git url: "${GIT_URL}", branch: "main", poll: true, changelog: true            }        }
        stage('...') {
        }        ...
              stage( "Deploy to Cluster" ) {          steps {            script {              ...              sh """              #!/bin/bash              cat test.k8s.yml | grep image              sed -i 's|image: .*|image: "${YOUR _CR}:${YOUR _VERSION}"|' test.k8s.yaml              cat test.k8s.yml | grep image              """              ...            }          }                }    }}
  • 첫번째 라인: test.k8s.yaml파일에서 image 라는 글자가 포함된 라인 출력 및 확인
image: ${YOUR CR}:latest
  • 두번째 라인: test.k8s.yaml의 image로 시작하는 라인을 sed command로 원하는 값으로 변경후 파일에 적용

  • 세번째 라인: 변경된 image 라인 출력 및 확인

image: ${YOUR _CR}:${YOUR _VERSION}