<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>IGNIS</title><link>https://ignis.kr/</link><description>기술 기록</description><item><title>EKS 클러스터 생성</title><link>https://ignis.kr/eks-keulreoseuteo-saengseong/</link><guid>https://ignis.kr/eks-keulreoseuteo-saengseong/</guid><pubDate>Mon, 13 Nov 2023 18:58:31 GMT</pubDate><description><![CDATA[<p></p><ol><li>kubectl을 다운받는다.</li></ol><pre><code class="language-bash">curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.28.3/2023-11-02/bin/linux/amd64/kubectl
</code></pre><p>2. 권한을 변경해주고 bin에 넣는다.</p><pre><code class="language-bash">chmod 755 kubectl
mkdir bin
mv kubectl bin</code></pre><p>3. 환경변수 세팅해주고 잘 되는지 테스트</p><pre><code>echo 'export PATH=$HOME/bin:$PATH' &gt;&gt; ~/.bashrc
source ~/.bashrc

(base) gold@ubuntu:~$ kubectl version
Client Version: v1.28.3-eks-4f4795d
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.3-eks-4f4795d</code></pre><p>4. AWS 정보 세팅 <br>-  Access Key와 Secret Key는 IAM -&gt; 사용자에서 발급받으면 된다.</p><pre><code class="language-bash">gold@ubuntu:~$ aws configure
AWS Access Key ID [None]: 자신의 Access Key ID
AWS Secret Access Key [None]: 자신의 Secret Access Key
Default region name [None]: 사용하고 있는 region 코드
Default output format [None]: JSON
gold@ubuntu:~$</code></pre><p></p><p>5. AMI를 설정한다.</p><ul><li>cloudformation</li><li>ec2</li><li>IAM</li><li>EKS</li></ul><p></p><p>6. 이제 EKS를 생성한다 ( 오래걸림 )</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">eksctl create cluster --name TEST-EKS --version 1.28 --region ap-northeast-2 --nodegroup-name netis-nodes --node-type t3.large --nodes 3</code></pre><figcaption>컴퓨팅 노드는 t3.large 3개를 사용하였다</figcaption></figure><p>7. update-kubeconfig로 설정을 적용한다.</p><pre><code class="language-bash">aws eks update-kubeconfig --region ap-northeast-2 --name TEST-EKS</code></pre><p></p><p>8. 이제 노드가 잘 조회되면 끝.</p><pre><code class="language-bash">gold@ubuntu:~$ kubectl get nodes
NAME                                                STATUS   ROLES    AGE     VERSION
ip-192-168-21-3.ap-northeast-2.compute.internal     Ready    &lt;none&gt;   4m53s   v1.28.2-eks-a5df82a
ip-192-168-57-211.ap-northeast-2.compute.internal   Ready    &lt;none&gt;   4m54s   v1.28.2-eks-a5df82a
ip-192-168-83-222.ap-northeast-2.compute.internal   Ready    &lt;none&gt;   4m52s   v1.28.2-eks-a5df82a
</code></pre>]]></description></item><item><title>apache kudu multiple master</title><link>https://ignis.kr/apache-kudu-multiple-master/</link><guid>https://ignis.kr/apache-kudu-multiple-master/</guid><pubDate>Sun, 26 Mar 2023 22:02:43 GMT</pubDate><description><![CDATA[<p></p><p></p><ul><li>시나리오 : master가 하나만 존재하는 과정에서 master를 3개로 증설</li><li>작업 영향 : 마스터가 잠시 중단되어야 함.</li><li>버전 : apache kudu 1.17</li></ul><p></p><ol><li>사전작업 - 테이블생성</li></ol><figure class="kg-card kg-code-card"><pre><code class="language-sql">create table test_table(
yyyymmdd int not null comment 'yyyymmdd',
ymdhms bigint not null comment 'ymdhms',
student_no int not null comment 'student_no',
primary key (yyyymmdd, ymdhms, student_no)
)
partition by range ( yyyymmdd )
(
partition value = 20220504,
partition value = 20220505
)
stored as kudu
tblproperties
(
'kudu.master_addresses'='kudu-master1:7051',
'kudu.num_tablet_replicas'='3'
);</code></pre><figcaption>테이블 샘플</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-bash">+-------------------------+
| summary                 |
+-------------------------+
| Table has been created. |
+-------------------------+
Fetched 1 row(s) in 0.65s

