ЁЯПл рдзрдбрд╛ 10 тАФ Ingress: рдореБрдЦреНрдп рдлрд╛рдЯрдХ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░рдЪрд╛ рдлрд▓рдХ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-09-autoscaling ┬╖ рдкреБрдврдЪрд╛: lesson-11-rollouts
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ09, рдЖрдгрд┐: Ingress тАФ internet рд╡рд░реВрди рдпреЛрдЧреНрдп Service рдкрд░реНрдпрдВрдд рдпреЗрдгрд╛рд░реЗ HTTP traffic. рдЦрд░реА file:
- k8s/ingress.yaml тАФ рдПрдХ AWS load balancer, рджреЛрди paths, рджреЛрди services
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрд▓рд╛ рдПрдХрдЪ рдореБрдЦреНрдп рдлрд╛рдЯрдХ ЁЯПл рдЕрд╕рддреЗ тАФ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧрдЦреЛрд▓реАрд╕рд╛рдареА рд╡реЗрдЧрд│реЗ рдлрд╛рдЯрдХ рдирд╛рд╣реА (30 рдлрд╛рдЯрдХрд╛рдВрд╕рд╛рдареА 30 рдкрд╣рд╛рд░реЗрдХрд▒реНрдпрд╛рдВрдЪрд╛ рдкрдЧрд╛рд░ рдХрд▓реНрдкрдирд╛ рдХрд░рд╛! ЁЯТ╕). рдлрд╛рдЯрдХрд╛рд╡рд░ рдПрдХ рдкрд╣рд╛рд░реЗрдХрд░реА рдлрд▓рдХ рдШреЗрдКрди рдЙрднрд╛ рдЕрд╕рддреЛ:
ЁЯкз "рдХреНрд░реАрдбрд╛ рджрд┐рдирд╛рд╕рд╛рдареА рдЖрд▓рд╛рдд? тЖТ рдбрд╛рд╡реАрдХрдбреЗ рдореИрджрд╛рдирд╛рдХрдбреЗ рдЬрд╛. рдмрд╛рдХреА рдХрд╛рд╣реАрд╣реА? тЖТ рд╕рд░рд│ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдХрдбреЗ рдЬрд╛."
рдкрд╛рд╣реБрдгреЗ рдлрдХреНрдд рддреНрдпрд╛ рдПрдХрд╛ рдлрд╛рдЯрдХрд╛рдХрдбреЗ рдпреЗрддрд╛рдд; рдкрд╣рд╛рд░реЗрдХрд░реА рддреНрдпрд╛рдВрдирд╛ рдХреБрдареЗ рдЬрд╛рдпрдЪреЗ рдЖрд╣реЗ рддреЗ рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдпреЛрдЧреНрдп рдЦреЛрд▓реАрдХрдбреЗ рдкрд╛рдард╡рддреЛ.
Ingress рдореНрд╣рдгрдЬреЗ рд╣реЗрдЪ рдлрд╛рдЯрдХ + рдлрд▓рдХ:
- рд╕рдВрдкреВрд░реНрдг app рд╕рд╛рдареА рдПрдХрдЪ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рд╡реЗрд╢рджреНрд╡рд╛рд░ (AWS рд╡рд░: рдПрдХ Application Load Balancer).
- URL рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдирд┐рдпрдо:
/analytics/...тЖТ Python service, рдмрд╛рдХреА рд╕рдЧрд│реЗ (/) тЖТ Node service. - рдлрд╛рдЯрдХ рд╕реНрд╡рддрдГ рдПрдХ рдкрд╣рд╛рд░реЗрдХрд▒реНрдпрд╛рдВрдЪреА рдХрдВрдкрдиреА рдмрд╛рдВрдзрддреЗ тАФ ingress controller (EKS рд╡рд░: AWS Load Balancer Controller add-on). рдкрд╣рд╛рд░реЗрдХрд▒реНрдпрд╛рдВрдЪреА рдХрдВрдкрдиреАрдЪ рдиреЗрдорд▓реА рдирд╛рд╣реА = рдлрд▓рдХ рдЖрд╣реЗ рдкрдг рддреЛ рдХреЛрдгреАрдЪ рд╡рд╛рдЪрдд рдирд╛рд╣реА!
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
U["ЁЯМН Internet<br/>parent's browser"]
ALB["ЁЯПл Main gate<br/>AWS ALB - created by<br/>the Ingress controller"]
R{"ЁЯкз signboard<br/>which path?"}
S1["тШОя╕П Service school-api"]
S2["тШОя╕П Service school-analytics"]
P1["ЁЯкС node pods"]
P2["ЁЯкС python pods"]
U -->|"http://gate/students"| ALB --> R
R -->|"/analytics/*"| S2 --> P2
R -->|"/* everything else"| S1 --> P1
тЭУ рдХрд╛рдп
- Ingress рдореНрд╣рдгрдЬреЗ HTTP routing рдирд┐рдпрдорд╛рдВрдЪрд╛ рд╕рдВрдЪ: host/path тЖТ Service. рддреЗ рдлрдХреНрдд data рдЖрд╣реЗ; рдПрдХ ingress controller рд╣реЗ рдирд┐рдпрдо рдкрд╛рд╣рддреЛ рдЖрдгрд┐ рддреЗ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЦрд░рд╛ load balancer configure рдХрд░рддреЛ.
- рдЖрдкрд▓рд╛ Ingress
ingressClassName: alb+ annotations рд╡рд╛рдкрд░рддреЛ, рдореНрд╣рдгреВрди AWS controller internet-facing ALB рдмрдирд╡рддреЛ рдЬреЛ рдереЗрдЯ pod IPs рдХрдбреЗ route рдХрд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ/healthzрд╡рд░ health-check рдХрд░рддреЛ (рдзрдбрд╛ 07 рдЪрд╛ endpoint, рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд▓реЗрд▓рд╛!). - рдирд┐рдпрдорд╛рдВрдЪрд╛ рдХреНрд░рдо рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛:
/analytics(рд╡рд┐рд╢рд┐рд╖реНрдЯ)/(рд╕рд░реНрд╡рд╕рдорд╛рд╡реЗрд╢рдХ) рдЪреНрдпрд╛ рдЖрдзреА рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ. - Local рд▓рд╛ AWS рдирд╕рддреЗ тАФ minikube рддреНрдпрд╛рдРрд╡рдЬреА NGINX ingress controller рд╡рд╛рдкрд░рддреЛ; рддреАрдЪ Ingress рдЪреА рдХрд▓реНрдкрдирд╛, рд╡реЗрдЧрд│реА рдкрд╣рд╛рд░реЗрдХрд▒реНрдпрд╛рдВрдЪреА рдХрдВрдкрдиреА.
ЁЯдФ рдХрд╛
рдзрдбрд╛ 04 рдордзрд▓реНрдпрд╛ Services ClusterIP рдЖрд╣реЗрдд тАФ рдореБрджреНрджрд╛рдо рдлрдХреНрдд рдЕрдВрддрд░реНрдЧрдд. рддреБрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ service
рддрд┐рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ cloud LoadBalancer рдиреЗ рдмрд╛рд╣реЗрд░ рдЙрдШрдбреВ рд╢рдХрддрд╛, рдкрдг рдкреНрд░рддреНрдпреЗрдХ LB рд▓рд╛ рдЦрд░реЗ рдкреИрд╕реЗ
рд▓рд╛рдЧрддрд╛рдд рдЖрдгрд┐ TLS, domains рдЖрдгрд┐ routing рддреБрдореНрд╣рд╛рд▓рд╛ N рд╡реЗрд│рд╛ рд╕рд╛рдВрднрд╛рд│рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдПрдХ Ingress = рдПрдХ
рдлрд╛рдЯрдХ, рдПрдХ рдмрд┐рд▓, рдПрдХ рдЬрд╛рдЧрд╛ HTTPS certificates рдЖрдгрд┐ path рдирд┐рдпрдорд╛рдВрд╕рд╛рдареА тАФ рдЖрдгрд┐ рдкреБрдвреЗ рдХрдзреА рддрд┐рд╕рд░реА
service рдЬреЛрдбрд╛рдпрдЪреА рдЭрд╛рд▓реА рддрд░ рдлрд▓рдХрд╛рд╡рд░ рдлрдХреНрдд рдПрдХ рдУрд│ рд╡рд╛рдврддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
k8s/ingress.yaml, рддреНрдпрд╛рддрд▓реЗ рд░рдВрдЬрдХ рднрд╛рдЧ:
metadata:
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing # public gate
alb.ingress.kubernetes.io/target-type: ip # straight to pod IPs
alb.ingress.kubernetes.io/healthcheck-path: /healthz
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /analytics # specific first!
backend: { service: { name: school-analytics, port: { number: 80 } } }
- path: / # catch-all last
backend: { service: { name: school-api, port: { number: 80 } } }
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# LOCAL (minikube):
minikube addons enable ingress # hire the local guard company
# use a local-friendly ingress (no ALB annotations needed):
sed '/alb.ingress/d; s/ingressClassName: alb/ingressClassName: nginx/' \
k8s/ingress.yaml | kubectl apply -f -
kubectl -n school get ingress # note the ADDRESS
minikube tunnel # then browse http://127.0.0.1/
# ON EKS (after terraform apply + installing the AWS LB Controller):
kubectl apply -f k8s/ingress.yaml
kubectl -n school get ingress -w # ADDRESS becomes a real ALB DNS name
curl http://<ALB-address>/students # тЖТ Node API
curl http://<ALB-address>/analytics/summary # тЖТ Python API
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get ingress ┬╖ kubectl describe ingress
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L15 (ALB) ┬╖ L16 (Route 53)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
curl -H 'Host: school.local' http://INGRESS_IP/analytics/ Python service рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддреЗ; / Node рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддреЗ тАФ рдПрдХ рдкрддреНрддрд╛, path рдиреБрд╕рд╛рд░ route.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
local cluster: kubectl delete -f k8s/ (рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА apply рдХреЗрд▓реЗрд▓реА file) тАФ EKS рд╡рд░ рдЪрд╛рд▓реВ рд░рд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯреАрдЪреЗ рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдмрд┐рд▓ рд▓рд╛рдЧрддреЗ; EKS рд╡рд░ рддреНрдпрд╛рдиреЗ рдмрдирд╡рд▓реЗрд▓реНрдпрд╛ ALB рдЪреЗ рджрд░ рддрд╛рд╕рд╛рд▓рд╛ рдмрд┐рд▓ рд▓рд╛рдЧрддреЗ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╡рд┐рд╢рд┐рд╖реНрдЯ paths
/рдЪреНрдпрд╛ рдирдВрддрд░ рд▓рд┐рд╣рд┐рдгреЗ тАФ рдХреНрд░рдо рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдЖрд╣реЗ - ingress controller add-on рд╡рд┐рд╕рд░рдгреЗ тАФ controller рдирд╕рд▓реЗрд▓рд╛ Ingress object рдХрд╛рд╣реАрдЪ рдХрд░рдд рдирд╛рд╣реА
тПня╕П рдкреБрдвреЗ
Traffic рд╡рд╛рд╣рддреЗ рдЖрд╣реЗ! рдЖрддрд╛: рдПрдХрд╛ рд╕реЗрдХрдВрджрд╛рдЪрд╛рд╣реА downtime рди рд╣реЛрддрд╛ version 2 рдХрд╕реЗ рдкрд╛рдард╡рд╛рдпрдЪреЗ тАФ рдЖрдгрд┐ рдЦрд░рд╛рдм release рдорд╛рдЧреЗ рдХрд╕рд╛ рдШреНрдпрд╛рдпрдЪрд╛? Rollouts рдЖрдгрд┐ rollbacks.
git checkout lesson-11-rollouts