ืืืจ ืืืขืื ื ืืฆื Gitlab CI ืืื ืืึทื ืืึทื GitOps ืฆื ืื ืกืืจืืืขื ื ืืื ื ืืฆื ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ืืื Kubernetes
ืืจืืืงืืขื ืคืื ืืขืจ ืกืขืจืืข:
- (ืื ืืจืืืงื)
ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ื ืืฆื ArgoCI - ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ื ืืฆื Istio
- ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ื ืืฆื Jenkins-X Istio Flagger
ืืืจ ืืืขืื ืืืจืืคืืจื ืื ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื ืืึทื ืืืึทืื ืืืจื GitOps ืืื ืงืจืืืืืื ื / ืืึธืืืคืืฆืืจื ืื ืืืืคึผื Kubernetes ืจืขืกืืจืกื. ืืขืจ ืึทืจืืืงื ืืื ืืืขื ืืคึฟืจื ืคึฟืึทืจ ืืงืืื ืืื ืืื ืืืคึผืืืืืึทื ื ืึทืจืืขื ืืื Kubernetes Canary, ืืื ื ืขืก ืืขื ืขื ืืขืจ ืขืคืขืงืืืื ืืขืืืึธืืก ืคืื ืึธืืึทืืืืฉืึทื, ืืืึธืก ืืืจ ืืืขืื ืืึทืืจืึทืืื ืืื ืื ืคืืืืขื ืืข ืึทืจืืืงืืขื.
ืงืึทื ืึทืจื ืืืคึผืืืืืึทื ื
ืืื ืื ืงืึทื ืึทืจื ืกืืจืึทืืขืืืข, ืืขืจืืืึทื ืืืงืื ืืขื ืืขื ืขื ืขืจืฉืืขืจ ืืขืืืขื ืื ืฆื ืืืืื ืึท ืกืึทืืกืขื ืคืื ืืืืขืจื. ืืืจื ืืึธื ืืืึธืจืื ื, ืงืืึธืฅ ืืึทืื, ืืึทื ืืึทื ืืขืกืืื ื ืึธืืขืจ ืื ืืขืจืข ืืึทืืขืจืงืื ืืขื ืืฉืึทื ืึทืื, ืื ืืขืืืื ื ืืื ืืขืกืืขื ืืืืืขืจ ืขืก ืืื ืืืคืจืืื ืฆื ืึทืืข ืืืืขืจื.
Kubernetes ืืืคึผืืืืืึทื ื (ืจืึธืืืื ื ืืขืจืืืึทื ืืืงื)
ืื ืคืขืืืงืืึทื ืกืืจืึทืืขืืืข ืคึฟืึทืจ Kubernetes ืืืคึผืืืืืึทื ื ืืื ืจืึธืืืื ื-ืืขืจืืืึทื ืืืงื, ืืื ืึท ืืืืขืจ ื ืืืขืจ ืคืื ืคึผืึธืืก ืืขื ืขื ืืึธื ืืฉื ืืื ื ืืึทืข ืืืขืจืกืืขืก ืคืื ืื ืืืืืขืจ. ืืืื ืืื ืืขื ืขื ืืืฉืืคื ืึธื ืคืจืืืืขืืขื, ืคึผืึธืืก ืืื ืึทืื ืืืขืจืกืืขืก ืคืื ืืืืืขืจ ืืขื ืขื ืืขืจืืึทื ืืืืื, ืืื ื ืืึท ืคึผืึธืืก ืืขื ืขื ืืืฉืืคื ืืื ืคึผืึทืจืึทืืขื.
GitOps
ืืืจ ื ืืฆื GitOps ืืื ืืขื ืืืึทืฉืคึผืื ืืืืึทื ืืืจ:
- ื ืืฆื Git ืืื ืึท ืืืื ืืงืืจ ืคืื ืืืช
- ืืืจ ื ืืฆื Git Operations ืคึฟืึทืจ ืืืืขื ืืื ืืืคึผืืืืืึทื ื (ืงืืื ืงืึทืืึทื ืื ืื ืืขืจืข ืืื Git Tag / Merge ืืขื ืขื ืืืจืฃ)
ืืืึทืฉืคึผืื
ืืึธืืืจ ื ืขืืขื ืึท ืืืืข ืคืืจ - ืฆื ืืึธืื ืืืื ืจืืคึผืึทืืึทืืึธืจื ืคึฟืึทืจ ืึทืคึผืืึทืงืืืฉืึทื ืงืึธื ืืื ืืืื ืขืจ ืคึฟืึทืจ ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ.
ืึทืคึผืคึผืืืงืึทืืืึธื ืจืืคึผืึทืืึทืืึธืจื
ืืึธืก ืืื ืึท ืืืืขืจ ืคึผืฉืื 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-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
ืืึทืืขืจืงืื ื ืึทื ืึทืคึผ-ืืืคึผืืืึท ืืื ื ืืฉื ืืึธืื ืงืืื ืจืขืคึผืืึทืงืึทื ืืืคืืื ื ื ืึธื.
ืคึผืขืจืคืึธืจืืื ื ืขืจืฉื ืืืคึผืืืืืึทื ื
ืฆื ืึธื ืืืืื ืื ืขืจืฉื ืืืคึผืืืืืึทื ื, ืืืจ ืงืขื ืขื ืึธื ืืืืื ืื GitlabCI ืจืขืจื - ืืื ืืข ืืึทื ืืืึทืื ืืืืฃ ืื ืืขื ืฆืืืืึทื. ื ืื ืืขื kubectl
ืืึธื ืึทืจืืืกืคืืจื ืื ืคืืืืขื ืืข:
ืืืจ ืืขืื app
ืืืคึผืืืืืึทื ื ืืื 10 ืจืขืคึผืืึทืงืึทื ืืื ืึทืคึผ-ืงืึทื ืึทืจื ืืื 0. ืขืก ืืื ืืืื ืึท ืืึธืึทืืืึทืืึทื ืกืขืจ ืคึฟืื ืืืึธืก ืืืจ ืงืขื ืขื ืึทืงืกืขืก ืืืจื 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 ืืื ืึท ืืืื ืืงืืจ ืคืื ืืืช) ืืื ืื ืืืึทืืืึทื ืคืื ืฆืืืื ืืืคึผืืืืืึทื ืฅ ืืื ืึทืงืืืื ืจืขืคึผืืึทืงืึทื, ืืืื ืขืจ ืคึฟืึทืจ ืืขืืขืจ ืืืขืจืกืืข.
~ 10% ืคืื ืืืืขืจื ืืืขืจื ืืึทืงืึทื ื ืืื ืึท ื ืืึทืข ืืืขืจืกืืข ืืื ืึทื ืื ืืขื ืฉืึทื ืึทืื ืคึผืจืืืืจื ืขืก. ืืืฆื ืืื ืื ืฆืืื ืฆื ืงืึธื ืืจืึธืืืจื ืคึฟืึทืจ ืขืจืจืึธืจืก ืืื ืื ืืึธืืก ืืื ืืึธื ืืืึธืจืื ื ืืึทืื ืฆื ืืขืคึฟืื ืขื ืคึผืจืึธืืืขืืก.
ืฉืจืื 2: ืืขืืืื ื ืื ื ืืึทืข ืืืขืจืกืืข ืฆื ืึทืืข ืืืืขืจื
ืืืจ ืืึทืฉืืึธืกื ืึทื ืึทืืฅ ืืื ืืขืืืขื ืืื ืืื ืืืฆื ืืืจ ืืึทืจืคึฟื ืฆื ืจืึธืืื ืื ื ืืึทืข ืืืขืจืกืืข ืฆื ืึทืืข ืืืืขืจื. ืฆื ืืึธื ืืึธืก, ืืืจ ื ืึธืจ ืืขืจืืืึทื ืืืงื deploy.yaml
ืื ืกืืึธืืื ื ืึท ื ืืึท ืืืขืจืกืืข ืคืื โโืื ืืืื ืืื ืื ื ืืืขืจ ืคืื ืจืขืคึผืืึทืงืึทื ืืืืึทื ืฆื 10. ืืื deploy-canary.yaml
ืืืจ ืฉืืขืื ืื ื ืืืขืจ ืคืื ืจืขืคึผืืึทืงืึทื ืฆืืจืืง ืฆื 0. ื ืึธื ืืืคึผืืืืืึทื ื, ืืขืจ ืจืขืืืืืึทื ืืืขื ืืืื ืืื ืืืื:
ืกืืืืื ื ืึทืจืืืฃ
ืคึฟืึทืจ ืืืจ, ืคืืืกื ืืืง ืื ืืืคึผืืืืืึทื ื ืืึทื ืืืึทืื ืืขื ืืืขื ืืขืืคึผืก ืฆื ืคึฟืึทืจืฉืืืื ืืื ืืืืื ืขืก ืงืขื ืขื ืืืื ืงืึทื ืคืืืืขืจื ืืื ืง8ืก. ืืื ื Kubernetes ืึทืืึทืื ืืืจ ืฆื ืืขืจืืืึทื ืืืงื ืึทืืฅ ืืืจื ืึทื ืึทืคึผื, ืื ืกืืขืคึผืก ืงืขื ืขื ืืืื ืึธืืึทืืืืืื ืืืจื ืกืงืจืืคึผืก.
ืื ืื ืืขืจ ืืึทื ืืืึธืก ืืึทืจืฃ ืืืื ืืืคึผืืึทืืขื ืึทื ืืื ืึท ืืขืกืืขืจ ืคึผืึธืืืฆืืข ืคืื ื (LoadBalancer ืึธืืขืจ ืืืจื Ingress) ืืืจื ืืืึธืก ืืืืื ืื ื ืืึทืข ืืืขืจืกืืข ืงืขื ืขื ืืืื ืึทืงืกืขืกื. ืขืก ืงืขื ืขื ืืืื ืืขืืืืื ื ืคึฟืึทืจ ืืึทื ืืึทื ืืจืึทืืืื ื.
ืืื ืฆืืงืื ืคึฟื ืึทืจืืืงืืขื, ืืืจ ืืืขืื ืงืึธื ืืจืึธืืืจื ืื ืืขืจืข ืึธืืึทืืืืืื ืกืึทืืืฉืึทื ื ืืืึธืก ืื ืกืืจืืืขื ื ืจืืึฟ ืคืื ืืืึธืก ืืืจ ืืึธืื ืืขืืื.
ืืืืขื ืขื ืืืื ืื ืืขืจืข ืึทืจืืืงืืขื ืืืืฃ ืืื ืืืขืจ ืืืึธื:
ืืืึธืก ืืื ืื ืืืืืจืืืฉืึทื ืคืื ืงืืืงืงืืึทืืก ืึธื ืืขืจืืืืืขื ืืฉ ืฆื ืงืืืงืืึธืืกืข ืืื ืืขืจืืืืืขื ืืฉ ืคืืจื ืฆื? ืืืืขื ืืื ืึทืืืฉ ืืึทืืืฉืืื ืคึฟืึทืจ Nginx ืืขืจืืืึทื ืืืงื nxs-build-tools - ืึท ืึทืกืืกืืึทื ื ืืื ืื ืื ืืขื ืืื ืจืคึผื ืคึผืึทืงืึทืืืฉืึทื ืืงืืื ืฆื Hashicorp Consul's Kubernetes Authorization ืืืึธืก ืืืจ ืืึธืื ืฆื ืคึผื ืื ืืืขื ื ืืฆื ืื Csync2 ื ืืฆื ืืขืืขืืจืึทื ืืึธื ืคึฟืึทืจ Redmine. ืืื ืฆื ืคืึทืจืคึผืึธืฉืขืืขืจื ืืขืื ืคึฟืึทืจ ืืื ืืื ืื ืืขืจืข
ืืงืืจ: www.habr.com