[root@kudu-master1 ~]# kudu table list kudu-master1;
impala::default.test_table</code></pre><figcaption>임팔라에서 테이블을 만들고, 테이블 리스트를 확인한다.</figcaption></figure><p>2.  마스터의 uuid를 확인하고 나머지 서버들의 uuid를 확인한다.</p><pre><code class="language-bash">[root@kudu-master1 kudu]# kudu fs dump uuid --fs_wal_dir=/home/gold/data/kudu/master
4f1c106e9b554743ac364967cb5227b4

[root@kudu-master2 kudu]# kudu fs format --fs_wal_dir=/home/gold/data/kudu/master
53e12ba47c8c4ef386e8d6927093986e

[root@kudu-master3 kudu]# kudu fs format --fs_wal_dir=/home/gold/data/kudu/master
a45c1ff473f74827814c56a3834f0965</code></pre><p>3. 마스터에서아래와 같이 레플리카 설정을 먹인다.</p><pre><code class="language-bash">kudu local_replica cmeta rewrite_raft_config --fs_wal_dir=/home/gold/data/kudu/master 00000000000000000000000000000000 4f1c106e9b554743ac364967cb5227b4:kudu-master1:7051 53e12ba47c8c4ef386e8d6927093986e:kudu-master2:7051 a45c1ff473f74827814c56a3834f0965:kudu-master3:7051
</code></pre><p></p><p>4. 마스터를 다시 구동한다</p><pre><code class="language-bash">systemctl restart kudu-master</code></pre><p></p><p>5. 나머지 서버에서 아래와 같이 마스터 정보를 복사해온다.</p><pre><code class="language-bash">kudu local_replica copy_from_remote --fs_wal_dir=/home/gold/data/kudu/master --fs_data_dirs=/home/gold/data/kudu/master  00000000000000000000000000000000 kudu-master1:7051</code></pre><p></p><p>6.  나머지 서버들을 실행한다</p><pre><code class="language-bash">systemctl start kudu-master
</code></pre><p></p><p>7. 테이블 리스트를 확인하고 기존 테이블을 alter 한다.</p><pre><code class="language-bash">[kudu-master1:21050] default&gt; ALTER TABLE test_table
SET TBLPROPERTIES
('kudu.master_addresses' = 'kudu-master1,kudu-master2,kudu-master3');
Query: ALTER TABLE test_table
SET TBLPROPERTIES
('kudu.master_addresses' = 'kudu-master1,kudu-master2,kudu-master3')
+----------------+
| summary        |
+----------------+
| Updated table. |
+----------------+
Fetched 1 row(s) in 0.22s
</code></pre><p>8. 바뀐 정보를 확인한다.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">[kudu-master1:21050] default&gt; show create table test_table</code></pre><figcaption>TBLPROPERTIES ('external.table.purge'='TRUE', 'impala.events.catalogServiceId'='53eef207a00d40f8:9a9371a962d39fc9', 'impala.events.catalogVersion'='156', 'kudu.master_addresses'='kudu-master1,kudu-master2,kudu-master3', 'kudu.num_tablet_replicas'='3') 와 같이 바뀌어있으면 성공</figcaption></figure>]]></description></item><item><title>GCP Python API 연동 - VM 인스턴스 만들기</title><link>https://ignis.kr/gcp-python-api-yeondong/</link><guid>https://ignis.kr/gcp-python-api-yeondong/</guid><pubDate>Thu, 09 Mar 2023 07:56:43 GMT</pubDate><description><![CDATA[<p></p><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2023/03/image-3.png" class="kg-image" alt loading="lazy" width="671" height="220" srcset="__GHOST_URL__/content/images/size/w600/2023/03/image-3.png 600w, __GHOST_URL__/content/images/2023/03/image-3.png 671w"></figure><p>AWS와 다르게 Google은 각 서비스마다 api를 다르게 다운로드 해야한다.<br>VM 인스턴스를 만들기위해서는 공식 서비스 명인 Compute Engine 을 사용해야 하고 다운로드는 아래처럼 하면 된다.</p><p></p><ul><li>1.  일단 gcp api 다운받기</li></ul><pre><code class="language-bash">pip install virtualenv
virtualenv &lt;your-env&gt;
source &lt;your-env&gt;/bin/activate
&lt;your-env&gt;/bin/pip install google-cloud-compute google-api-python-client</code></pre><p></p><ul><li>2. 그 다음은 API 인증 정보가 필요하다. 아래 절차로 받으면 json파일이 나온다.</li></ul><pre><code class="language-bash">1. Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다.school나머지 단계는 Google Cloud 콘솔에 자동으로 표시됩니다.
2. 프로젝트를 선택합니다.
3. 키를 만들려는 서비스 계정의 이메일 주소를 클릭합니다.
4. 키 탭을 클릭합니다.
5. 키 추가 드롭다운 메뉴를 클릭한 후 새 키 만들기를 선택합니다.
6. 키 유형으로 JSON을 선택하고 만들기를 클릭합니다.</code></pre><p></p><ul><li>3.  IAM 에서 해당 계정에 Compute 인스턴스 관리자(v1) 권한을 부여해야한다.<br>- <a href="https://console.cloud.google.com/iam-admin/iam">https://console.cloud.google.com/iam-admin/iam</a></li></ul><p></p><ul><li>4. SSH 접속을 위해 키 생성을 한다. AWS처럼 키 페어를 만들어주지 않나 보다.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="__GHOST_URL__/content/images/2023/03/image-4.png" class="kg-image" alt loading="lazy" width="527" height="343"><figcaption>참고 : 이미 다 테스트하고 없어진 RSA 키다</figcaption></figure><p></p><ul><li>5.  그러면 .ssh 밑에 공개키가 나온다 이 값을 복사해서</li></ul><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2023/03/image-5.png" class="kg-image" alt loading="lazy" width="793" height="103" srcset="__GHOST_URL__/content/images/size/w600/2023/03/image-5.png 600w, __GHOST_URL__/content/images/2023/03/image-5.png 793w" sizes="(min-width: 720px) 720px"></figure><ul><li>6.  compute engine -&gt; 메타데이터 -&gt; SSH키 -&gt; 추가 버튼을 눌러서 등록하면 끝.</li></ul><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2023/03/image-12.png" class="kg-image" alt loading="lazy" width="571" height="308"></figure><p><br></p><ul><li>7. 이제 파이썬 코드를 작성하자 기초 정보를 입력해주고</li></ul><pre><code class="language-python3">import paramiko
import time
from google.oauth2 import service_account
from google.cloud import compute_v1
from googleapiclient.discovery import build

