ื ืฉืชืืฉ ื-Gitlab CI ืื-GitOps ืืื ื ืืื ืืืืฉื ืืืืฉืชืืฉ ืืคืจืืกื ืฉื Canary ื-Kubernetes
ืืืืจืื ืืกืืจื ืื:
- (ืืืืืจ ืืื)
ืคืจืืกื ืงื ืจืืช ืืืืฆืขืืช ArgoCI - ืคืจืืกื ืงื ืจืืช ืืืืฆืขืืช Istio
- ืคืจืืกื ืงื ืจืืช ืืืืฆืขืืช Jenkins-X Istio Flagger
ืื ื ื ืืฆืข ืืช ืืคืจืืกื ืืงื ืจืืช ืืืืคื ืืื ื ืืืืฆืขืืช GitOps ืื ืืฆืืจ/ืฉื ื ืืช ืืืฉืืืื ืืจืืฉืืื ืฉื Kubernetes. ืืืืจ ืื ืืืืขื ืืขืืงืจ ืืืงืืื ืขื ืืืคื ืคืขืืืช ืืคืจืืกื ื-Kubernetes Canary, ืฉืื ืืฉื ื ืฉืืืืช ืืขืืืืช ืืืชืจ ืืืืืืืฆืื, ืืืชื ื ืฉืงืื ืืืืืจืื ืืืืื.
ืคืจืืกื ืงื ืจืืช
ืขื ืืืกืืจืืืื ืืงื ืจืืช, ืขืืืื ืื ืืืืืื ืชืืืื ืจืง ืขื ืชืช-ืงืืืฆื ืฉื ืืฉืชืืฉืื. ืืืืฆืขืืช ื ืืืืจ, ื ืชืื ื ืืืื, ืืืืงืืช ืืื ืืืช ืื ืขืจืืฆื ืืฉืื ืืืจืื, ืืืืืืจื ื ืืืงืช ืืคื ื ืฉืืื ืืฉืืืจืจืช ืืื ืืืฉืชืืฉืื.
ืคืจืืกืช Kubernetes (ืขืืืื ืืชืืืื)
ืืกืืจืืืืืช ืืจืืจืช ืืืืื ืฉื Kubernetes Deployment ืืื ืขืืืื ืืชืืืื, ืฉืื ืืืฉืงืื ืืกืคืจ ืืกืืื ืฉื ืคืืืื ืขื ืืจืกืืืช ืืืฉืืช ืฉื ืืชืืื ืืช. ืื ืื ื ืืฆืจื ืืื ืืขืืืช, ืคืืืื ืขื ืืจืกืืืช ืืฉื ืืช ืฉื ืชืืื ืืช ื ืกืชืืืื, ืืชืจืืืืื ืืืฉืื ื ืืฆืจืื ืืืงืืื.
GitOps
ืื ื ืืฉืชืืฉืื ื-GitOps ืืืืืื ืื ืืืืืื ืฉืื ื:
- ืฉืืืืฉ ื-Git ืืืงืืจ ืืืื ืฉื ืืืช
- ืื ื ืืฉืชืืฉืื ื-Git Operations ืืื ืืื ืืคืจืืกื (ืืื ืฆืืจื ืืคืงืืืืช ืืืื ืชื/ืืืืื git)
ืืืืื
ืืื ื ืืงื ืชืจืืื ืืื - ืฉืืืื ืื ื ืืืืจ ืืื ืขืืืจ ืงืื ืืืฉืืืื ืืืื ืขืืืจ ืชืฉืชืืช.
ืืืืจ ืืืฉืืืื
ืืื API ืคืฉืื ืืืื ืฉื Python+Flask ืฉืืืืืจ ืชืืืื ืืชืืจ 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-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)
ืชืฉืชืืช ืืื
ืืืืืจ ืืชืฉืชืืืช ืืฉ ืื ื ืฉืืจืืช:
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".
ืืืฆืืข ืคืจืืกื ืงื ืจืืช
ืฉืื 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 as a Single Source Of Truth) ืืื ื ืืืืืช ืฉื ืฉืชื ืคืจืืกืืช ืขื ืืขืชืงืื ืคืขืืืื, ืืืช ืืื ืืจืกื.
~10% ืืืืฉืชืืฉืื ืืืืจืื ืืจืกื ืืืฉื ืืืืืงืื ืืืชื ืืื ืืืื ื. ืขืืฉืื ืื ืืืื ืืืืืง ืื ืืฉ ืฉืืืืืช ืืืืื ืื ืืื ืชืื ื ืื ืืืืจ ืืื ืืืฆืื ืืขืืืช.
ืฉืื 2: ืฉืืจืจ ืืช ืืืจืกื ืืืืฉื ืืื ืืืฉืชืืฉืื
ืืืืื ื ืฉืืื ืืกืืจ ืืขืืฉืื ืื ืื ื ืฆืจืืืื ืืืคืืฅ ืืช ืืืจืกื ืืืืฉื ืืื ืืืฉืชืืฉืื. ืืฉื ืื ืื ื ืคืฉืื ืืขืืื ืื deploy.yaml
ืืชืงื ืช ืืจืกื ืืืฉื ืฉื ืืชืืื ื ืืืกืคืจ ืืขืชืงืื ืฉืืื ื-10. ื deploy-canary.yaml
ืืืืจื ื ืืช ืืกืคืจ ืืืขืชืงืื ืืืืจื ื-0. ืืืืจ ืืคืจืืกื, ืืชืืฆืื ืชืืื ืืืืงืื:
ืืกืชืืืืช
ืขืืืจื, ืืคืขืืช ืืคืจืืกื ืืื ืืช ืืืจื ืื ืขืืืจืช ืืืืื ืืืืื ืงืืืช ื ืืชื ืืืืืืจ ืืืชื ืืืืฆืขืืช k8s. ืืืืืื ืฉ-Kubernetes ืืืคืฉืจืช ืื ืืขืืื ืืื ืืืืฆืขืืช API, ื ืืชื ืืืคืื ืืช ืืฉืืืื ืืืื ืืืืืืืืืื ืืืืฆืขืืช ืกืงืจืืคืืื.
ืืืจ ื ืืกืฃ ืฉืฆืจืื ืืืืฉื ืืื ื ืงืืืช ืื ืืกื ืืืืืง (LoadBalancer ืื ืืจื Ingress) ืฉืืจืื ื ืืชื ืืืฉืช ืจืง ืืืจืกื ืืืืฉื. ื ืืชื ืืืฉืชืืฉ ืื ืืืืืฉื ืืื ืืช.
ืืืืืจืื ืขืชืืืืื, ื ืืืืง ืคืชืจืื ืืช ืืืืืืืืื ืืืจืื ืฉืืืืฉืืื ืืช ืจืื ืื ืฉืขืฉืื ื.
ืงืจื ืื ืืืืจืื ืืืจืื ืืืืื ืฉืื ื:
ืืื ืืืืืื ืืืืืจื ื-ClickHouse ืืื ืืจืฉืื ื-ClickHouse ืขื ืืจืฉืื? ืื ืืืช ืืืืืืื ืืื ืืืื ืขืืืจ Nginx ืขืืืื nxs-build-tools - ืขืืืจ ืืื ืืืช ืืืืืืช deb ื-rpm ืืืืจืืช ืขื ืืจืฉืืช Kubernetes ืฉื Hashicorp Consult ืื ืืืื ื ืฆืจืืืื ืืืชืืืื ืืขืช ืืฉืืืืฉ ืืืื ืืฉืืจืืช Csync2 ืืื ืืืืจื ืขืืืจ Redmine. ืืื ืืคืฉื ืืช ืืืืื ืืขืฆืื ืืืืืจืื
ืืงืืจ: www.habr.com