ЁЯЪЪ рдзрдбрд╛ 10 тАФ CI рдордзреВрди Kubernetes рд╡рд░ deploy: delivery рд╡реНрд╣реЕрди
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдорд╛рдЧреАрд▓: lesson-09-deploy-strategies ┬╖ рдкреБрдвреАрд▓: lesson-11-four-dialects
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ09, рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп рд╡реНрд╣реЕрдирдЪрд╛ рдкреВрд░реНрдг рдорд╛рд░реНрдЧ: day pass рдШреНрдпрд╛, рд╢рд╛рд│рд╛ рд╢реЛрдзрд╛, placeholder рдмрджрд▓рд╛, рд╕реВрдЪрдирд╛ рд▓рд╛рд╡рд╛, рддреА рд╡рд╛рдЪрдиреАрдп рд╣реЛрдИрдкрд░реНрдпрдВрдд рдерд╛рдВрдмрд╛, рдШрд░реА рдкрд░рдд рдЬрд╛. рдЦрд▒реНрдпрд╛ files:
- .github/workflows/deploy.yml тАФ рд╡реНрд╣реЕрди:
stagingjob, рдордЧ gate рдЕрд╕рд▓реЗрд▓рд╛productionjob - .github/workflows/ship.yml тАФ
workflow_callрдордзреВрди рд╡реНрд╣реЕрдирд▓рд╛ image reference рджреЗрддреЛ - k8s/deployment.yaml ┬╖ k8s/service.yaml тАФ рдЬреЗ apply рд╣реЛрддреЗ рддреЗ, рдмрджрд▓рдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдгрд╛рд▒реНрдпрд╛
IMAGE_PLACEHOLDERрд╕рд╣ - iam/ci-role-policy.json тАФ
update-kubeconfigрд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реА рдПрдХрдореЗрд╡ permission рдореНрд╣рдгрдЬреЗeks:DescribeCluster
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдлреЛрдЯреЛрдХреЙрдкреА рд▓реЙрдХрд░рдордзреНрдпреЗ ЁЯПж рдЖрд╣реЗрдд (рдзрдбрд╛ 07) рдЖрдгрд┐ рдкреНрд░рд╛рдЪрд╛рд░реНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рд╣реАрдЪрд╛ рдирд┐рдпрдо рдард░рд▓рд╛ рдЖрд╣реЗ (рдзрдбрд╛ 08). рддрд░реАрд╣реА рдХреЛрдгрд╛рд▓рд╛ рддрд░реА рдЧрд╛рдбреА рдЪрд╛рд▓рд╡рдд рд╢рд╛рд│реЗрдд рдЬрд╛рд╡реЗ рд▓рд╛рдЧрддреЗ. ЁЯЪЪ
рдкреНрд░рддреНрдпреЗрдХ рдлреЗрд░реАрдд рд╡реНрд╣реЕрди рддреНрдпрд╛рдЪ рдЪрд╛рд░ рдЧреЛрд╖реНрдЯреА рдХрд░рддреЗ:
- рдлрд╛рдЯрдХрд╛рд╡рд░ рдЖрдкрд▓рд╛ badge рджрд╛рдЦрд╡рддреЗ ЁЯкк тАФ glove box рдордзреНрдпреЗ master key рдирд╛рд╣реА. OIDC badge рдЪреНрдпрд╛ рдмрджрд▓реНрдпрд╛рдд day pass рдорд┐рд│рддреЛ (рдзрдбрд╛ 06), рдЖрдгрд┐ рд╢рд╛рд│реЗрдЪреНрдпрд╛ front desk рдЪреНрдпрд╛ рдпрд╛рджреАрдд рд╡реНрд╣реЕрдирдЪреЗ рдирд╛рд╡ рдЕрд╕рддреЗ.
- рд╢рд╛рд│рд╛ рдХреБрдареЗ рдЖрд╣реЗ рддреЗ рд╡рд┐рдЪрд╛рд░рддреЗ ЁЯЧ║я╕П тАФ
aws eks update-kubeconfigрдкрддреНрддрд╛ рдЖрдгрд┐ рдлрд╛рдЯрдХрд╛рдЪрд╛ pass рдПрдХрд╛ kubeconfig file рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рддреЛ. - рд╕реВрдЪрдирд╛ рд▓рд╛рд╡рддреЗ ЁЯУМ тАФ рдЖрдЬрдЪрд╛ copy рдХреНрд░рдорд╛рдВрдХ рд╕реВрдЪрдиреЗрд╡рд░ рд▓рд┐рд╣рд┐рддреЗ
(
sedIMAGE_PLACEHOLDERрдмрджрд▓рддреЛ), рдордЧkubectl apply. - рд╡рд╛рдЪрдиреАрдп рд╣реЛрдИрдкрд░реНрдпрдВрдд рдерд╛рдВрдмрддреЗ тП│ тАФ рдзрдбрд╛ 09 рдЪрд╛ rolling update рдкреВрд░реНрдг рд╣реЛрдИрдкрд░реНрдпрдВрдд
kubectl rollout statusрдЕрдбрд╡реВрди рдареЗрд╡рддреЛ, рдХрд┐рдВрд╡рд╛ рд╣рд╛рд░ рдорд╛рдиреВрди рдЕрдпрд╢рд╕реНрд╡реА delivery рдиреЛрдВрджрд╡рддреЛ. рд╕рд░рд╛рд╡ рдлрд▓рдХрд╛рд╡рд░ рддреА рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдПрдЦрд╛рджреНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрд▓рд╛ рд╕реВрдЪрдирд╛ рдореЛрдареНрдпрд╛рдиреЗ рд╡рд╛рдЪрд╛рдпрд▓рд╛рд╣реА рд╕рд╛рдВрдЧрддреЗ (cluster рдордзрд▓реА smoke test).
рдордЧ рддреА рдШрд░реА рдкрд░рдд рдЬрд╛рддреЗ. рдЖрдгрд┐ рдЗрдереЗрдЪ рдореЗрдЦ рдЖрд╣реЗ: рд╡реНрд╣реЕрди рдЧреЗрд▓реА рдХреА mailroom рдордзрд▓реЗ рдХреЛрдгреАрд╣реА рдлрд▓рдХрд╛рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рдд рдирд╛рд╣реА. рдПрдЦрд╛рджреНрдпрд╛ рд╢рд┐рдХреНрд╖рд┐рдХреЗрдиреЗ рд╣рд╛рддрд╛рдиреЗ pin рд╣рд▓рд╡рд▓рд╛, рддрд░ mailroom рд▓рд╛ рддреЗ рдкреБрдврдЪреНрдпрд╛ delivery рд▓рд╛ рдХрд│рддреЗ, рдХрд│рд▓реЗрдЪ рддрд░. рд╣рд╛ рд╡рд┐рдЪрд╛рд░ ArgoCD рд╢рд╛рд│реЗрд╕рд╛рдареА рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
ship["ЁЯУж ship.yml<br/>image = тАж/hello-courier:sha"]
badge["ЁЯкк configure-aws-credentials<br/>OIDC тЖТ day pass"]
kc["ЁЯЧ║я╕П aws eks update-kubeconfig"]
pin["ЁЯУМ sed IMAGE_PLACEHOLDER<br/>kubectl apply -n staging"]
wait["тП│ kubectl rollout status<br/>--timeout=180s"]
smoke["ЁЯзк kubectl run smoke<br/>curl hello-courier/healthz"]
gate["ЁЯЫС environment: production<br/>required reviewers"]
prod["ЁЯУМ same four moves<br/>-n production"]
drift["ЁЯд╖ nobody watches the board<br/>тЖТ ArgoCD school"]
ship -->|"1 workflow_call"| badge
badge -->|"2"| kc
kc -->|"3"| pin
pin -->|"4"| wait
wait -->|"5 exit 0"| smoke
smoke -->|"6"| gate
gate -->|"7 approved"| prod
prod -.->|"8 the van drives away"| drift
тЭУ рдХрд╛рдп
- Push model = pipeline рдХрдбреЗ cluster рдЪреЗ credentials рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рддреА рдмрд╛рд╣реЗрд░реВрди рдмрджрд▓ рдЖрдд рдврдХрд▓рддреЗ. рдкрд░реНрдпрд╛рдп, pull model, рдордзреНрдпреЗ cluster рдЪреНрдпрд╛ рдЖрддрд▓рд╛ agent git рдордзреВрди рд╣рд╡реА рдЕрд╕рд▓реЗрд▓реА рд╕реНрдерд┐рддреА рдЖрдгрддреЛ тАФ рддреАрдЪ ArgoCD рд╢рд╛рд│рд╛.
aws eks update-kubeconfig= рдЕрд╕реЗ kubeconfig рд▓рд┐рд╣рд┐рддреЛ рдЬреНрдпрд╛рдЪреА user entryaws eks get-tokenрдЪрд╛рд▓рд╡рддреЗ; рддреНрдпрд╛рд╕рд╛рдареА role рд╡рд░eks:DescribeClusterрд▓рд╛рдЧрддреЗ, рдЖрдгрд┐ cluster рдиреЗ рддреЛ IAM role рдПрдХрд╛ Kubernetes identity рд╢реА рдЬреЛрдбрд▓реЗрд▓рд╛ рдЕрд╕рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ (EKS access entries, рдХрд┐рдВрд╡рд╛ рдЬреБрдирд╛aws-authConfigMap) тАФ рд╣реА рдПрдХ setup рдкрд╛рдпрд░реА рдЖрд╣реЗ, рдЗрдереЗ рд╢рд┐рдХрд╡рд▓реЗрд▓реА рдирд╛рд╣реА.- Placeholder рдмрджрд▓ = git рдордзрд▓рд╛ manifest
IMAGE_PLACEHOLDERрдореНрд╣рдгрддреЛ; job apply рдХрд░рдгреНрдпрд╛рдЖрдзреА рдЦрд░рд╛ reference рддреНрдпрд╛рдд рд▓рд┐рд╣рд┐рддреЛ. рд╣реЗ рдХрд░рдгрд╛рд░реЗ рд╕рд░реНрд╡рд╛рдд рдЫреЛрдЯреЗ tool рдореНрд╣рдгрдЬреЗsed;kustomize edit set imageрдЖрдгрд┐helm upgrade --set image.tag=рд╣реЗ рдЕрдзрд┐рдХ рдиреАрдЯрдиреЗрдЯрдХреЗ рдЖрд╣реЗрдд. kubectl rollout status --timeout= рдкрд╛рд╕/fail рдЧреЗрдЯ: Deployment рдкреВрд░реНрдг рдЭрд╛рд▓рд╛ рдХреА exit 0, rollout рдЕрдбрдХрд▓рд╛ рдХрд┐рдВрд╡рд╛ timeout рдЖрд▓рд╛ рддрд░ non-zero.- Cluster рдордзрд▓реА smoke test =
kubectl run тАж --image=curlimages/curlnamespace рдЪреНрдпрд╛ рдЖрддреВрди Service рд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ DNS рдирд╛рд╡рд╛рдиреЗ curl рдХрд░рддреЗ, рдореНрд╣рдгрдЬреЗ pods рдЖрдгрд┐ Service рдЪреА рдЬреЛрдбрдгреА рдЪрд╛рд▓рддреЗ рд╣реЗ рд╕рд┐рджреНрдз рд╣реЛрддреЗ тАФ рдлрдХреНрдд container рд╕реБрд░реВ рдЭрд╛рд▓рд╛ рдПрд╡рдвреЗрдЪ рдирд╡реНрд╣реЗ. - рдкреНрд░рддреНрдпреЗрдХ environment рд╕рд╛рдареА рдПрдХ namespace:
stagingрдЖрдгрд┐productionрдореНрд╣рдгрдЬреЗ рддреЗрдЪ YAML рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛-nрд╕рд╣ рджреЛрдирджрд╛ apply рдХреЗрд▓реЗрд▓реЗ. рддреЗрдЪ manifests, рд╡реЗрдЧрд│рд╛ рдлрд▓рдХ.
ЁЯза рд╡реНрд╣реЕрдирдЪреНрдпрд╛ рдЪрд╛рд░ рдЪрд╛рд▓реА тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд╢рд╛рдореБрд│реЗ fail рд╣реЛрддреЗ
| рдЪрд╛рд▓ | рдХрд╛рдп рдЪрд╛рд▓рддреЗ | job fail рд╣реЛрддреЛ рдЬреЗрд╡реНрд╣рд╛ |
|---|---|---|
| ЁЯкк badge | OIDC тЖТ рддрд╛рддреНрдкреБрд░рддреЗ credentials | trust policy рдЪрд╛ sub рдпрд╛ repo рдЖрдгрд┐ branch рд╢реА рдЬреБрд│рдд рдирд╛рд╣реА |
| ЁЯЧ║я╕П рдкрддреНрддрд╛ | aws eks update-kubeconfig |
role рдХрдбреЗ eks:DescribeCluster рдирд╛рд╣реА, рдХрд┐рдВрд╡рд╛ cluster рдиреЗ рддреЛ рдЬреЛрдбрд▓реЗрд▓рд╛ рдирд╛рд╣реА |
| ЁЯУМ рд▓рд╛рд╡рдгреЗ | sed + kubectl apply -n <ns> -f k8s/ |
рдЕрд╡реИрдз YAML, рдХрд┐рдВрд╡рд╛ рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ identity рд▓рд╛ namespace рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рдирд╛рд╣реА |
| тП│ рдерд╛рдВрдмрдгреЗ | kubectl rollout status --timeout=180s |
рдирд╡рд╛ pod рд╡реЗрд│реЗрдд /healthz рд▓рд╛ рдХрдзреАрдЪ рдЙрддреНрддрд░ рджреЗрдд рдирд╛рд╣реА |
ЁЯдФ рдХрд╛
рдпрд╛ рдзрдбреНрдпрд╛рдЖрдзреА "deploy" рдореНрд╣рдгрдЬреЗ laptop рд╡рд░ kubeconfig рдЕрд╕рд▓реЗрд▓реА рдПрдХ рд╡реНрдпрдХреНрддреА тАФ рдХреБрдареЗрд╣реА рди рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ, рдкреБрдиреНрд╣рд╛ рдХрд░рд╛рдпрд▓рд╛ рдЕрд╡рдШрдб, рдЖрдгрд┐ рддреА file рдЬреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ рдЕрд╕реЗрд▓ рддреНрдпрд╛рд▓рд╛ рдмрд╛рдВрдзрд▓реЗрд▓реЗ. рд╡реНрд╣реЕрдирдореБрд│реЗ рддреЗ рджрд░рд╡реЗрд│реА рддреНрдпрд╛рдЪ рдЪрд╛рд░ commands рд╣реЛрддреЗ, commit рд╢реЗрдЬрд╛рд░реА log рд╣реЛрддреЗ, рдзрдбрд╛ 08 рдЪреНрдпрд╛ approval рдорд╛рдЧреЗ. AWS рд╢рд╛рд│реЗрдЪрд╛ L05 рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛ key рдкреЗрдХреНрд╖рд╛ badge рдХрд╛ рд╕рд░рд╕ рдЖрд╣реЗ рддреЗ рд╕рдордЬрд╛рд╡рддреЛ; ArgoCD рд╢рд╛рд│реЗрдЪрд╛ L03 рдиреЗрдордХреА рд╣реАрдЪ pipeline рдХрд╛рдврддреЛ, рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ L04 рдЖрдгрд┐ L05 job рд╕рдВрдкрд▓реНрдпрд╛рд╡рд░ рд╡реНрд╣реЕрдирд▓рд╛ рдХрд╛рдп рджрд┐рд╕реВ рд╢рдХрдд рдирд╛рд╣реА рдЖрдгрд┐ рддреНрдпрд╛рдмрджреНрджрд▓ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ рддреЗ рдореЛрдЬрддрд╛рдд.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
deploy.yml рдЪрд╛ рдкреВрд░реНрдг staging job:
jobs:
staging:
runs-on: ubuntu-latest
environment: staging # the practice notice board
steps:
- uses: actions/checkout@v4
- uses: aws-actions/configure-aws-credentials@v4
with: { role-to-assume: "${{ vars.AWS_ROLE_ARN }}", aws-region: "${{ vars.AWS_REGION }}" }
- name: ЁЯФз point kubectl at the cluster
run: aws eks update-kubeconfig --region "${{ vars.AWS_REGION }}" --name "${{ vars.EKS_CLUSTER }}"
- name: ЁЯУМ pin the new notice (rolling update, lesson 09)
run: |
sed -i "s|IMAGE_PLACEHOLDER|${{ inputs.image }}|" k8s/deployment.yaml
kubectl apply -n staging -f k8s/
kubectl rollout status -n staging deployment/hello-courier --timeout=180s
- name: ЁЯзк smoke-test staging from inside the cluster
run: kubectl run -n staging smoke --rm -i --restart=Never --image=curlimages/curl -- -fsS http://hello-courier/healthz
production job рддреНрдпрд╛рдЪ steps -n production рд╕рд╣, environment: production рдорд╛рдЧреЗ
рдкреБрдиреНрд╣рд╛ рдХрд░рддреЛ. рдЕрдзрд┐рдХ рдиреАрдЯрдиреЗрдЯрдХреЗ placeholder рдмрджрд▓ рдЕрд╕реЗ рджрд┐рд╕рддрд╛рдд:
# illustrative тАФ this repo ships neither a kustomization.yaml nor a Helm chart
kustomize edit set image hello-courier=123456789012.dkr.ecr.ap-south-1.amazonaws.com/hello-courier:$GITHUB_SHA
helm upgrade --install hello-courier ./chart --set image.tag=$GITHUB_SHA
ЁЯФБ рд╣реЗрдЪ CircleCI рдордзреНрдпреЗ
deploy-to-eks:
parameters:
namespace:
type: string
docker:
- image: cimg/aws:2024.03
steps:
- checkout
- aws-cli/setup:
role_arn: ${AWS_ROLE_ARN}
region: ${AWS_DEFAULT_REGION}
- run:
name: ЁЯУМ apply and wait for the rollout
command: |
IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY}:${CIRCLE_SHA1}"
sed -i "s|IMAGE_PLACEHOLDER|${IMAGE}|" k8s/deployment.yaml
kubectl apply -n << parameters.namespace >> -f k8s/
kubectl rollout status -n << parameters.namespace >> deployment/hello-courier --timeout=180s
рдПрдХрдЪ parameterized job, workflows: рдордзреВрди рджреЛрдирджрд╛ рдмреЛрд▓рд╛рд╡рд▓реЗрд▓рд╛ тАФ namespace: staging рд╕рд╣ deploy-staging, рдЖрдгрд┐ hold-for-approval рдирдВрддрд░ namespace: production рд╕рд╣ deploy-production.
ЁЯжК рд╣реЗрдЪ GitLab CI рдордзреНрдпреЗ
.deploy: &deploy
stage: deploy
image: amazon/aws-cli:2.17.0
<<: *aws-badge
script:
- aws eks update-kubeconfig --region "$AWS_REGION" --name "$EKS_CLUSTER"
- IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPOSITORY}:${CI_COMMIT_SHA}"
- sed -i "s|IMAGE_PLACEHOLDER|${IMAGE}|" k8s/deployment.yaml
- kubectl apply -n "$NAMESPACE" -f k8s/
- kubectl rollout status -n "$NAMESPACE" deployment/hello-courier --timeout=180s
deploy-staging:
<<: *deploy
variables: { NAMESPACE: staging }
environment: { name: staging }
.deploy anchor рдореНрд╣рдгрдЬреЗ рд╡реНрд╣реЕрди; рдкреНрд░рддреНрдпреЗрдХ environment рдореНрд╣рдгрдЬреЗ рддреЛ anchor рдЕрдзрд┐рдХ рдПрдХ NAMESPACE рдЖрдгрд┐ рдПрдХ environment: рдирд╛рд╡.
ЁЯОй рд╣реЗрдЪ Jenkins рдордзреНрдпреЗ
def deployTo(String namespace) {
withAWS(credentials: 'aws-school-cicd', region: env.AWS_REGION) {
sh """
ACCOUNT=\$(aws sts get-caller-identity --query Account --output text)
IMAGE="\${ACCOUNT}.dkr.ecr.${env.AWS_REGION}.amazonaws.com/${env.ECR_REPOSITORY}:${env.GIT_COMMIT}"
aws eks update-kubeconfig --region ${env.AWS_REGION} --name ${env.EKS_CLUSTER}
sed -i "s|IMAGE_PLACEHOLDER|\${IMAGE}|" k8s/deployment.yaml
kubectl apply -n ${namespace} -f k8s/
kubectl rollout status -n ${namespace} deployment/hello-courier --timeout=180s
"""
}
}
deployTo('staging') рдореНрд╣рдгреВрди рдмреЛрд▓рд╛рд╡рд▓рд╛ рдЬрд╛рддреЛ, рдЖрдгрд┐ input stage рдирдВрддрд░ deployTo('production') рдореНрд╣рдгреВрди.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
рд╡реНрд╣реЕрдирдЪрд╛ рдорд╛рд░реНрдЧ, рд╕реНрдерд╛рдирд┐рдХ cluster рд╡рд░ рд╣рд╛рддрд╛рдиреЗ рдЪрд╛рд▓рд╡рд▓реЗрд▓рд╛. рдлрдХреНрдд AWS рдЕрд╢реА рдЦреВрдг рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдУрд│реАрдВрдирд╛ account рд▓рд╛рдЧрддреЗ; рдмрд╛рдХреА kind рдХрд┐рдВрд╡рд╛ Docker Desktop рд╡рд░ рдЪрд╛рд▓рддреЗ.
# 0) local cluster + both boards (skip the first line if lesson 09's cluster is still up)
kind create cluster --name school
kubectl create namespace staging; kubectl create namespace production
# 1) the photocopy тАФ ship.yml's build job, locally (CI tags with the full SHA)
docker build --build-arg APP_VERSION=$(git rev-parse --short HEAD) -t hello-courier:local app
kind load docker-image hello-courier:local --name school # kind only; Docker Desktop shares its daemon
# 2) the van as a loop: staging, a signature, production
IMAGE=hello-courier:local
for NS in staging production; do
echo "ЁЯЪЪ delivering $IMAGE to $NS"
# AWS only: aws-actions/configure-aws-credentials тЖТ locally, your kubeconfig already exists
# AWS only: aws eks update-kubeconfig --region ap-south-1 --name school-eks
sed "s|IMAGE_PLACEHOLDER|$IMAGE|" k8s/deployment.yaml | kubectl apply -n "$NS" -f - # CI: sed -i on its throwaway checkout
kubectl apply -n "$NS" -f k8s/service.yaml
kubectl rollout status -n "$NS" deployment/hello-courier --timeout=180s || { echo "тЭМ failed delivery"; break; }
kubectl run -n "$NS" smoke --rm -i --restart=Never --image=curlimages/curl -- -fsS http://hello-courier/healthz
[ "$NS" = staging ] && { echo "ЁЯЫС principal: press Enter to approve production"; read -r _; }
done
# 3) AWS only тАФ the real van: set the four repo variables from ship.yml's header, then
gh workflow run deploy.yml -f image=123456789012.dkr.ecr.ap-south-1.amazonaws.com/hello-courier:<full-sha>
gh run watch
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- kubeconfig рдХрд┐рдВрд╡рд╛ рджреАрд░реНрдШрдХрд╛рд│ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ AWS keys CI secret рдореНрд╣рдгреВрди рд╕рд╛рдард╡рдгреЗ тАФ рд╣реАрдЪ glove box рдордзрд▓реА master key; OIDC role рдЖрдгрд┐ cluster рдордзрд▓реЗ role mapping рддрд┐рдЪреА рдЬрд╛рдЧрд╛ рдШреЗрддрд╛рдд
- рд╡рд╛рдЯ рди рдкрд╛рд╣рддрд╛ apply рдХрд░рдгреЗ: API server рдиреЗ YAML рд╕реНрд╡реАрдХрд╛рд░рддрд╛рдЪ
kubectl applyрдкрд░рдд рдпреЗрддреЛ, рдореНрд╣рдгреВрдиrollout statusрдкрд╛рд╕ рд╣реЛрдИрдкрд░реНрдпрдВрдд рд╣рд┐рд░рд╡рд╛ job рдлрд╛рд░рд╕реЗ рдХрд╛рд╣реА рд╕рд┐рджреНрдз рдХрд░рдд рдирд╛рд╣реА sed -iрдЪрд╛ рдирд┐рдХрд╛рд▓ рдмрд╛рд╣реЗрд░ рдЬрд╛рдК рджреЗрдгреЗ: рдмрджрд▓рд▓реЗрд▓реАdeployment.yamlrunner рд╡рд░рдЪ рдлреЗрдХреВрди рджреНрдпрд╛рдпрдЪреА рд░рд╛рд╣рд┐рд▓реА рдкрд╛рд╣рд┐рдЬреЗ тАФ рддреА commit рдХреЗрд▓реА рддрд░ рдкреБрдврдЪреНрдпрд╛ run рд╕рд╛рдареАIMAGE_PLACEHOLDERрдирд╛рд╣реАрд╕рд╛ рд╣реЛрддреЛ
тПня╕П рдкреБрдвреЗ
рд╡реНрд╣реЕрдирдиреЗ рдЖрддрд╛ GitHub Actions рдордзреНрдпреЗ рдкреВрд░реНрдг рдорд╛рд░реНрдЧ рдкрд╛рд░ рдХреЗрд▓рд╛. рдзрдбрд╛ 11 CircleCI, GitLab рдЖрдгрд┐ Jenkins рдЪреНрдпрд╛ рд╡реНрд╣реЕрди рддрд┐рдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реА рдЙрднреНрдпрд╛ рдХрд░рддреЛ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рд╢рдмреНрджрдХреЛрд╢ рджреЗрддреЛ.
git checkout lesson-11-four-dialects