공부하기싫어

목차

     

    테스트 목적

    • 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. 테스트 준비

    1.1 docker image

    python 이미지 사용

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

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

     

    1.1.1 test.py

    aws-cli 로그인 및 동작 확인

    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

    datetime
    boto3

     

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

     

     

    1.1.3 dockerfile

    awscli 설치

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

    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 docker login (hub.docker)

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

    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.3 시크릿 생성

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

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

     

    시크릿(Secret)

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

    kubernetes.io

     

     

    명령어로 secret 생성

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

     

     

    1.4 test_pod.yaml

    • apply 에 사용할 yaml file
    • 빌드해서 사용할 이미지 이름 미리 정의해서 사용
    • aws-configure 를 저장한 secret 을 환경변수로 포함
    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

     

     

    2. image build/push

    $ 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 을 정의해야 함

     

    테스트 결과

     

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

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

    docs.aws.amazon.com

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

     

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

     

     

    참고

    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