# GCP 서비스 계정 인증 정보를 포함하는 클라이언트 객체 생성
credentials = service_account.Credentials.from_service_account_file('JSON 파일 이름')
compute_client = compute_v1.InstancesClient(credentials=credentials)

# compute 라이브러리를 사용
compute = build('compute', 'v1', credentials=credentials)

 #인스턴스 생성
project = 'GCP 프로젝트 이름을 입력하세요'
zone = 'asia-northeast3-a'  # 한국은 요거 쓰시면됩니다. 
instance_type = 'e2-medium'
instance_name = 'gold-instance-1-1'</code></pre><p></p><ul><li>8. 인스턴스의 설정을 만들고 만든다.<br><br>- projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v2023030 이 이미지는 우분투 22 LTS 이미지다.</li></ul><pre><code class="language-python3">config = {
    'name': instance_name,
    'machineType': f'zones/{zone}/machineTypes/{instance_type}',
    'disks': [{
        'boot': True,
        'autoDelete': True,
        'initializeParams': {
            'sourceImage': f'projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v20230302',
            'diskSizeGb' : 35
        }
    }],
    'networkInterfaces': [{
        'network': 'global/networks/default',
        'accessConfigs': [{
            'type': 'ONE_TO_ONE_NAT',
            'name': 'External NAT'
        }]
    }]
}

instance = compute.instances().insert(project=project, zone=zone, body=config).execute()
instance_id = instance['name']
print(f'Instance {instance_id} is starting...')</code></pre><p></p><p>여기까지가 인스턴스 생성 내용이고. 아래 부분은 생성 이후에 SSH 접속을 하여 간단한 명령을 날리는 예제이다.</p><p></p><ul><li>9. 인스턴스를 만든다고 바로 사용할 수 있는 것이 아니다. 상태 체크를 하는 반복문을 추가한다.</li></ul><pre><code class="language-python3">instance = compute.instances().insert(project=project, zone=zone, body=config).execute()
instance_id = instance['name']
print(f'Instance {instance_id} is starting...')

# 인스턴스 상태를 확인합니다.
status = None
while status != 'RUNNING':
    time.sleep(5)
    instance = compute.instances().get(
        project=project,
        zone=zone,
        instance=instance_name).execute()
    status = instance['status']
    print(f'Instance status: {status}')

print('Instance is running')</code></pre><p></p><ul><li>10. 인스턴스가  다 켜졌다면 접속하기 위한 공인 ip를 불러오자</li></ul><pre><code class="language-python3">instance = compute.instances().get(project=project, zone=zone, instance=instance_name).execute()
network_interface = instance['networkInterfaces'][0]
access_config = network_interface['accessConfigs'][0]
public_ip = access_config['natIP']
print(f'Instance Public IP is {public_ip}')
</code></pre><p></p><ul><li>11. SSH 연결을 해서 ls -al 결과를 불러보자.</li></ul><pre><code class="language-python3">max_retries = 5
retry_delay = 5

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# Connect with retry
for retry_count in range(max_retries):
    try:
        ssh.connect(hostname=public_ip, username='gold', key_filename='아까 만든 Private 키 경로')
        break
    except :
        print(f'Failed to connect to {public_ip}  Retrying in {retry_delay} seconds...')
        time.sleep(retry_delay)


