ααΎαααΉαααααΎ Gitlab CI αα·α GitOps ααααα ααΎααααΈα’αα»αααα αα·αααααΎααααΆααααΆαααΆαααααααΆα Canary αα αααα»α Kubernetes
α’αααααααΈαααααΈαααα
- (α’αααααβααα)
ααΆαααΆαααααααΆα Canary αααααααΎ ArgoCI - ααΆαααΆαααααααΆα Canary αααααααΎ Istio
- ααΆαααΆαααααααΆα Canary αααααααΎ Jenkins-X Istio Flagger
ααΎαααΉαα’αα»ααααααΆαααΆαααααααΆα Canary αααααααΆαααα GitOps αα·ααααααΎα/ααααααααααΆα Kubernetes ααααΆαααα α’ααααααααααααΌαααΆαααααα»ααα»αααΆα αααααααααΆααααΆαααααΆα ααΆαα½αααΉααααααααααΆαααΆαααααααΆαααααΎαααΆααα αααα»α Kubernetes Canary α αΆααααΆααααΈααΆααα·ααΈααΆαααααααααααααααααα·αααααααααΆαααααα·αααααΆαααΆααα»α αααααΎαααΉααα·α αΆαααΆαα αααα»αα’αααααααΆααααααα
ααΆαααΆαααααααΆα Canary
ααΆαα½αααΉααα»αααααΆααααα Canary ααΆαααααΎαα αα α»ααααααααΆαααααΌαααΆαα’αα»ααααααααΌαα ααααααα’αααααααΎααααΆαααα½αα ααα½αααα»αααααα ααΆααααααΆααααα½ααα·αα·ααα αα·αααααααααααα ααα» ααΆαααααΎαααααααααα α¬αααααΆαααα·αααααα’αααααααα ααΆαα ααααααΆαααααΌαααΆαααΆααααα αα»ααααααΆααααΌαααΆαα ααααααΆααα ααΆααα’αααααααΎααααΆααααΆααα’ααα
ααΆαααΆααα±ααααααΎααααΆαα Kubernetes (ααΆαααααΎαα αα α»ααααααααΆααααα·α)
αα»αααααΆαααααααααΆαααΎααααααΆααααΆαααΆααα±ααααααΎααααΆαα Kubernetes ααΊααΆαα’αΆααααααααα·α αααα ααα½αααααααα½αα ααα½αααααΌαααΆαα αΆααααααΎαααΆαα½αααΉαααααααααΈααααΌαααΆαα ααααα·αααΎαα½αααΆααααΌαααΆααααααΎααααααααΆααααα αΆααα αααααααΆαααΌαααΆαααααΆααα αΆααααααΌαααΆααααα αα α αΎαααααααΈααααΌαααΆααααααΎαααααααααΆα
α αααΈααΌα
ααΎαααααΎ GitOps αααα»αα§ααΆα αααααα αααααΆαααΎαα
- ααΆαααααΎααααΆαα Git ααΆααααααααα½αααααΆααα·α
- ααΎαααααΎ Git Operations αααααΆαααααααΎα αα·αααΆαααααααΆα (αα·αα αΆαααΆα αααΆαααΆααααααααΆαααα ααΈ git tag/merge)
α§ααΆα ααα:
α αΌαααΎαα’αα»ααααααΆαα’αα»ααααααααα’αα½α - ααΎααααΈααΆαααααΆαααα½ααααααΆααααΌααααααα·ααΈ αα·ααα½αααααααααΆααα αααααΆαα ααΆααααααααα
ααααΆαααααααα·ααΈ
αααααΊααΆ Python+Flask API ααααΆαααααααα»αααααααα‘ααααΆαααααΎαααααΆ JSON α ααΎαααΉααααααΎααααα ααααΆαααα 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
ααΎααααΈααααΎαααΆαααΆααααααα½αα―α α’αααααΉαααααΌαααΆα 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
αα
αααα»αααααα’αααα
α’αααα’αΆα
α’αΆαα’αααΈααααααα½αααΆαααααααΆααααααΆαααααααΆααα
ααααα (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 replicas αα·α app-canary ααΆαα½α 0. ααΆααααΆα LoadBalancer αααααΎαα’αΆα
α
αΌαααααΎααΆαααΆαααα curl
ααΆαααα IP ααΆααααα
α
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
ααΎαααΎαααΆαααααα·ααΈααΆαααααααααααΎααααα‘αααααα·ααα βv1β ααα»αααααα
ααΆαα’αα»ααααααΆαααΆαααααααΆα Canary
ααα αΆαααΈ 1: α ααααααααααΈαααααΆααα’αααααααΎααααΆαααα½αα ααα½α
ααΎααααααα ααα½αα αααααα 1 αα αααα»αα―αααΆα deploy-canary.yaml αα·αααΌαααΆαααααααααΈα
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 ααΆαααααΆαα’αααΈααΆαα’αα»ααααΆα Kubernetes αααααα»αααα»α Hashicorp α’αααΈαααααΎαααααΌαααααααα αααααααΎα§αααααααααΎααααΆαα Csync2 Telegram bot αααααΆαα Redmine α αα·ααΈααααΎα±ααααΈαα·αααΆαααααααααΆαααααα½αα’ααα αα·αα’αααααα
ααααα: www.habr.com