ααΎαααΉαααααΎα§ααααααααααΆααΆαααΆαααααααΆα Argo Rollouts ααΎα k8s αα·α GitlabCI ααΎααααΈααααΎαααΆαααΆαααΆαααααααΆα Canary αα Kubernetes
α’ααααααα αααα»ααααααΈαααα
ααΆαααΆαααααααΆα Canary αα αααα»α Kubernetes # 1: Gitlab CI - (α’αααααβααα)
- ααΆαααΆαααααααΆα Canary αααααααΎ Istio
- ααΆαααΆαααααααΆα Canary αααααααΎ Jenkins-X Istio Flagger
ααΆαααΆαααααααΆα Canary
ααΎααααααΉαααΆα’αααα’αΆα
ααΆαα ααααααΆα Argo
Argo Rollouts ααΊααΆα§ααααααααααΆααΆαααΆαααααααΆαααΎα Kubernetes α ααΆααααα CRD (αα·αααααααααΆαααααΆαααααα½α) αααααΆαα Kubernetes α α’ααα»αα
ααααααΆ ααΎαα’αΆα
ααααΎα’αααααΆαααααΈα Rollout
ααααααααααααααΆαααΆαααααααΆααααααααααα αα·α Canary ααΆαα½αααΉααααααΎαααααΆαααααααα
ααΆααααααααααααααα
α§ααααααααααΆ Argo Rollouts ααααΎαααααααΆαααααΆαααααα½α
Rollout,
α’αα»ααααΆαα±ααααΆααα»αααααΆαααααααΆαααααααΆαααααααααΌα ααΆαααααααααα αα·α Canary αααααΆαα Kubernetes α ααααΆαRollout
ααααααα»αααΆαααααΌαDeployment
ααΆαααααΆαα½ααα»αααααΆαααααααΆαααααααΆαααααααααα»αααααα
ααααΆαDeployments
ααΆααα»αααααΆαααααααΈααααααΆααααΆαααααααΆααRollingUpdate
ΠΈRecreate
. αααααΈααΆαα»αααααΆαααααααΆαααααααΆααααααααααααααααααΆααααααΈααΆαα αααΎαααααα αααααΆααααΆαααΆαααααααΆααα ααΆαααααΆαααΈααααααα»ααααααααααΆααα αα»αααααΆαααααααααααααααΌαααΆαααααΎααααΆαα ααΌα ααΆαααααα-αααα α¬ Canary ααααα·αααΆααα αααα»αα§ααααααααααΆααΆαααΆααα±ααααααΎααααΆααα ααΎααααΈααααΎαα»αααααΆαααααααΆααααααα αααα»α Kubernetes α’αααααααΎααααΆααααααΌααααααααααααΈαααΈααΎααΆαααΆααα±ααααααΎααααΆαααααααα½αααα α§ααααααααααΆ Argo Rollouts ααΆααααααΆααα»αααααΆαααααααΆαααααααΆαααΆαααΆααααααααΆαααα αααααΆα αα·αααααααα ααΆααααααααααΆαα
https://argoproj.github.io/argo-rollouts
ααΆααααΆα Argo CI ααααααααααΌαα ααα»α αααααΆαααααααΆαααΆααααα½ααααααΆααααααΎααΆαα½α Rollouts ααΎαααΉααα·αα·αααααΎαααΆαα αααα»αα’ααααααααααΆααα
ααΆαααα‘αΎα Argo Rollouts
αααααααΆααααΆαααΈααα
kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
αα αααα»α turnip α αααααΆαα ααΆααααααααααααααΎα (ααΌαααΎαααΆαααααα) ααΎαααΆααααααα install.yaml ααΆ i/k8s/argo-rollouts/install.yaml αα½α α αΎαα αα·ααΈααα GitlabCI ααΉαααα‘αΎαααΆαα αααα»αα αααααα
αααααα’αα·αα·αα (αααααα·ααΈαααα½α kubectl)
αααααα·ααΈα§ααΆα ααα
ααΆααΆααΆαα’αα»ααααααα’αααα»αααΆαααΆαααααΆααααΆα ααααα‘αααααααΆααααΌααααααα·ααΈ αα·αα αααααΆαα ααΆααααααααα
ααααΆαααααααΆαααααααα·ααΈ
Kim Wuestkamp/k8s-deployment-example-app
αααααΊααΆ Python+Flask API ααααΆαααααααα»αααααααα‘ααααΆαααααΎαααααΆ JSON α ααΎαααΉααααααΎααααα αααααααααΎ GitlabCI α αΎααα»ααααααααα Gitlab Registry α αα αααα»ααααααΈααααα ααΎαααΆαααααα ααααααΆαααΈααααααααααΆα
- wuestkamp/k8s-deployment-example-app: v1
- wuestkamp/k8s-deployment-example-app: v2
ααΆααα»αααααΆαααα½αααααααΆααα½αααΆααΊα―αααΆα JSON αααα‘αααααα·αα ααΎαααααΎαααααα·ααΈαααααΎααααΈααΎαααΎααααΆαααΆααααα½αααΆααααα’αΆα ααααΎαα ααΆαααΆααΎααααααΆαα½ααααααΎααααα»αααΆααααααΆαα½αα
ααααΆααα αααααΆαα ααΆαααααααα
αα αααα»αααααΆααααα ααΎαααΉαααααΎ GitlabCI αααααΆααααΆαααΆααα±ααααααΎααααΆαααα ααΆαα Kubernetes, .gitlab-ci.yml ααΎααα ααΌα αααα
image: traherom/kustomize-dockerbefore_script:
- printenv
- kubectl versionstages:
- deploydeploy test:
stage: deploy
before_script:
- echo $KUBECONFIG
script:
- kubectl get all
- kubectl apply -f i/k8s only:
- master
ααΎααααΈααααΎαααΆαααΆααααααα½αα―α α’αααααΉαααααΌαααΆα cluster α’αααα’αΆα ααααΎ 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 αααααΉαααΆα config αααααΆααα
αΌαααααΎ kubectl
αα
αααα»αααααα’αααα
α αααααΆαα ααΆαααααααα Yaml
αα ααΆααααα»αααααΆααα αααααΆαα ααΆααααααααααΎαααΆαααααΆααααα
apiVersion: v1
kind: Service
metadata:
labels:
id: rollout-canary
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancer
αα·α rollout.yamlα
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-canary
spec:
replicas: 10
revisionHistoryLimit: 2
selector:
matchLabels:
id: rollout-canary
template:
metadata:
labels:
id: rollout-canary
spec:
containers:
- name: rollouts-demo
image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
imagePullPolicy: Always
strategy:
canary:
steps:
- setWeight: 10
# Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
- pause: {}
- setWeight: 50
- pause: { duration: 120 } # two minutes
Rollout
ααααΎαααΆαααΌα
ααααΆααΉαααΆαααΆαααααααΆαα ααααα·αααΎααΎααα·αααααααα»αααααΆαααααα’αΆααααααα (ααΌα
ααΆ Canary αα
ααΈααα) ααΆααΉαααΆαααααααααΌα
ααΆ default rolling-update Deploymentα
ααΎααααααααΈαααα αΆααα αααα»α yaml αααααΆααααΆαααΆαααααααΆα Canary:
- 10% ααα ααΆα ααααα ααΆαα Canary (αααα αΆαααααα OK)
- 50% α ααΆα ααα ααΆαα Canary (αααα αΆα 2 ααΆααΈαααααΆαααααααααα 100%)
α’αα»ααααααΆαααΆαααααααΆαααααΌα
αααααΆααααΈααΆαααΆααα±ααααααΎααααΆααααααΌα ααααΆαααααααΎαααΉαααΎααα ααΌα αααα
α αΎαααΎαααα½αααΆαααΆαααααΎαααααααΈααααααααΌααααααααα·ααΈααα»αααααα
ααΆαα’αα»ααααααΆαααΆαααααααΆα Canary
ααα αΆαααΈ 1: α ααΆα ααα 10%
ααΎααααΈα αΆααααααΎαααΆαααΆαααααααΆα Canary ααΎαααααΆααααααααΌαααααΆααααααΌαααααααΌαααΆαααΌα αααααΎαααααΎααΆααααααΆααΆαα½αααΆαααΆαααααααΆαα
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-canary
spec:
...
template:
metadata:
labels:
id: rollout-canary
spec:
containers:
- name: rollouts-demo
image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...
α αΎαααΎααααα»αααΆαααααΆααααααΌα ααΌα αααα Gitlab CI ααΆαααααααΆα α αΎαααΎαααΎαααΆαααααΆααααααΌαα
α₯α‘αΌααααααααα·αααΎααΎαα αΌαααααΎααααΆααααα
α’ααα αΆααα! ααΎααααα·ααα α ααααααΆαααααΆαααΆαααααααΆα Canary ααααααΎαα ααΎαα’αΆα ααΎαααΎααααααααΆααααααΆαααααΎαααΆαα
kubectl argo rollouts get rollout rollout-canary
ααα αΆαααΈ 2: α ααΆα ααα 50%α
α₯α‘αΌααααααΌααααααα ααα αΆααααααΆααα αααααΌααααα 50% ααα ααΆα αααα ααΎαααααααα ααΆααααααααααα αΆααααα±ααααααΎαααΆααααααα
kubectl argo rollouts promote rollout-canary # continue to step 2
α αΎααααααα·ααΈααααααΎαααΆααααα‘αααααα·α 50% ααααΆαααααΎαααααΈααααααααΈα
αα·αααΆααα·αα·αααα‘αΎααα·αααααΆαα ααααααΆα:
α’ααα αΆαααα
ααα αΆαααΈ 3: α ααΆα ααα 100%α
ααΎαααΆαααααααα ααΆααααααααααΆ ααΌα αααααααααΆααααΈ 2 ααΆααΈααα αΆα 50% ααΉααααα αααααααααααααααααα· α αΎαααα αΆα 100% ααΉαα αΆααααααΎαα
αα·ααααααααααααα·ααΈα
αα·αααΆααα·αα·αααα‘αΎααα·αααααΆαα ααααααΆα:
ααΆαααΆαααααααΆα Canary ααααΌαααΆααααα ααα
α§ααΆα ααααααααααααααΆαα½α Argo Rollouts
ααΆαα§ααΆα αααααΆα αααΎαααααα ααΈααα ααΌα ααΆαααααααα αααΆαααΎαααα·ααααΆαααΆαα»α αα·αααΆααααααααααααααα’ααααΎ Canaryα
ααΈααα’αΌα’αααΈ Argo Rollouts αα·α Argo CI
αααα»ααα·αααΆααααΆαααΈααα’αΌααα ααΆαααα αΆαααΈααααααα Argo Rollouts αα·α Argo CI ααααΎααΆαααΆαα½αααααΆα
αααααα
αααα»ααα·αααΆα αΌαα α·ααααααα·αααααΆαααααΎααααΆαα CRDs ααααααααααααααΆααααααΎαααααααααααααααααΆαααΆαααααααΆα α¬α§αααααα αααα ααααΌααα·αα ααΆα αααα ααΆαααααΎααΆαααΆαα½ααα½αααααααΎαααΆααααΆααααΌαα αααααΆαααααα»αα ααααΆαααααααΆααα½ααααα αΌαααΆαα½α Argo CI α
ααααααΆαααΆααααα ααΆα αΆααααΌα
ααΆααΆαααΆααα½ααααα
αΌαααααΆαααααα Argo CI αα·α Flux CI ααααα ααΌα
αααααααα»ααααα ααααΆαααα
αΆααα αΌααααααΆαα
ααααααΆαααααΈα
ααααα
ααΎα’αααααααΆααααΆααααα·αααααααΆαα½α Argo Rollouts α¬ Argo CI αα?
ααΌαα’αΆαα’ααααααααααααααα ααΎαααααααααααΎααααααα
ααΆαααΆαααααααΆααααααααααααααααααα·ααΈαα·ααΆααααΌαααΆαα½ααααΆαααΈααααααααΆα Nginx Kubernetesα α ααα»α’αααΈααΆαααΆααΆααΆαααΆααααααΆααααααΆααααΆαααααα»αααΆαααααααα ααΆααααααααααΆααααααααααααααΆααααααααα? ααΆαααααΆαα’αααΈααΆαα’αα»ααααΆα Kubernetes αααααα»αααα»α Hashicorp ααααα Tekton - ααααααααα αΌααααααααΎα Kubernetes ααΆααααΆααααΌαα»αααΆααααααααααΆαα Nginx Telegram bot αααααΆαα Redmine α αα·ααΈααααΎα±ααααΈαα·αααΆαααααααααΆαααααα½αα’ααα αα·αα’αααααα
ααααα: www.habr.com