stdin, stdout, stderr = ssh.exec_command('ls -al')
result = stdout.read().decode()
# 결과 출력
print(result)
stdin, stdout, stderr = ssh.exec_command('ls -al')
result = stdout.read().decode()

# 결과 출력
print(result)

# SSH 연결 종료
ssh.close()</code></pre><p></p><p>생성부터 명령어 입력까지 이어서 실행하면 이렇게 된다.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="__GHOST_URL__/content/images/2023/03/image-13.png" class="kg-image" alt loading="lazy" width="1046" height="633" srcset="__GHOST_URL__/content/images/size/w600/2023/03/image-13.png 600w, __GHOST_URL__/content/images/size/w1000/2023/03/image-13.png 1000w, __GHOST_URL__/content/images/2023/03/image-13.png 1046w" sizes="(min-width: 720px) 720px"><figcaption>잘된다!</figcaption></figure><p></p><ul><li>12. 삭제하고싶다면 </li></ul><pre><code class="language-python3"># 인스턴스 삭제 
operation = compute.instances().delete(
    project=project,
    zone=zone,
    instance=instance_name).execute()

print(f'Instance deletion initiated: {operation["name"]}')</code></pre><p></p><p></p><p>끝.</p>]]></description></item><item><title>AWS Python SDK 연동 - EC2인스턴스 만들기</title><link>https://ignis.kr/aws-python-sdk-yeondong/</link><guid>https://ignis.kr/aws-python-sdk-yeondong/</guid><pubDate>Thu, 09 Mar 2023 04:21:12 GMT</pubDate><description><![CDATA[<p></p><p>AWS에서는 공식 SDK인 Boto3를 지원한다.</p><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2023/03/image.png" class="kg-image" alt loading="lazy" width="966" height="364" srcset="__GHOST_URL__/content/images/size/w600/2023/03/image.png 600w, __GHOST_URL__/content/images/2023/03/image.png 966w" sizes="(min-width: 720px) 720px"></figure><pre><code class="language-bash">[ec2-user@ip-172-31-20-231 ~]$ pip3 install boto3
Defaulting to user installation because normal site-packages is not writeable
Collecting boto3
  Downloading boto3-1.26.87-py3-none-any.whl (134 kB)
     |████████████████████████████████| 134 kB 26.4 MB/s
Collecting s3transfer&lt;0.7.0,&gt;=0.6.0
  Downloading s3transfer-0.6.0-py3-none-any.whl (79 kB)
     |████████████████████████████████| 79 kB 14.9 MB/s
Collecting botocore&lt;1.30.0,&gt;=1.29.87
  Downloading botocore-1.29.87-py3-none-any.whl (10.5 MB)
     |████████████████████████████████| 10.5 MB 55.3 MB/s
Collecting jmespath&lt;2.0.0,&gt;=0.7.1
  Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)
