Kubernetes හි Canary යෙදවීම ක්රියාත්මක කිරීමට සහ භාවිතා කිරීමට අපි Gitlab CI සහ manual GitOps භාවිතා කරන්නෙමු.
මෙම ලිපි මාලාවේ ලිපි:
- (මෙම ලිපිය)
ArgoCI භාවිතයෙන් කැනරි යෙදවීම - Istio භාවිතයෙන් කැනරි යෙදවීම
- Jenkins-X Istio Flagger භාවිතයෙන් කැනරි යෙදවීම
අපි GitOps හරහා කැනරි යෙදවීම අතින් සිදු කරන අතර ප්රධාන Kubernetes සම්පත් නිර්මාණය/වෙනස් කරන්නෙමු. මෙම ලිපිය මූලික වශයෙන් හැඳින්වීම සඳහා අදහස් කෙරේ Kubernetes Canary හි යෙදවීම ක්රියා කරන ආකාරය සමඟ, වඩාත් ඵලදායී ස්වයංක්රීය ක්රම ඇති බැවින්, එය අපි පහත ලිපි වලින් සලකා බලමු.
කැනරි යෙදවීම
Canary මූලෝපාය සමඟින්, යාවත්කාලීනයන් මුලින්ම යොදනු ලබන්නේ පරිශීලකයින්ගේ උප කුලකයකට පමණි. අධීක්ෂණය, ලොග් දත්ත, අතින් පරීක්ෂා කිරීම හෝ වෙනත් ප්රතිපෝෂණ නාලිකා හරහා, නිකුතුව සියලුම පරිශීලකයින් වෙත මුදා හැරීමට පෙර පරීක්ෂා කරනු ලැබේ.
Kubernetes Deployment (rolling update)
Kubernetes Deployment සඳහා වන පෙරනිමි මූලෝපාය වන්නේ rolling-update වන අතර, එහිදී රූපවල නව අනුවාද සමඟින් නිශ්චිත පොඩ් ගණනක් දියත් කෙරේ. ඒවා ගැටළු නොමැතිව නිර්මාණය කර ඇත්නම්, පින්තූරවල පැරණි අනුවාද සහිත කරල් අවසන් වන අතර නව කරල් සමාන්තරව නිර්මාණය වේ.
GitOps
අපි මෙම උදාහරණයේ GitOps භාවිතා කරන්නේ අපි:
- සත්යයේ තනි මූලාශ්රයක් ලෙස Git භාවිතා කිරීම
- ගොඩනැගීම සහ යෙදවීම සඳහා අපි Git මෙහෙයුම් භාවිතා කරමු (git tag/merge හැර වෙනත් විධාන අවශ්ය නොවේ)
උදාහරණ:
අපි හොඳ පරිචයක් ගනිමු - යෙදුම් කේතය සඳහා එක් ගබඩාවක් සහ යටිතල පහසුකම් සඳහා එකක් තිබීම.
යෙදුම් ගබඩාව
මෙය JSON ලෙස ප්රතිචාරයක් ලබා දෙන ඉතා සරල Python+Flask API එකකි. අපි GitlabCI හරහා පැකේජය ගොඩනඟා ප්රතිඵලය Gitlab Registry වෙත තල්ලු කරන්නෙමු. රෙජිස්ට්රි තුළ අපට විවිධ නිකුතු අනුවාද දෙකක් තිබේ:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
ඔවුන් අතර ඇති එකම වෙනස වන්නේ ආපසු ලබා දුන් JSON ගොනුවේ වෙනසයි. අප සන්නිවේදනය කරන්නේ කුමන අනුවාදයද යන්න හැකි තරම් පහසුවෙන් දෘශ්යමාන කිරීමට අපි මෙම යෙදුම භාවිතා කරමු.
යටිතල පහසුකම් ගබඩාව
මෙම turnip දී අපි GitlabCI හරහා Kubernetes වෙත යොදවන්නෙමු, .gitlab-ci.yml
මේ වගේ:
image: traherom/kustomize-docker
before_script:
- printenv
- kubectl version
stages:
- deploy
deploy test:
stage: deploy
before_script:
- echo $KUBECONFIG
script:
- kubectl get all
- kubectl apply -f i/k8s
only:
- master
එය ඔබම ක්රියාත්මක කිරීමට ඔබට පොකුරක් අවශ්ය වනු ඇත, ඔබට Gcloud භාවිතා කළ හැකිය:
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80
ඔබ ගෑරුප්පු කිරීමට අවශ්යයි KUBECONFIG
GitlabCI හි, ප්රවේශය සඳහා වින්යාසය අඩංගු වේ kubectl
ඔබේ පොකුරට.
පොකුරක් (Gcloud) සඳහා අක්තපත්ර ලබා ගන්නේ කෙසේද යන්න ගැන ඔබට කියවිය හැකිය
යටිතල පහසුකම් Yaml
යටිතල පහසුකම් ගබඩාවේ අපට සේවාව ඇත:
apiVersion: v1
kind: Service
metadata:
labels:
id: app
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancer
සහ යෙදවීම deploy.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 10
selector:
matchLabels:
id: app
type: main
template:
metadata:
labels:
id: app
type: main
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
name: app
resources:
limits:
cpu: 100m
memory: 100Mi
සහ තවත් යෙදවීමක් deploy-canary.yaml
:
kind: Deployment
metadata:
name: app-canary
spec:
replicas: 0
selector:
matchLabels:
id: app
type: canary
template:
metadata:
labels:
id: app
type: canary
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
name: app
resources:
limits:
cpu: 100m
memory: 100Mi
app-deploy හි තවමත් නිර්වචනය කර ඇති අනුරූ කිසිවක් නොමැති බව සලකන්න.
මූලික යෙදවීම සිදු කිරීම
මූලික යෙදවීම ආරම්භ කිරීම සඳහා, ඔබට ප්රධාන ශාඛාව මත GitlabCI නල මාර්ගය අතින් ආරම්භ කළ හැක. එයට පසු kubectl
පහත සඳහන් දේ ප්රතිදානය කළ යුතුය:
අපි දකිනවා app
අනුරූ 10 ක් සහ යෙදුම්-කැනරි 0 සමඟ යෙදවීම. අපට ප්රවේශ විය හැකි LoadBalancer එකක් ද ඇත. curl
බාහිර IP හරහා:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
අපගේ පරීක්ෂණ යෙදුම "v1" පමණක් ලබා දෙන බව අපට පෙනේ.
කැනරි යෙදවීම ක්රියාත්මක කිරීම
පියවර 1: සමහර පරිශීලකයින් සඳහා නව අනුවාදයක් නිකුත් කරන්න
අපි deploy-canary.yaml ගොනුවේ සහ නව අනුවාද රූපයේ අනුරූ ගණන 1 ට සකසමු:
kind: Deployment
metadata:
name: app-canary
spec:
replicas: 1
selector:
matchLabels:
id: app
type: canary
template:
metadata:
labels:
id: app
type: canary
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
name: app
resources:
limits:
cpu: 100m
memory: 100Mi
ගොනුවේ deploy.yaml
අපි අනුරූ ගණන 9 ට වෙනස් කළෙමු:
kind: Deployment
metadata:
name: app
spec:
replicas: 9
selector:
matchLabels:
id: app
...
අපි මෙම වෙනස්කම් යෙදවීම ආරම්භ වන (GitlabCI හරහා) ගබඩාවට තල්ලු කර එහි ප්රතිඵලයක් ලෙස බලන්න:
යෙදුම් තේරීම දෙකටම ඇති බැවින් අපගේ සේවාව යෙදවීම් දෙකටම යොමු කරනු ඇත. Kubernetes හි පෙරනිමි සසම්භාවීකරණය හේතුවෙන්, අපි ඉල්ලීම් වලින් ~10% සඳහා විවිධ ප්රතිචාර දැකිය යුතුය:
අපගේ යෙදුමේ වත්මන් තත්ත්වය (GitOps, Git වෙතින් සත්යයේ තනි මූලාශ්රයක් ලෙස ලබාගෙන ඇත) යනු එක් එක් අනුවාදය සඳහා එක බැගින් ක්රියාකාරී අනුරූ සහිත යෙදවුම් දෙකක් තිබීමයි.
පරිශීලකයින්ගෙන් ~10% නව අනුවාදයක් සමඟ හුරුපුරුදු වන අතර නොදැනුවත්වම එය පරීක්ෂා කරයි. ලඝු-සටහන් වල දෝෂ සහ ගැටළු සොයා ගැනීමට දත්ත අධීක්ෂණ කිරීමට දැන් කාලයයි.
පියවර 2: සියලුම පරිශීලකයින්ට නව අනුවාදය නිකුත් කරන්න
සෑම දෙයක්ම හොඳින් සිදු වූ බව අපි තීරණය කළ අතර දැන් අපි සියලු පරිශීලකයින්ට නව අනුවාදය ලබා දිය යුතුය. මෙය සිදු කිරීම සඳහා අපි සරලව යාවත්කාලීන කරන්නෙමු deploy.yaml
රූපයේ නව අනුවාදයක් ස්ථාපනය කිරීම සහ 10 ට සමාන අනුරූ ගණන deploy-canary.yaml
අපි අනුරූ ගණන නැවත 0 ලෙස සකසමු. යෙදවීමෙන් පසු, ප්රතිඵලය පහත පරිදි වේ:
සාරාංශ කිරීමට
මට නම්, මේ ආකාරයෙන් යෙදවීම අතින් ධාවනය කිරීම k8s භාවිතයෙන් එය කෙතරම් පහසුවෙන් වින්යාස කළ හැකිද යන්න තේරුම් ගැනීමට උපකාරී වේ. Kubernetes ඔබට API හරහා සියල්ල යාවත්කාලීන කිරීමට ඉඩ දෙන බැවින්, මෙම පියවරයන් ස්ක්රිප්ට් හරහා ස්වයංක්රීය කළ හැක.
ක්රියාත්මක කළ යුතු තවත් දෙයක් නම් නව අනුවාදයට පමණක් ප්රවේශ විය හැකි පරීක්ෂක පිවිසුම් ලක්ෂ්යයක් (LoadBalancer හෝ Ingress හරහා) ය. එය අතින් පිරික්සීම සඳහා භාවිතා කළ හැක.
ඉදිරි ලිපිවලදී, අප කළ බොහෝ දේ ක්රියාත්මක කරන වෙනත් ස්වයංක්රීය විසඳුම් අපි පරීක්ෂා කරන්නෙමු.
අපගේ බ්ලොග් අඩවියේ වෙනත් ලිපිද කියවන්න:
අවසරයකින් තොරව ClickHouse සිට අවසරය සහිත ClickHouse වෙත සංක්රමණය වීමට හේතු වූයේ කුමක් ද? Nginx සඳහා ගතික මොඩියුල ගොඩනැගීම nxs-build-tools යාවත්කාලීන කරන්න - deb සහ rpm පැකේජ ගොඩනැගීමේ සහායකයෙක් Hashicorp Consul's Kubernetes Authorization හැඳින්වීම Csync2 උපයෝගීතාව භාවිතා කරන විට අපට මුහුණ දීමට සිදු වූ දේ Redmine සඳහා Telegram bot. ඔබ සහ අන් අය සඳහා ජීවිතය සරල කරන්නේ කෙසේද?
මූලාශ්රය: www.habr.com