Python, Kubernetes, Twilio가 포함된 Starlink 위성 메시지 알림

26030 단어 kubernetesdockertwilio

위성 검사를 위해 CronJob 설정


스페이스X는 우주에서 거대한 상호작용 별자리를 조립하기 위해 수천 개의 Starlink 위성을 발사하고 있다.만약 네가 정확한 시간에 고개를 들어 본다면, 너는 운이 좋게 뭔가를 발견할 수 있을 것이다.
그런데 위성이 언제 정수리를 지나갈지 어떻게 미리 알 수 있어요?
너는 운을 기대할 필요가 없다. 이 은빛 개미들이 밤하늘에서 행진하는 것을 볼 수 있다.이 강좌는 위성이 접근하고 SMS 경보를 보내는지 확인하기 위해 계획 작업을 설정하는 방법을 소개한다.

튜토리얼 요구 사항

  • Python 버전 3
  • SMS 알림을 수신한 개인 전화번호

  • A freeTwilio accountTwilio phone number 문자 알림 보내기
  • 무료 Docker Hub 계정, Docker Desktop(Mac 또는 Windows용) 또는 Docker Engine(Linux용), 용기화 응용 프로그램 구축 및 공유용
  • 무료 KubeSail account, 코드를 Kubernetes 집단
  • 에 배치하는 데 사용

    Python 가상 환경 설정


    새 프로젝트 디렉터리를 만들고 명령줄에서 이 디렉터리로 변경합니다.
    $ mkdir starlink-alert
    $ cd starlink-alert
    
    venv라는 가상 환경을 만듭니다.가상 환경을 활성화하고 가상 환경에 필요한 Python 패키지를 설치합니다.Unix 또는 Mac 운영 체제를 사용하는 경우 터미널에 명령을 입력합니다.
    $ python3 -m venv venv
    $ source venv/bin/activate
    (venv) $ pip install twilio python-dotenv datetime pytz skyfield
    
    Windows 컴퓨터에 있는 경우 명령 프롬프트 창에 명령을 입력합니다.
    $ python -m venv venv
    $ venv\Scripts\activate
    (venv) $ pip install twilio python-dotenv datetime pytz skyfield
    
    우리가 사용하는 Python 패키지는 다음과 같습니다.

  • Twilio’s Python Library — Twilio API
  • 과의 통신을 위한 Python 모듈

  • python-dotenv — 관리 환경 변수

  • datetimepytz — 처리 날짜, 시간 및 시간대

  • skyfield — 지구 궤도를 둘러싼 위성의 위치를 계산하다

    Python 스크립트 작성


    스크립트의 목적은 가시 위성이 주어진 도시 위치에 접근하고 있는지 확인하는 것이다.만약 그렇다면, 당신의 Twilio 전화번호는 당신의 개인 전화번호로 문자 알림을 보낼 것입니다.tracker.py이라는 파일에 다음 코드를 복사합니다.
    import os
    import math
    from dotenv import load_dotenv
    load_dotenv()
    from skyfield.api import Topos, load
    from datetime import timedelta
    from pytz import timezone
    from twilio.rest import Client
    
    # load the satellite dataset from Celestrak
    starlink_url = 'https://celestrak.com/NORAD/elements/starlink.txt'
    starlinks = load.tle_file(starlink_url)
    print ('Loaded', len(starlinks), 'satellites')
    
    # update city location and timezone
    location = Topos('37.7749 N', '122.4194 W')
    tz = timezone('US/Pacific')
    
    # establish time window of opportunity
    ts = load.timescale()
    t0 = ts.now()
    t1 = ts.from_datetime(t0.utc_datetime()+ timedelta(hours=2))
    
    # loop through satellites to find next sighting
    first_sighting = {}
    for satellite in starlinks:
    
       # filter out farthest satellites and NaN elevation
       elevation = satellite.at(t0).subpoint().elevation.km
       isNan = math.isnan(elevation)
       if elevation > 400 or isNan: continue
       print ('considering: {} at {}km'.format(
           satellite.name,
           round(elevation)
       ))
    
       # find and loop through rise / set events
       t, events = satellite.find_events(location, t0, t1, altitude_degrees=30.0)
       for ti, event in zip(t, events):
    
           # check if satellite visible to a ground observer
           eph = load('de421.bsp')
           sunlit = satellite.at(t1).is_sunlit(eph)
           if not sunlit: continue
    
           # filter by moment of greatest altitude - culminate
           name = ('rise above 30°', 'culminate', 'set below 30°')[event]
           if (name != 'culminate'): continue
    
           # find earliest time for next sighting
           if (not first_sighting) or (ti.utc < first_sighting['time']):
               first_sighting['time_object'] = ti
               first_sighting['time'] = ti.utc
               first_sighting['satellite'] = satellite
    
    if (first_sighting): 
    
       # create body for SMS  
       next_sighting = ('next sighting: {} {}'.format(
           first_sighting['satellite'].name,
           first_sighting['time_object'].astimezone(tz).strftime('%Y-%m-%d %H:%M')
       ))
    
       # send SMS via Twilio if upcoming sighting
       account_sid = os.environ.get('TWILIO_ACCOUNT_SID')
       auth_token = os.environ.get('TWILIO_AUTH_TOKEN')
       client = Client(account_sid, auth_token)
    
       message = client.messages.create(
           body=next_sighting,
           from_=os.environ.get('TWILIO_PHONE_NUMBER'),
           to=os.environ.get('MY_PHONE_NUMBER')
       )
    
       print ('Message sent:', message.sid, next_sighting)
    
    else:
    
       print ('No upcoming sightings')
    
    자신의 지리 좌표와 시간대를 사용하여 16줄에서 17줄까지의 변수 locationtz을 업데이트합니다.너는 너의 경위도 here을 찾을 수 있다.Python 셸에서 다음 코드를 실행하여 모든 시간대를 보십시오.위치에 맞는 시간대를 찾으면 Python 셸을 종료합니다.
    (venv) $ python
    >>> import pytz
    >>> pytz.all_timezones
    >>> exit()
    
    tracker.py 스크립트는 Skyfield라는 Python 패키지에 의존하여 복잡한 공간 계산을 처리합니다.이 스크립트는 위성 데이터 집합을 불러와 위성 사이를 순환시켜 다음 좋은 광경을 찾는다.Skyfield는 위성이 언제 당신 부근에서 떠오르고 떨어지는지 계산하고, 위성이 햇빛에 비쳐 최대 가시도를 얻는지 확인합니다.앞으로 두 시간 안에 어떤 목격 사건도 예측하면 트위터는 상세한 정보를 휴대전화 번호로 보낼 것이다.
    스타링크 3호 열차가 새벽 하늘을 통과하여 Forest KatschUnsplash을 촬영하였다
    Twilio SMS를 사용하려면 자격 증명 및 기타 구성 정보를 .env이라는 파일에 저장합니다(이 파일 이름 앞의 점을 참고하십시오).
    TWILIO_ACCOUNT_SID=<your-account-sid>
    TWILIO_AUTH_TOKEN=<your-auth-token>
    TWILIO_PHONE_NUMBER=<your-twilio-phone-number>
    MY_PHONE_NUMBER=<your-personal-phone-number>
    
    Twilio 계정 SID 및 인증 토큰을 찾으려면 Twilio 콘솔에 로그인한 다음 사이드바에서'설정'을 클릭하고 API 자격 증명 으로 아래로 스크롤합니다.문자 메시지를 보내려면 Twilio 전화번호가 필요합니다.
    업데이트를 .env 파일에 저장하고 명령줄에서 스크립트를 실행합니다.만약 낮에 스크립트를 실행한다면, 위성이 머리 위로 지나가고 있다는 것을 확인할 수 있지만, 낮에는 잘 보이지 않습니다.CronJob을 설정하면 스크립트를 실행할 시기를 지정하여 황혼이나 새벽과 같은 최대 위성 가시성을 얻을 수 있습니다.
    (venv) $ python tracker.py
    
    스크립트를 시도하고 작업을 확인한 후에 의존 항목을 저장할 수 있도록 필요한 파일을 만듭니다.
    (venv) $ pip freeze > requirements.txt
    
    이제 스크립트를 실행하기 위해 Docker 이미지를 만듭니다.

    Docker 이미지를 만들고 Docker Hub로 밀어넣기


    Docker가 설치되어 있고 컴퓨터에서 실행되고 있는지 확인합니다.Dockerfile (파일 확장자가 없음 주의) 이라는 파일에 다음 코드를 추가합니다. 이 파일은 우리의 이미지를 구축하는 방법을 설명합니다.
    # creates a layer from the python:3 Docker image
    FROM python:3
    
    # copy and install dependencies
    COPY requirements.txt /
    RUN pip install -r requirements.txt
    
    # add script
    COPY tracker.py /
    
    # define the command to run the script
    CMD ["python", "./tracker.py"]
    
    이제 터미널에서 Python 스크립트의 Docker 이미지를 구축하고 실행합니다.다음 명령에서 우리가 구축하고 있는 이미지는 python-starlink이고 용기는 starlink_test입니다.안전상의 이유로 우리는 용기에 환경 변수를 포함하고 싶지 않기 때문에 명령줄에서 --env-file 로고를 사용하여 용기를 운행합니다.Linux 운영 체제에 있는 경우 docker 명령 전에 sudo 또는 create a docker group을 추가합니다.
    $ docker build --tag python-starlink .
    $ docker run --name starlink_test --env-file=.env --rm python-starlink
    
    컨테이너가 성공적으로 실행되었는지 확인한 후 Docker Hub 등록표에 Docker 이미지를 공유하여 클라우드에서 액세스하고 실행할 수 있도록 합니다.Docker 로그인을 사용하여 명령줄에서 Docker Hub 계정에 로그인합니다.그런 다음 저장소를 만들고 다음 명령을 사용하여 이미지를 Docker Hub로 밀어넣습니다.
    $ docker tag python-starlink <Your Docker ID>/python-starlink:latest
    $ docker push <Your Docker ID>/python-starlink:latest
    
    위의 명령에서 Your Docker ID은 Docker Hub에 등록된 사용자 이름입니다.
    다음 단계에서 Python 스크립트를 실행하기 위해 Kubernetes CronJob을 계획합니다.

    Kubernetes에 CronJob 배포


    KubeSail에 로그인했는지 확인하십시오.KubeSail에는 공개된 YAML 예가 있습니다.나는 satellites 이라는 CronJob 템플릿을 만들었는데, 두 가지 Kubernetes 자원이 있다.

  • Secrets 보안 스토리지 환경 변수

  • CronJob 계획에 따라
  • 임무를 완성
    satellites 템플릿으로 이동합니다.필수 변수에서 Docker Hub로 방금 전송한 기본 이미지로 기본 DOCKER-IMAGE을 바꿉니다.그런 다음 나머지 환경 변수를 입력합니다.

    YAML을 확인하려면 YAML 편집기를 클릭하여 코드 편집기를 확장하고 각 리소스의 기본 구성을 확인합니다.이 YAML은 리소스 CronJob에 대해 설명합니다.
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: starlink
      labels:
        app: starlink
    spec:
      schedule: "0/30 19-21 * * *"
      jobTemplate:
        spec:
          template:
            spec:
               restartPolicy: Never
              containers:
                - name: starlink-tracker
                  image: "{{DOCKER-IMAGE|joycelin79/python-starlink:latest}}"
                  envFrom:
                    - secretRef:
                        name: starlink-secret
                  imagePullPolicy: Always
      successfulJobsHistoryLimit: 3
      failedJobsHistoryLimit: 1
    
    이 YAML은 스토리지 환경 변수에 사용되는 리소스 Secret에 대해 설명합니다.
    apiVersion: v1
    kind: Secret
    metadata:
      name: starlink-secret
      labels:
        app: starlink
    stringData:
      TWILIO_ACCOUNT_SID: "{{TWILIO-ACCOUNT-SID}}"
      TWILIO_AUTH_TOKEN: "{{TWILIO-ACCOUNT-SID}}"
      TWILIO_PHONE_NUMBER: "{{TWILIO-PHONE-NUMBER}}"
      MY_PHONE_NUMBER: "{{MY-PHONE-NUMBER}}"
    
    준비가 완료되면 시작 템플릿을 클릭하여 KubeSail의 Kubernetes 네임스페이스에 클러스터를 배치합니다.
    "자원"아래의 사이드바에서 이 Kubernetes 상하문에서 실행되는 모든 자원을 볼 수 있습니다. 계획된 작업을 포함합니다.

    이것도 당신이 배치를 갱신할 수 있는 곳이다.예를 들어, Secret 리소스의 환경 변수를 업데이트합니다.테스트 시 분당 작업을 터치하려면 CronJob 자원의 YAML 설정을 업데이트하고 schedule"* * * * *"으로 설정한 다음 변경 사항을 적용합니다.
    기본 Python 스크립트를 편집하려면 변경 사항을 tracker.py에 로컬로 저장합니다.그리고 이전처럼 업데이트된 이미지를 구축하여 Docker Hub로 전송합니다.KubeSail의 Kubernetes CronJob은 컨테이너 구성에서 imagePullPolicy: Always을 지정하여 Docker Hub에서 최신 버전을 자동으로 추출합니다.
    이렇게!

    결론


    SMS 알림을 만드는 것은 매우 간단합니다.그걸 할 수 있는 방법이 많아요. — 이제 Kubernetes에서 Cron Job을 어떻게 배치하는지 알겠어요.
    추가 탐색을 위해 다음을 수행할 수 있습니다.

  • 조정 기준: 모든 스타링크 위성은 시간의 추이에 따라 더욱 높은 해발까지 분포한다.더 많은 위성을 보기 위해 추적기의 민감도를 높이려면 스크립트의 고도를 조정하십시오.또는 cron 계획을 업데이트하여 when satellites are most visible from the ground을 실행합니다 — 황혼과 새벽.

  • 배치 변경: KubeSail에서 서로 다른 Kubernetes 컨텍스트를 설정하고 CronJob을 로컬에서 실행되는 클러스터나 다른 클라우드 공급업체에 배치합니다.other CronJob options in Kubernetes으로 실험을 하거나.

  • 다른 정보 추적: 위성을 좋아하지 않는다면 a new dataset of celestial bodies으로 바꾸세요.
  • 만약 당신이 이 세상에서 무엇을 발견했다면, 저에게 알려주세요!

    좋은 웹페이지 즐겨찾기