Requirement already satisfied: python-dateutil&lt;3.0.0,&gt;=2.1 in ./.local/lib/python3.7/site-packages (from botocore&lt;1.30.0,&gt;=1.29.87-&gt;boto3) (2.8.2)
Requirement already satisfied: urllib3&lt;1.27,&gt;=1.25.4 in ./.local/lib/python3.7/site-packages (from botocore&lt;1.30.0,&gt;=1.29.87-&gt;boto3) (1.26.14)
Requirement already satisfied: six&gt;=1.5 in ./.local/lib/python3.7/site-packages (from python-dateutil&lt;3.0.0,&gt;=2.1-&gt;botocore&lt;1.30.0,&gt;=1.29.87-&gt;boto3) (1.16.0)
Installing collected packages: jmespath, botocore, s3transfer, boto3
Successfully installed boto3-1.26.87 botocore-1.29.87 jmespath-1.0.1 s3transfer-0.6.0
</code></pre><p></p><ol><li>Access Key 발급받기<br>- aws 메뉴 -&gt; 보안 자격 증명에 보면 Access Key를 발급하는 버튼이 있다.<br>- 당연히 유출되면 큰일 나니까 잘 보관하도록.<br></li><li>AWS Configure<br>- boto3를 설치한 컴퓨터에서 aws configure 를 실행하면, 위에서 받은 코드들이 나온다.  <br>- 소스에 인증 정보를 남기지 않기 위함이다.<br></li><li>리전 이름 찾기<br>- 한국은 ap-northeast-2 이다. <br></li><li> AMI 이미지 ID 찾기<br>- AMI는 Amazon Machine Image 의 약어인데, OS 이미지라고 보면 된다.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="__GHOST_URL__/content/images/2023/03/image-2.png" class="kg-image" alt loading="lazy" width="803" height="496" srcset="__GHOST_URL__/content/images/size/w600/2023/03/image-2.png 600w, __GHOST_URL__/content/images/2023/03/image-2.png 803w" sizes="(min-width: 720px) 720px"><figcaption>이거 쓰지 말고 아래 설명에서 찾아서 복사해서 붙여 넣기를&nbsp;</figcaption></figure><p>아래 사이트에서 AMI 이미지의 ID를 찾을 수 있다.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">https://cloud-images.ubuntu.com/locator/ec2/</div></div><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2023/03/image-1.png" class="kg-image" alt loading="lazy" width="1132" height="495" srcset="__GHOST_URL__/content/images/size/w600/2023/03/image-1.png 600w, __GHOST_URL__/content/images/size/w1000/2023/03/image-1.png 1000w, __GHOST_URL__/content/images/2023/03/image-1.png 1132w" sizes="(min-width: 720px) 720px"></figure><p>amd64의 이미지는 ami-034000b759564de42<br>ARM 이미지는 ami-0084ff4520f7fd92a 이다</p><p>준비는 끝났다.  파이썬 코드를 작성하자</p><pre><code class="language-python3">import boto3

ec2 = boto3.client('ec2')

# EC2 인스턴스 생성
response = ec2.run_instances(
    ImageId='ami-034000b759564de42', 
    InstanceType='t2.micro',
    KeyName='SDK_TEST', # EC2 Key Pair 이름
    MinCount=1,
    MaxCount=1
)

# EC2 인스턴스 ID 출력
print('EC2 Instance ID:', response['Instances'][0]['InstanceId'])</code></pre><p>삭제는 아래처럼 하면 된다.</p><pre><code class="language-python3">instance_id = 'i-072d3495531ff1a76'

# EC2 인스턴스 삭제
ec2.terminate_instances(InstanceIds=[instance_id])

print(f'Instance {instance_id} has been terminated.')</code></pre><p>깔끔...</p>]]></description></item><item><title>ubuntu 스왑 메모리 추가</title><link>https://ignis.kr/ubuntu-seuwab-memori-cuga/</link><guid>https://ignis.kr/ubuntu-seuwab-memori-cuga/</guid><pubDate>Thu, 02 Mar 2023 22:51:44 GMT</pubDate><description><![CDATA[<p></p><p>메모리가 부족한데, swap이 0으로 설정되어있어서 불안한 상황</p><pre><code class="language-bash">ubuntu@ubuntu:/home/gold$ free -h
               total        used        free      shared  buff/cache   available
Mem:           964Mi       754Mi        71Mi       1.0Mi       137Mi        65Mi
Swap:             0B          0B          0B</code></pre><p></p><p>스왑을 추가하는 방법은 아래와 같다.<br>1. sudo fallocate -l 2G /swapfile<br>2. sudo chmod 600 /swapfile<br>3. sudo mkswap /swapfile<br>4. sudo swapon /swapfile</p><p>추가 후,  free -h 명령으로 swap이 추가된 것을 확인해보자.</p><pre><code class="language-bash">ubuntu@ubuntu:/home/gold$ sudo fallocate -l 2G /swapfile
ubuntu@ubuntu:/home/gold$ sudo chmod 600 /swapfile
ubuntu@ubuntu:/home/gold$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=f05e6064-0af0-4f05-8700-a5ac9a27203b
ubuntu@ubuntu:/home/gold$ sudo swapon /swapfile
ubuntu@ubuntu:/home/gold$
ubuntu@ubuntu:/home/gold$ free -h
               total        used        free      shared  buff/cache   available
Mem:           964Mi       754Mi        71Mi       1.0Mi       137Mi        65Mi
Swap:          2.0Gi          0B       2.0Gi</code></pre><p></p><p>5. 재부팅 후에 자동으로 swap이 등록 될 수 있도록 /etc/fstab에 추가한다.</p><pre><code class="language-bash">LABEL=cloudimg-rootfs   /        ext4   discard,errors=remount-ro       0 1
LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1

# SWAP 추가
/swapfile none swap sw 0 0
</code></pre>]]></description></item></channel></rss>