공부하기싫어

1. 목차

     

    1.1. 테스트 목적

    • python 으로 동작하는 image build
      • requirements.txt 파일 사용
      • aws cli 동작 테스트
    • 생성한 image를 사용한 pod 생성
      • yaml 파일 사용해 apply 로 생성
      • aws access-key / secret-key를 k8s secret 으로 저장 후 container 환경변수로 사용

     

    aws cli credentail 을 kubectl secret 으로 생성해놓고 pod 를 정의하는 manifest 파일에서 컨테이너에서 환경변수로 사용할 수 있게 정의후 python boto3 패키지에서 사용할 수 있을지 테스트

     

     

    1.2. 1. 테스트 준비

    1.2.1. 1.1 docker image

    python 이미지 사용

    while 문을 사용해 일정시간마다 현재 시간을 기록하고 5분후 종료되는 간단한 앱

    k8s secret 을 container의 환경변수로 저장할 예정, 이 환경변수를 사용한 aws configure 과 간단한 function test

     

    1.1.1 test.py

    aws-cli 로그인 및 동작 확인

    <python />
    import datetime import boto3 import time # .log 파일에 결과 기록 def open_logfile(n): log_file_name=n f=open(log_file_name, 'a') return f def write_and_flush_logs(f, log_string): logs=log_string+"\n" f.write(logs); f.flush() def close_logfile(f): f.close() # boto3 dynamodb table 읽기 def read_dynamoDB_table() : dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('table-for-Ethereum-Autotrade') response = table.get_item( Key={ 'Env': 'Dev' } ) item = response['Item'] best_k = item['k-value'] predicted_end_price = item['endprice'] return best_k, predicted_end_price logfile=open_logfile('stamp.log') #1분동안 실행 start_time = datetime.datetime.now() end_time = start_time + datetime.timedelta(minutes=1) k,p=read_dynamoDB_table() logs=str(k)+str(p) write_and_flush_logs(logfile, logs) while True : dt_now = datetime.datetime.now() logs="running :"+str(dt_now) write_and_flush_logs(logfile, logs) if dt_now > end_time : close_logfile(logfile) break time.sleep(1)

     

    1.1.2 requirements.txt

    <bash />
    datetime boto3

     

    time 도 추가했었으나 에러가나서 확인해보니 python 에 기본적으로 제공한다고 한다

     

     

    1.1.3 dockerfile

    awscli 설치

    aws configure 환경변수 리전 정보 저장

    <Dockerfile />
    FROM python:3.10 RUN apt-get update && apt-get install -y \ awscli \ vim ENV AWS_DEFAULT_REGION=ap-northeast-2 RUN mkdir /home/app WORKDIR /home/app COPY . . RUN pip3 install -r requirements.txt RUN nohup python3 test_app.py > stamp.log &

     

    1.2.2. 1.2 docker login (hub.docker)

    빌드서버 (노트북) 에서 hub.docker repository 를 사용하기 위한 로그인

    <bash />
    docker login -u cyaninn Password: WARNING! Your password will be stored unencrypted in /home/cyaninn/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded

     

    1.2.3. 1.3 시크릿 생성

    k8s secret 을 생성해서 container의 환경변수로서 사용하는 방법 테스트

    https://kubernetes.io/ko/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod

     

    시크릿(Secret)

    시크릿은 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너 이미지에 포함될 수 있다. 시크릿을 사용한다

    kubernetes.io

     

     

    명령어로 secret 생성

    <bash />
    k create secret generic aws-configure \ --from-literal=accesskey='myaccesskey' \ --from-literal=secretkey='mysecretkey' \ -n test

     

     

    1.2.4. 1.4 test_pod.yaml

    • apply 에 사용할 yaml file
    • 빌드해서 사용할 이미지 이름 미리 정의해서 사용
    • aws-configure 를 저장한 secret 을 환경변수로 포함
    <yaml />
    apiVersion: v1 kind: Pod metadata: name: 230615-test-pod namespace: test spec: containers: - name: test-container image: cyaninn/test:1.1 env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: aws-configure key: accesskey optional: false - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-configure key: secretkey optional: false restartPolicy: Never

     

     

    1.3. 2. image build/push

    <bash />
    $ docker build --tag cyaninn/test:1.1 . ... => [6/7] RUN pip3 install -r requirements.txt 15.7s => ERROR [7/7] RUN python3 test_app.py > stamp.log 10.5s ------ > [7/7] RUN python3 test_app.py > stamp.log: #0 8.632 Traceback (most recent call last): #0 8.632 File "/home/app/test_app.py", line 43, in <module> #0 8.632 k,p=read_dynamoDB_table() #0 8.632 File "/home/app/test_app.py", line 23, in read_dynamoDB_table #0 8.632 response = table.get_item( #0 8.632 File "/usr/local/lib/python3.10/site-packages/boto3/resources/factory.py", line 580, in do_action #0 8.632 response = action(self, *args, **kwargs) #0 8.632 File "/usr/local/lib/python3.10/site-packages/boto3/resources/action.py", line 88, in __call__ #0 8.632 response = getattr(parent.meta.client, operation_name)(*args, **params) #0 8.632 File "/usr/local/lib/python3.10/site-packages/botocore/client.py", line 530, in _api_call #0 8.633 return self._make_api_call(operation_name, kwargs) #0 8.633 File "/usr/local/lib/python3.10/site-packages/botocore/client.py", line 947, in _make_api_call #0 8.633 http, parsed_response = self._make_request( #0 8.633 File "/usr/local/lib/python3.10/site-packages/botocore/client.py", line 970, in _make_request #0 8.633 return self._endpoint.make_request(operation_model, request_dict) #0 8.633 File "/usr/local/lib/python3.10/site-packages/botocore/endpoint.py", line 119, in make_request #0 8.633 return self._send_request(request_dict, operation_model) #0 8.633 File "/usr/local/lib/python3.10/site-packages/botocore/endpoint.py", line 198, in _send_request #0 8.634 request = self.create_request(request_dict, operation_model) #0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/endpoint.py", line 134, in create_request #0 8.634 self._event_emitter.emit( #0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/hooks.py", line 412, in emit #0 8.634 return self._emitter.emit(aliased_event_name, **kwargs) #0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/hooks.py", line 256, in emit #0 8.634 return self._emit(event_name, kwargs) #0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/hooks.py", line 239, in _emit #0 8.634 response = handler(**kwargs) #0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/signers.py", line 105, in handler #0 8.634 return self.sign(operation_name, request) #0 8.634 File "/usr/local/lib/python3.10/site-packages/botocore/signers.py", line 189, in sign #0 8.635 auth.add_auth(request) #0 8.635 File "/usr/local/lib/python3.10/site-packages/botocore/auth.py", line 418, in add_auth #0 8.635 raise NoCredentialsError() #0 8.635 botocore.exceptions.NoCredentialsError: Unable to locate credentials ------ Dockerfile:14 -------------------- 12 | 13 | RUN pip3 install -r requirements.txt 14 | >>> RUN python3 test_app.py > stamp.log 15 | -------------------- ERROR: failed to solve: process "/bin/sh -c python3 test_app.py > stamp.log" did not complete successfully: exit code: 1

    Unable to locate credentials 에러 확인

    build 자체가 안되는 상황임

    다른 방법으로 aws credential 을 정의해야 함

     

    1.4. 테스트 결과

     

    Kubernetes 서비스 계정을 사용하도록 Pods 구성 - Amazon EKS

    이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

    docs.aws.amazon.com

    위 방법 구성해보고 적용 테스트 필요

     

    • 프로토타입 POD 배포
      • 테스트 - aws credential 을 Dockerfile 에 환경변수로 선언해서 사용하는 임시 POD 배포
      • 테스트 - k8s cronjob을 manifest 파일에 포함
      • 배포 - 위 테스트 성공 시 정상 작동하는 pod 임시 배포

     

     

    1.5. 참고

    https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-envvars.html

     

    환경 변수를 사용하여 AWS CLI 구성 - AWS Command Line Interface

    환경 변수를 사용하여 AWS CLI 구성 환경 변수는 구성 옵션과 보안 인증을 지정하는 다른 방법을 제공하며, 스크립팅을 수행하거나 명명된 프로필을 임시로 기본값으로 설정할 때 유용할 수 있습

    docs.aws.amazon.com