ЁЯУо рдзрдбрд╛ 12 тАФ CI рддреЗ cloud: courier рдкреНрд░рддреА рдареЗрд╡рддреЛ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 12 тАФ рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛! ┬╖ рдорд╛рдЧреЗ: lesson-11-push-pull-lifecycle
ЁЯФЧ рдкреБрдвреЗ: Kubernetes рд╣реА image ECR рд╡рд░реВрди pull рдХрд░рддреЗ тАФ Kubernetes рд╢рд╛рд│реЗрдЪрд╛ рдзрдбрд╛ 01 рдиреЗрдордХрд╛ рдЗрдереВрди рд╕реБрд░реВ рд╣реЛрддреЛ рдЬрд┐рдереЗ рд╣рд╛ рд╕рдВрдкрддреЛ.
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдЧрд│реЗ 12 рдзрдбреЗ тАФ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕. рд╢реЗрд╡рдЯрдЪрд╛ рднрд╛рдЧ: рдзрдбреЗ 1тАУ11 рдкреНрд░рддреНрдпреЗрдХ push рд╡рд░ рдХрд░рдгрд╛рд▒реНрдпрд╛ robot рдХрдбреЗ рд╕реЛрдкрд╡рдгреЗ, рд╕реЛрдмрдд scan report, рдЖрдгрд┐ рдЙрд░рд▓реЗрд▓реНрдпрд╛ trilogy рдХрдбреЗ baton рджреЗрдгреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдХрд╛рд▓ рддреБрдореНрд╣реА рд╣рд╛рддрд╛рдиреЗ рдХрд╛рдп рдХреЗрд▓реЗ рддреЗ рдкрд╛рд╣рд╛: build ЁЯН▒ тЖТ рдкреВрд░реНрдг рдкрддреНрддреНрдпрд╛рдЪреЗ рд▓реЗрдмрд▓ ЁЯП╖я╕П тЖТ рджрд┐рд╡рд╕рд╛рдЪрд╛ рдкрд╛рд╕ ЁЯОл тЖТ push ЁЯУж. рдЪрд╛рд░ commands, рдкреНрд░рддреНрдпреЗрдХ deploy рд▓рд╛, рдХрд╛рдпрдо? рдирд╛рд╣реА. рд╣реЗ рдХрд╛рдо courier robot ЁЯУо (CI) рдЪреЗ рдЖрд╣реЗ:
рдкреНрд░рддреНрдпреЗрдХ git push рд╡рд░ robot:
- рдЧреГрд╣рдкрд╛рда рддрдкрд╛рд╕рддреЛ тЬЕ тАФ tests рдЪрд╛рд▓рд╡рддреЛ. рдЦрд░рд╛рдм рдХреЛрдб рдХрдзреАрдЪ рдбрдмреНрдпрд╛рдд рдЬрд╛рдд рдирд╛рд╣реА.
- рдбрдмрд╛ рднрд╛рдЬрддреЛ ЁЯН▒ тАФ
docker build, рдзрдбрд╛ 02 рдореБрд│реЗ cache-рдЬрд▓рдж. - рддреНрдпрд╛рд╡рд░ commit рдЪреНрдпрд╛ рдард╢рд╛рдЪреЗ рд▓реЗрдмрд▓ рд▓рд╛рд╡рддреЛ ЁЯП╖я╕П тАФ tag рдореНрд╣рдгрдЬреЗрдЪ git SHA
(
hello-school:abc123), рдореНрд╣рдгрдЬреЗ рдХрдкреНрдкреНрдпрд╛рд╡рд░рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рдбрдмрд╛ "рд╣рд╛ рдХреЛрдгрддрд╛ рдХреЛрдб рдЖрд╣реЗ?" рдпрд╛рдЪреЗ рдЙрддреНрддрд░ рдирд╛рд╡рд╛рдиреЗрдЪ рджреЗрддреЛ. (рдЖрдгрд┐ IMMUTABLE tags рдореБрд│реЗ рддреНрдпрд╛рдмрджреНрджрд▓ рдХреЛрдгреАрд╣реА рдХрдзреАрдЪ рдЦреЛрдЯреЗ рдмреЛрд▓реВ рд╢рдХрдд рдирд╛рд╣реА.) - рд╕реНрд╡рддрдГрдЪрд╛ рджрд┐рд╡рд╕рд╛рдЪрд╛ рдкрд╛рд╕ рдШреЗрдКрди рдбрдмрд╛ рдареЗрд╡рддреЛ ЁЯОлЁЯУж тАФ рдкреНрд░рддреНрдпреЗрдХ run рд▓рд╛ рддрд╛рдЬрд╛ ECR login, push, рдЭрд╛рд▓реЗ.
- рдмрдБрдХ рдбрдмреНрдпрд╛рдЪрд╛ X-ray рдХрд╛рдврддреЗ ЁЯЫбя╕П тАФ scan-on-push рддреБрдордЪреНрдпрд╛ рдерд░рд╛рдВрддрд▓реНрдпрд╛ рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ vulnerabilities (CVEs) рдЪреА рдпрд╛рджреА рдХрд░рддреЗ. рд▓рд╣рд╛рди alpine images (рдзрдбрд╛ 07/08) рд╣рд╛ report рдЖрдирдВрджрджрд╛рдпрдХрдкрдгреЗ рдЫреЛрдЯрд╛ рдареЗрд╡рддрд╛рдд.
k8s рдХреЛрд░реНрд╕рдЪреА CircleCI pipeline рддрд┐рдЪреНрдпрд╛ рджреЛрди services рд╕рд╛рдареА рдиреЗрдордХреЗ рд╣реЗрдЪ рдХрд░рддреЗ тАФ рддреА file рддреБрдореНрд╣реА рдЖрддрд╛ рд╕рд╣рдЬ рд╡рд╛рдЪреВ рд╢рдХрддрд╛. ЁЯОУ
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
dev["ЁЯзСтАНЁЯТ╗ git push"]
subgraph ci["ЁЯУо CI - the courier robot"]
t["тЬЕ test"] --> b["ЁЯН▒ build"] --> tag["ЁЯП╖я╕П tag = commit SHA"] --> p["ЁЯОл login + push"]
end
subgraph ecr["ЁЯПж ECR"]
box["ЁЯУж hello-school:abc123"]
scan["ЁЯЫбя╕П scan on push"]
end
k8s["тШ╕я╕П k8s course:<br/>Deployments RUN it"]
argo["ЁЯдЦ ArgoCD course:<br/>git deploys it, forever"]
dev -->|"1"| ci -->|"2"| ecr
ecr -->|"3 pulled by cluster"| k8s
ecr -.->|"4 address committed to git"| argo
тЭУ рдХрд╛рдп (GitHub Actions рдЪреЗ рдЦрд░реЗ рдЙрджрд╛рд╣рд░рдг)
# .github/workflows/ship.yml тАФ illustrative; store AWS creds as CI secrets
on: { push: { branches: [main] } }
jobs:
ship:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t app app/ # ЁЯН▒ (tests would run first)
- uses: aws-actions/configure-aws-credentials@v4
with: { aws-region: ap-south-1,
role-to-assume: arn:aws:iam::ACCOUNT:role/ci-ecr-push } # ЁЯкк no long-lived keys
- run: |
REPO=ACCOUNT.dkr.ecr.ap-south-1.amazonaws.com/hello-school
aws ecr get-login-password | docker login --username AWS --password-stdin "$REPO" # ЁЯОл
docker tag app "$REPO:${GITHUB_SHA::7}" # ЁЯП╖я╕П tag = commit
docker push "$REPO:${GITHUB_SHA::7}" # ЁЯУж
- Tag = commit SHA рд╣рд╛ рд╕рдЧрд│рд╛ рднрд╛рд░ рдкреЗрд▓рдгрд╛рд░рд╛ рд╕рдВрдХреЗрдд рдЖрд╣реЗ: рддреНрдпрд╛рдореБрд│реЗ deploys traceable рд╣реЛрддрд╛рдд (k8s рдХреЛрд░реНрд╕) рдЖрдгрд┐ GitOps commits рдирд╛ рдЕрд░реНрде рдпреЗрддреЛ (ArgoCD рдХреЛрд░реНрд╕).
- OIDC role assumption (
role-to-assume) CI рдордзреНрдпреЗ AWS keys рд╕рд╛рдард╡рдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рд╕рд░рд╕ рдЖрд╣реЗ тАФ рджрд┐рд╡рд╕рд╛рдЪреНрдпрд╛ рдкрд╛рд╕рд╛рдЪреЗ рдЖрдзреБрдирд┐рдХ рд░реВрдк.
ЁЯза рдХрд│рд╕рд╛рдзреНрдпрд╛рдп тАФ рд╕рдВрдкреВрд░реНрдг pipeline рдПрдХрд╛ рдЪрд┐рддреНрд░рд╛рдд
Developer
тФВ git push
тЦ╝
CI тФАтФА test тФАтФА docker build тФАтФА scan тФАтФА tag (commit SHA) тФАтФА push
тФВ
тЦ╝
ECR
тФВ image pull (IAM role)
тЦ╝
Kubernetes
тФВ desired state from git
тЦ╝
ArgoCD
Docker artifact рдмрдирд╡рддреЗ. ECR artifact рд╕рд╛рдард╡рддреЗ. Kubernetes artifact рдЪрд╛рд▓рд╡рддреЗ. ArgoCD deployment рд╕рд╛рдВрднрд╛рд│рддреЗ.
ЁЯОУ рдкрджрд╡реА рдкрд░реАрдХреНрд╖рд╛ тАФ рд╣реЗ рд╕рдордЬрд╛рд╡рддрд╛ рдпреЗрддреЗ рдХрд╛?
рдПрдХ developer рдХреЛрдб Git рд╡рд░ push рдХрд░рддреЗ. CI Docker image build рдХрд░рддреЗ, рддреА scan рдХрд░рддреЗ рдЖрдгрд┐ ECR рд╡рд░ push рдХрд░рддреЗ. рдирдВрддрд░ Kubernetes рддреА image pull рдХрд░реВрди рдЪрд╛рд▓рд╡рддреЗ. ArgoCD Kubernetes рдЪреА configuration Git рд╢реА рдЬреБрд│рддреЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рддреЗ.
- Source code рдХреБрдареЗ рдЖрд╣реЗ?
- Image рдХреЛрдг рдмрдирд╡рддреЗ?
- Image рдЪреНрдпрд╛ рдЖрдд рдХрд╛рдп рдЖрд╣реЗ?
- Image рдХреБрдареЗ рд╕рд╛рдард╡рд▓реА рдЬрд╛рддреЗ?
- рдиреЗрдордХреА image рдХрд╢рд╛рдиреЗ рдУрд│рдЦрд▓реА рдЬрд╛рддреЗ?
- ECR рд╡рд░ push рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рдХреЛрдгрд╛рд▓рд╛ рдЖрд╣реЗ?
- ECR рд╡рд░реВрди pull рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рдХреЛрдгрд╛рд▓рд╛ рдЖрд╣реЗ?
- Container рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХреЛрдг рдЪрд╛рд▓рд╡рддреЗ?
- Image tag рдмрджрд▓рд▓рд╛ рддрд░ рдХрд╛рдп рд╣реЛрддреЗ?
- ArgoCD рдХреБрдареЗ рдмрд╕рддреЗ?
рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░ рдПрдХрд╛ рд╡рд╛рдХреНрдпрд╛рдд рджреЗрддрд╛ рдЖрд▓реЗ, рддрд░ рддреБрдордЪреА рд╣реА рд╢рд╛рд│рд╛ рдкреВрд░реНрдг рдЭрд╛рд▓реА.
ЁЯдФ рдХрд╛
рд╣рд╛рддрд╛рдиреЗ рдкрд╛рдард╡рдгреНрдпрд╛рд▓рд╛ рд╣рд╛рддрд╛рдиреЗ deploy рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦрд╛рдЪ рдЖрдЬрд╛рд░ рдЖрд╣реЗ (ArgoCD рдХреЛрд░реНрд╕, рдзрдбрд╛ 01): рддреЗ рдорд╛рдгрд╕рд╛рдЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рд░рд╛рд╣рдгреНрдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ. Robot рдкреНрд░рддреНрдпреЗрдХ image tested, labeled, scanned рдЖрдгрд┐ рдЬрд╛рдЧреЗрд╡рд░ рдареЗрд╡рд▓реЗрд▓реА рдХрд░рддреЛ тАФ рдЕрдЧрджреА рддрд╢реАрдЪ, рдХрд╛рдпрдо. рддреБрдордЪреЗ рдХрд╛рдо рдлрдХреНрдд рдХреЛрдб рд▓рд┐рд╣рд┐рдгреЗ рдЖрдгрд┐ scan reports рд╡рд╛рдЪрдгреЗ рдПрд╡рдвреЗрдЪ рдЙрд░рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# read a real scan report from your lesson-11 push:
aws ecr describe-image-scan-findings --repository-name hello-school \
--image-id imageTag=v1 --query 'imageScanFindings.findingSeverityCounts'
# alpine base тЖТ usually a very short list ЁЯк╢
# cleanup when done playing (stop the pennies):
# terraform -chdir=ecr destroy # or:
# aws ecr delete-repository --repository-name hello-school --force
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- CI images рдирд╛ commit SHA рдРрд╡рдЬреА
latesttag рджреЗрдгреЗ тАФ deploys рдкреБрдиреНрд╣рд╛ рддрд╕реЗрдЪ рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реАрдд - CI рдиреЗ рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд▒реНрдпрд╛ AWS keys рдиреЗ push рдХрд░рдгреЗ тАФ рддреНрдпрд╛рдРрд╡рдЬреА OIDC тЖТ role
- "рд╡реЗрдЧрд╛рд╕рд╛рдареА" scan рдЪреА рдкрд╛рдпрд░реА рд╡рдЧрд│рдгреЗ тАФ рдХрд╛рд╣реА рд╕реЗрдХрдВрдж рдШреЗрдгрд╛рд░реА рдЖрдгрд┐ incidents рд╡рд╛рдЪрд╡рдгрд╛рд░реА рд╣реАрдЪ рддреА рдПрдХ рдкрд╛рдпрд░реА
ЁЯОУ Trilogy тАФ рддреБрдореНрд╣реА рдЖрддрд╛ рдХреБрдареЗ рдЖрд╣рд╛рдд
рддреБрдореНрд╣реА 3 рдкреИрдХреА рдХреЛрд░реНрд╕ 1 рдкреВрд░реНрдг рдХреЗрд▓рд╛: рддреБрдордЪрд╛ рдХреЛрдб рдЖрдкреЛрдЖрдк tested, рдЫреЛрдЯреА, labeled, scanned image рдмрдиреВрди рдЦрд╛рдЬрдЧреА registry рдордзреНрдпреЗ рдмрд╕рддреЛ. рдкреБрдвреЗ:
- тШ╕я╕П Learn Kubernetes School тАФ cluster рддреБрдордЪреНрдпрд╛ images рдЪрд╛рд▓рд╡рддреЛ: pods, services, autoscaling, rollouts.
- ЁЯдЦ Learn ArgoCD School тАФ git рддреНрдпрд╛ deploy рдХрд░рддреЗ: рдХрд╛рд│рдЬреА рдШреЗрдгрд╛рд░рд╛ robot, self-heal, 10 рд╕реЗрдХрдВрджрд╛рдВрдЪреЗ rollbacks.
рдкреЕрдХ рдХрд░рд╛. рдЪрд╛рд▓рд╡рд╛. рдХрд╛рдпрдо рдкрд╛рдард╡рдд рд░рд╛рд╣рд╛. ЁЯН▒тШ╕я╕ПЁЯдЦ
git checkout main