ืืืจ ืืืขืื ื ืืฆื ืื ืง8ืก-ืืขืืืืจื Argo Rollouts ืืืคึผืืืืืึทื ื ืงืึธื ืืจืึธืืืขืจ ืืื GitlabCI ืฆื ืืืืคื ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ืฅ ืฆื Kubernetes
ืึทืจืืืงืืขื ืืื ืืขื ืกืขืจืืข
ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ืืื Kubernetes #1: Gitlab CI - (ืื ืืจืืืงื)
- ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ื ืืฆื Istio
- ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ื ืืฆื Jenkins-X Istio Flagger
ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื
ืืืจ ืืึธืคื ืืืจ ืืืืขื ืขื
ืึทืจืืึธ ืจืึธืืืึธืืฅ
Argo Rollouts ืืื ืึท ืงืืืขืจื ืขืืขืก ืืขืืืืจื ืืืคึผืืืืืึทื ื ืงืึธื ืืจืึธืืืขืจ. ืขืก ืืื ืึท CRD (Custom Resource Definition) ืคึฟืึทืจ Kubernetes. ืืึทื ืง ืฆื ืขืก, ืืืจ ืงืขื ืขื ื ืืฆื ืึท ื ืืึทืข ืขื ืืืื: Rollout
, ืืืึธืก ืืึทื ืืืืฉืื ืืืื-ืืจืื ืืื ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ืฅ ืืื ืคืึทืจืฉืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืึธืคึผืฆืืขืก.
Argo Rollouts ืงืึธื ืืจืึธืืืขืจ ืืขื ืืฆื ืืืจื ืึท ืื ืื ืืืื
Rollout,
ืึทืืึทืื ืคึฟืึทืจ ื ืึธื ืืืคึผืืืืืึทื ื ืกืืจืึทืืขืืืขืก ืึทืืึท ืืื ืืืื-ืืจืื ืืื ืงืึทื ืึทืจื ืคึฟืึทืจ Kubernetes. ืืืืRollout
ืืื ืคืึทื ืืงืฉืึทื ืึทืืืื ืขืงืืืืืืึทืืขื ืDeployment
, ืืืืื ืืื ื ืึธื ืืืคึผืืืืืึทื ื ืกืืจืึทืืขืืืขืก.
ืืืืDeployments
ืืื ืฆืืืื ืกืืจืึทืืขืืืขืก ืคึฟืึทืจ ืืืคึผืืืืืึทื ื:RollingUpdate
ะธRecreate
. ืืึธืืฉ ืื ืกืืจืึทืืขืืืขืก ืืขื ืขื ืคึผืึทืกืืง ืคึฟืึทืจ ืจืืึฟ ืงืึทืกืขืก, ืคึฟืึทืจ ืืืคึผืืืืืึทื ื ืฆื ืกืขืจืืืขืจืก ืืืืฃ ืึท ืืืืขืจ ืืจืืืก ืืืึธื, ื ืึธื ืกืืจืึทืืขืืืขืก ืืขื ืขื ืืขื ืืฆื, ืึทืืึท ืืื ืืืื-ืืจืื ืึธืืขืจ ืงืึทื ืึทืจื, ืืืึธืก ืืขื ืขื ื ืืฉื ืื ืืืฆื ืืื ืื ืืืคึผืืืืืึทื ื ืงืึธื ืืจืึธืืืขืจ. ืฆื ื ืืฆื ืื ืกืืจืึทืืขืืืขืก ืืื Kubernetes, ืืืืขืจื ืืึธืื ืฆื ืฉืจืืึทืื ืกืงืจืืคึผืก ืืืืฃ ืฉืคึผืืฅ ืคืื ืืืืขืจ ืืืคึผืืืืืึทื ืฅ. ืื Argo Rollouts ืงืึธื ืืจืึธืืืขืจ ืืงืกืคึผืึธืืืื ืื ืกืืจืึทืืขืืืขืก ืืื ืคึผืฉืื, ืืขืงืืึทืจืึทืืืืืข, ืงืึทื ืคืืืืขืจืึทืืึทื ืคึผืึทืจืึทืืขืืขืจืก.
https://argoproj.github.io/argo-rollouts
ืขืก ืืื ืืืื Argo CI ืืืึธืก ืืื ืึท ืืึทื ืืฆืขืจ-ืคืจืืึทื ืืืขื ืืืขื ืฆืืืื ื ืคึฟืึทืจ ื ืืฆื ืืื ืจืึธืืืึธืืฅ, ืืืจ ืืืขืื ื ืขืืขื ืึท ืงืืง ืืื ืืขื ืืืืึทืืขืจ ืึทืจืืืงื.
ืื ืกืืึธืืื ื Argo Rollouts
ืกืขืจืืืืจืขืจ ืืืึทื
kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
ืืื ืืื ืืืขืจ ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืืจืืงืืืข (ืืขื ืืืืืืขืจ) ืืืจ ืืึธืื ืฉืืื ืฆืืืขืืืืื install.yaml ืืื i/k8s/argo-rollouts/install.yaml. ืืขื ืืืขื GitlabCI ืืืขื ืื ืกืืึทืืืจื ืขืก ืืื ืืขื ืงื ืืื.
ืงืืืขื ื ืืืึทื (ืงืืืขืงืื ืคึผืืืืื)
ืืืึทืฉืคึผืื ืึทืคึผืคึผืืืงืึทืืืึธื
ืขืก ืืื ืืื ืคืืจ ืฆื ืืึธืื ืืึทืืื ืืขืจ ืจืืคึผืึทืืึทืืึธืจืื ืคึฟืึทืจ ืึทืคึผืืึทืงืืืฉืึทื ืงืึธื ืืื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ.
ืจืืคึผืึทืืึทืืึธืจื ืคึฟืึทืจ ืื ืึทืคึผืืึทืงืืืฉืึทื
Kim Wuestkamp/k8s-deployment-example-app
ืืึธืก ืืื ืึท ืืืืขืจ ืคึผืฉืื Python + Flask API ืืืึธืก ืงืขืจื ืึท ืขื ืืคืขืจ ืืื JSON. ืืืจ ืืืขืื ืืืืขื ืืขื ืคึผืขืงื ื ืืฆื GitlabCI ืืื ืฉืืืคึผื ืื ืจืขืืืืืึทื ืฆื ืื Gitlab ืจืขืืืกืืจื. ืืื ืื ืจืขืืืกืืจื ืืืจ ืืึธืื ืฆืืืื ืคืึทืจืฉืืืขื ืข ืืขืืืื ื ืืืขืจืกืืขืก:
- 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
ืฆื ืืืืคื ืขืก ืืื ืืืจ ืืึทืจืคึฟื ืึท ืงื ืืื, ืืืจ ืงืขื ืขื ื ืืฆื 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
ืฆื ืืืื ืงื ืืื.
ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืืื
ืื ืื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืจืืคึผืึทืืึทืืึธืจื ืืืจ ืืึธืื ืกืขืจืืืืก:
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
ืึทืจืืขื ืื ืืขืืืข ืืื ืืืคึผืืืืืึทื ื. ืืืื ืืืจ ืืึธื ื ืื ืฉืืขืื ืึท ืืขืจืืืึทื ืืืงื ืกืืจืึทืืขืืืข (ืืื ืงืึทื ืึทืจื ืืึธ), ืขืก ืืืขื ืืืื ืืืืืืืื ืืื ืื ืคืขืืืงืืึทื ืจืึธืืืื ื-ืืขืจืืืึทื ืืืงื ืืืคึผืืืืืึทื ื.
ืืืจ ืืขืคืื ืืจื ืฆืืืื ืกืืขืคึผืก ืืื ืืึทืื ืคึฟืึทืจ ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื:
- 10% ืคืื ืคืึทืจืงืขืจ ืฆื ืงืึทื ืึทืจื (ืืืึทืจืื ืคึฟืึทืจ ืืึทื ืืึทื ืืื)
- 50% ืคืึทืจืงืขืจ ืฆื ืงืึทื ืึทืจื (ืืืึทืจืื 2 ืืื ืื ืืื ืคืึธืจืืขืฆื ืฆื 100%)
ืคึผืขืจืคืึธืจืืื ื ืขืจืฉื ืืืคึผืืืืืึทื ื
ื ืึธื ืืขืจ ืขืจืฉื ืืืคึผืืืืืึทื ื, ืืื ืืืขืจ ืจืขืกืืจืกื ืืืขื ืงืืงื ืืื ืืึธืก:
ืืื ืืืจ ืืึทืงืืืขื ืึทื ืขื ืืคืขืจ ืืืืื ืคึฟืื ืืขืจ ืขืจืฉืืขืจ ืืืขืจืกืืข ืคืื โโโโืื ืึทืคึผืืึทืงืืืฉืึทื:
ืคึผืขืจืคืึธืจืืื ื ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื
ืฉืจืื 1: 10% ืคืึทืจืงืขืจ
ืฆื ืึธื ืืืืื ืึท ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื, ืืืจ ื ืึธืจ ืืึทืจืคึฟื ืฆื ืืืืฉื ืื ืืืื ืืืขืจืกืืข ืืื ืืืจ ืืืืฉืึทืืืึทืื ืืึธื ืืื ืืืคึผืืืืืึทื ืฅ:
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 ืืืคึผืืืื ืืื ืืืจ ืืขื ืื ืขื ืืขืจืื ืืขื:
ืืืฆื ืืืื ืืืจ ืึทืงืกืขืก ืื ืกืขืจืืืืก:
ืืจืืืก! ืืืจ ืืขื ืขื ืืื ืื ืืืื ืคืื ืืื ืืืขืจ ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื. ืืืจ ืงืขื ืขื ืืขื ืื ืคึผืจืึธืืจืขืก ืืืจื ืืืืคื:
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% ืฉืจืื ืกืืึทืจืฅ:
ืืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืจืขืืืืืึทื:
ืืื ืจืืืึทืืืื ื ืจืขืฆืขื ืืืข:
ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ืืื ืืึทื ืฅ.
ืืขืจ ืืืืฉืคืืื ืืื Argo Rollouts
ืขืก ืืขื ืขื ืืขืจ ืืืืฉืคืืื ืืึธ, ืึทืืึท ืืื ืืื ืฆื ืฉืืขืื ืึทืจืืืฃ ืกืืืืืืข ืคึผืจืืืืืื ืืื ืงืึทืืคึผืขืจืึทืกืึทื ื ืืืืืจื ืืืืฃ ืงืึทื ืึทืจื:
ืืืืืขื ืืืขืื Argo Rollouts ืืื Argo CI
ืืื ืืึทืงืข ืจืขืงืึธืืขื ืืืจื ืืขื ืืืืืขื, ืขืก ืืืืืื ืืื Argo Rollouts ืืื Argo CI ืึทืจืืขื ืฆืืืึทืืขื:
ืืึทื ืฅ
ืืื ืืึทืงืข ืืื ืืขืจ ืืขืืึทื ืง ืคืื ื ืืฆื CRDs ืืืึธืก ืคืืจื ืื ืฉืึทืคืื ื ืคืื ื ืึธื ืืืืคึผืก ืคืื ืืืคึผืืืืืึทื ืฅ ืึธืืขืจ ืจืขืคึผืืึทืงืึทื, ืจืืืขืจืขืงื ืคืึทืจืงืขืจ, ืขืืง. ืืจืืขืื ืืื ืืื ืืืื ืกืืืืื. ืืืืึทืืขืจ ืืื ืืืึธืื ืืื ืฆื ืคึผืจืืืืจื ืื ืื ืึทืืจืืืฉืึทื ืืื Argo CI.
ืึธืืขืจ, ืขืก ืกืืื ืฆื ืืืื ืึท ืืจืืืก ืืขืจืืืฉืขืจ ืคืื Argo CI ืืื Flux CI, ืึทืืื ืืื ืงืขื ืืืึทืจืื ืืื ืื ื ืืึทืข ืืขืืืื ื ืงืืื ืืืืก:
ืืึธืื ืืืจ ืืขืจืคืึทืจืื ื ืืื Argo Rollouts ืึธืืขืจ Argo CI?
ืืืืขื ืขื ืืืื ืื ืืขืจืข ืึทืจืืืงืืขื ืืืืฃ ืืื ืืืขืจ ืืืึธื:
ืืืื-ืืจืื ืืืคึผืืืืืึทื ื ืคืื ืกืคึผืจืื ื ืึทืคึผืืึทืงืืืฉืึทื ื ืืื Nginx ืืืขื ืกืขืจืืืขืจ Kubernetes: ืืืึธืก ืืื ืขืก ืึทืืื ืืืืืืืง ืฆื ืื ืกืืึทืืืจื ืกืืกืืขื ืจืืกืึธืจืก ืคืึทืจืืืึทืืืื ื? ืืงืืื ืฆื Hashicorp Consul's Kubernetes Authorization Tekton Pipeline - ืงืืืขืจื ืขืืขืก-ืืขืืืืจื ืคึผืืืคึผืืืื ื ืืืืขื ืืื ืึทืืืฉ ืืึทืืืฉืืื ืคึฟืึทืจ Nginx ืืขืืขืืจืึทื ืืึธื ืคึฟืึทืจ Redmine. ืืื ืฆื ืคืึทืจืคึผืึธืฉืขืืขืจื ืืขืื ืคึฟืึทืจ ืืื ืืื ืื ืืขืจืข
ืืงืืจ: www.habr.com