Kubernetes ááœáẠCanary ááŒáá·áºáá»ááºááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºááŸáá·áº á¡áá¯á¶ážááŒá¯áááºá¡ááœáẠGitlab CI ááŸáá·áº manual GitOps ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
á€á á®ážáá®ážá០áá±á¬ááºážáá«ážáá»á¬áž-
- (á€áá±á¬ááºáá«áž)
ArgoCI ááᯠá¡áá¯á¶ážááŒá¯á Canary Deployment - Istio ááᯠá¡áá¯á¶ážááŒá¯á Canary Deployment
- Jenkins-X Istio Flagger ááᯠá¡áá¯á¶ážááŒá¯á Canary ááŒáá·áºáá»ááºááŒááºážá
áá»áœááºá¯ááºááá¯á·ááẠCanary ááŒáá·áºáá»ááºááŸá¯ááᯠGitOps ááŸáá áºááá·áº ááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááŒá®áž áááºá Kubernetes á¡áááºážá¡ááŒá áºáá»á¬ážááᯠáááºáá®ážááŒááºáž/ááœááºážáá¶ááŒááºážáá»á¬áž ááŒá¯áá¯ááºáá«áááºá á€áá±á¬ááºážáá«ážááᯠááááºáááºáááºá¡ááœáẠá¡ááá áááºááœááºáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá«áá±á¬ááºážáá«ážáá»á¬ážááœáẠááá·áºááœááºážá ááºážá á¬ážáá±ážááá·áº ááá¯ááá¯áááá±á¬ááºáá±á¬ á¡ááá¯á¡áá»á±á¬ááºá áá áºááá¯ááºáᬠáááºážáááºážáá»á¬áž ááŸááá±á¬ááŒá±á¬áá·áº Kubernetes Canary ááœáẠááŒáá·áºáá»ááºáá¯ááºáá±á¬ááºáá¯á¶ááŸáá·áºá
Canary ááŒáá·áºáá»ááº
Canary áááºážáá»á°áá¬ááŒáá·áºá á¡ááºááááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá°á¡á¯ááºá á¯ááœá²ááá¯áᬠáŠážá áœá¬á¡áá¯á¶ážááŒá¯áá«áááºá á á±á¬áá·áºááŒáá·áºááŒááºážá ááŸááºáááºážáá±áá¬á áá°ááá¯ááºááá¯ááºá ááºážáááºááŒááºáž ááá¯á·ááá¯áẠá¡ááŒá¬ážáá¯á¶á·ááŒááºáá»ááºáá»ááºáááºáá»á¬ážááŸáá áºááá·áºá á¡áá¯á¶ážááŒá¯áá°á¡á¬ážáá¯á¶ážááᯠááá¯ááºááŒááºáá® ááŒáá·áºáá»áááŸá¯ááᯠá ááºážáááºáááºá
Kubernetes ááŒáá·áºáá»ááºááŸá¯ (á¡ááŸáá·áºá¡ááŒá±á¬ááºáž á¡ááºááááº)
Kubernetes Deployment á¡ááœáẠáá°áááºážáá»á°áá¬ááŸá¬ áá¯á¶áá»á¬ážá áá¬ážááŸááºážá¡áá áºááŒáá·áº á¡áá»áá¯á·áá±á¬ pods á¡áá±á¡ááœááºááᯠá áááºááá·áºáá±áá¬ááœáẠááŸááá·áº-á¡ááºááááºááŒá áºáááºá áááºážááá¯á·ááᯠááŒá¿áá¬áááŸááá² áááºáá®ážáá¬ážáá«áá áá¯á¶áá»á¬ážá áá¬ážááŸááºážá¡áá±á¬ááºážáá«ááŸááá±á¬ á¡áá»áááºá¡áááºáá»á¬ážááᯠáááºá á²ááŒá®áž áá±á«á·ááºá¡áá áºáá»á¬ážááᯠá¡ááŒáá¯ááºáááºáá®ážáááºááŒá áºáááºá
GitOps
áá»áœááºá¯ááºááá¯á·ááẠá€á¥ááá¬ááœáẠGitOps ááá¯á¡áá¯á¶ážááŒá¯áá±á¬ááŒá±á¬áá·áºá
- Git ááᯠá¡ááŸááºááá¬ážá á¡áááºážá¡ááŒá áºáá áºáá¯á¡ááŒá Ạá¡áá¯á¶ážááŒá¯áááºá
- áááºáá±á¬ááºááŒááºážááŸáá·áº á¡áá¯á¶ážáá»ááŒááºážá¡ááœáẠGit Operations ááᯠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááẠ(git tag/merge ááŸááœá²á á¡ááŒá¬ážáááºááá·áº command ááŸáááá¯á¡ááºáá«)
ááá°áá¬
á¡áá±á·á¡áá»áá·áºáá±á¬ááºážáá áºáá¯áá°ááŒáá«á áá¯á· - á¡ááá®áá±ážááŸááºážáá¯ááºá¡ááœáẠááá¯ááŸá±á¬ááºáá¯á¶áá áºáá¯ááŸáá·áº á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶á¡ááœáẠáá áºáá¯ááŸááááºá
áá»áŸá±á¬ááºááœáŸá¬ááá¯ááŸá±á¬ááºááŸá¯
áááºážááẠ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 ááœáẠaccess á¡ááœáẠconfig áá«ááŸááááºá 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 áá¯ááŸáá·áº app-canary 0 ááŒáá·áº ááŒáá·áºáá»ááºáá¬ážáááºá áá»áœááºá¯ááºááá¯á·ááŸáááá·áº áááºáá±á¬ááºááŒáá·áºááŸá¯ááá¯ááºááá·áº LoadBalancer áá
áºáá¯áááºáž ááŸááá«áááºá curl
ááŒááºá IP ááŸáááá·áº
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
áá»áœááºá¯ááºááá¯á·áá ááºážáááºáá»áŸá±á¬ááºááœáŸá¬ááẠâv1â áá¬ááŒááºáá¬áááºááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºááá«áááºá
Canary ááŒáá·áºáá»ááºááŸá¯ááᯠáá¯ááºáá±á¬ááºááŒááºážá
á¡ááá·áº 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 ááŸá¡ááŸááºááá¬ážááá áºáá¯áááºážáá±á¬á¡áááºážá¡ááŒá áºá¡ááŒá ẠGit ááŸáá°áá±á¬ááºáááº) ááẠáá¬ážááŸááºážáá áºáá¯á á®á¡ááœááºáá áºáá¯á á®á¡ááœáẠáááºááŒáœáá±á¬áá¯á¶á á¶áá°áá»á¬ážááŒáá·áº ááŒáá·áºáá»ááºááŸá¯ááŸá áºáá¯ááŸááá±ááŒááºážááŒá áºáááºá
áá¯á¶ážá áœá²áá°áá»á¬ážá ~10% ááẠáá¬ážááŸááºážá¡áá áºááŸáá·áº áááºážááŸá®ážáá¬ááŒá®áž áááºážááᯠááááºááœááºáá² á ááºážáááºáááºá ááá¯á¡áá»áááºááẠááŸááºáááºážáá»á¬ážááœáẠá¡ááŸá¬ážá¡ááœááºážáá»á¬ážááᯠá á áºáá±ážáááºááŸáá·áº ááŒá¿áá¬áá»á¬ážááᯠááŸá¬ááœá±ááẠáá±áá¬ááᯠá á±á¬áá·áºááŒáá·áºáááá·áºá¡áá»áááºááŒá áºáááºá
á¡ááá·áº 2- á¡áá¯á¶ážááŒá¯áá°á¡á¬ážáá¯á¶ážá¡ááœáẠáá¬ážááŸááºážá¡áá áºááᯠááŒáá·áºáá»ááá«á
á¡á¬ážáá¯á¶ážá¡áááºááŒá±ááœá¬ážááŒá®ááŒá
áºááŒá±á¬ááºáž áá¯á¶ážááŒááºáá²á·ááŒá®áž ááá¯á¡áá« áá¯á¶ážá
áœá²áá°á¡á¬ážáá¯á¶ážá¡ááœáẠáá¬ážááŸááºážá¡áá
áºááᯠááŒáá·áºáá»á®ááẠááá¯á¡ááºáá«áááºá áá«ááá¯áá¯ááºááá¯á· ááá¯ážááŸááºážá
áœá¬ á¡ááºááááºáá¯ááºáá«á deploy.yaml
áá¯á¶ááá¬ážááŸááºážá¡áá
áºááᯠááá·áºááœááºážááŒááºážááŸáá·áº áá¯á¶á
á¶áá°á¡áá±á¡ááœáẠ10. In ááŸáá·áºáá®áá»áŸáááºá deploy-canary.yaml
áá¯á¶áá°á¡áá±á¡ááœááºááᯠ0 ááá¯á·ááŒááºáááºááŸááºáá¬ážáááºá ááŒáá·áºáá»ááºááŒá®ážáá±á¬ááºá ááááºááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá
áºáááá·áºáááº-
áááºááá»áŒážááŒá¯áá»
áá»áœááºá¯ááºá¡ááœááºá á€áááºážáááºážááŒáá·áº ááŒáá·áºáá»ááºááŸá¯ááᯠááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááŒááºážááẠk8s ááᯠá¡áá¯á¶ážááŒá¯á áááºáá²á·ááá¯á· á¡ááœááºááá° configure áá¯ááºááá¯ááºááŒá±á¬ááºáž áá¬ážáááºá á±áááºá Kubernetes ááẠááá·áºá¡á¬áž API áá áºáá¯ááŸáá áºááá·áº á¡áá¬á¡á¬ážáá¯á¶ážááᯠá¡ááºááááºáá¯ááºááœáá·áºáá±ážáá±á¬ááŒá±á¬áá·áºá á€á¡ááá·áºáá»á¬ážááᯠscript áá»á¬ážááŸáá áºááá·áº á¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááá¯ááºáááºá
áá±á¬ááºáááºáá¯ááºáá±á¬ááºáááá·áºá¡áá¬ááŸá¬ áá¬ážááŸááºážá¡áá áºááá¯áᬠáááºáá±á¬ááºá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº á ááºážáááºáá°áááºáá±á«ááºá¡ááŸáẠ(LoadBalancer ááá¯á·ááá¯áẠIngress ááŸáááá·áº) ááŒá áºáááºá áááºážááᯠmanual browsing á¡ááœááºáá¯á¶ážááá¯ááºáááºá
áá±á¬ááºáá±á¬ááºážáá«ážáá»á¬ážááœáẠáá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºáá²á·ááá·áºá¡áá¬á¡áá»á¬ážá á¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá·áº á¡ááŒá¬ážá¡ááá¯á¡áá»á±á¬ááºááŒá±ááŸááºážáááºážáá»á¬ážááᯠá á áºáá±ážáá«áááºá
áá»áœááºá¯ááºááá¯á·áááá±á¬á·ááºááŸá á¡ááŒá¬ážáá±á¬ááºážáá«ážáá»á¬ážááá¯áááºáž áááºáá«-
ááœáá·áºááŒá¯áá»ááºáááŸááá² ClickHouse á០ClickHouse ááá¯á· ááŒá±á¬ááºážááœáŸá±á·ááŒááºážááẠáááºááá·áºá¡áá¬áá®ááá¯á· áŠážáááºááœá¬ážááááºážá Nginx á¡ááœáẠááŒá±á¬ááºážáá²áá±áá±á¬ áá±á¬áºáá»á°ážáá»á¬ážááᯠáááºáá±á¬ááºááŒááºážá nxs-build-tools ááᯠá¡ááºááááºáá¯ááºáá« - deb ááŸáá·áº rpm áááºáá±á·áá»áºáá»á¬áž áááºáá±á¬ááºááŒááºážá¡ááœáẠáááºáá±á¬áẠHashicorp áá±á¬ááºá á áºáááºá Kubernetes ááœáá·áºááŒá¯áá»ááºá¡á¬áž áááá«ááºáž Csync2 utility ááá¯á¡áá¯á¶ážááŒá¯áá±á¬á¡áá«áá»áœááºá¯ááºááá¯á·ááŒá¯á¶ááœá±á·áááá·áºá¡áᬠRedmine á¡ááœáẠTelegram bot á áááºááá¯ááºááá¯ááºáá±á¬ á¡ááŒá¬ážáá°áá»á¬ážá¡ááœááºáá« ááááᯠááá¯ážááŸááºážá¡á±á¬áẠáááºááá¯áá¯ááºááá²á
source: www.habr.com