ΠΠ΅ΠΏΠ»ΠΎΠΉ Π² Kubernetes
Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Kubernetes Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ GitVerse CI/CD.
Kubernetes β ΡΡΠΎ ΠΌΠΎΡΠ½Π°Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ, ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
Π ΡΠ°ΠΌΠΊΠ°Ρ GitVerse CI/CD Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² Kubernetes ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ GitVerse-ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ.
ΠΡΠΈΠΌΠ΅Ρ workflow
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
-
Π‘ΠΎΠ±ΡΠ°Π½Π½ΡΠΉ Docker-ΠΎΠ±ΡΠ°Π·:
- ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ°Π· ΡΠΆΠ΅ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π² ΡΠ΅Π΅ΡΡΡΠ΅;
- ΠΏΡΠΈΠΌΠ΅Ρ:
gitverse.ru/actions/gitverse_hello:kaniko_cli; - ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ ΡΠ΅ΡΠ΅Π·:
.gitverse/workflows/docker/cloud-hosted-runner/push-registries.yaml.
-
ΠΠΎΡΡΡΠΏ ΠΊ Kubernetes-ΠΊΠ»Π°ΡΡΠ΅ΡΡ:
- ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (kubeconfig) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΊΠ°ΠΊ ΡΠ΅ΠΊΡΠ΅Ρ: KUBE_CONFIG;
- ΠΊΠΎΠ½ΡΠΈΠ³ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΏΡΠ°Π²Π° Π½Π° apply/delete Π΄Π»Ρ deployment ΠΈ ingress.
-
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ:
- ΡΠΊΡΠΈΠΏΡ
./distribution/dependencies/install_k8s_dependencies.shΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ kubectl ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ.
ΠΡΠΈΠΌΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ kubectl Π²ΡΡΡΠ½ΡΡ:
# install kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
chmod +x kubectl
mkdir -p ~/.local/bin
mv ./kubectl ~/.local/bin/kubectl-
ΠΠ°Π½ΠΈΡΠ΅ΡΡΡ:
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΡ Π±Π΅Π· production-Π½Π°ΡΡΡΠΎΠ΅ΠΊ:
gitverse-hello-deployment.yamlβ Π±Π°Π·ΠΎΠ²ΡΠΉ Deployment + Service;apiVersion: apps/v1 kind: Deployment metadata: name: gitverse-hello-deployment spec: replicas: 1 template: metadata: labels: app: gitverse-hello-app spec: containers: - name: gitverse-hello image: gitverse.ru/actions/gitverse_hello:kaniko_cli imagePullPolicy: Always ports: - containerPort: 80 selector: matchLabels: app: gitverse-hello-app --- apiVersion: v1 kind: Service metadata: name: gitverse-hello-service spec: selector: app: gitverse-hello-app type: ClusterIP ports: - port: 80 targetPort: 80ingress-deployment.yamlβ Ingress Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Ρ ΠΎΡΡΠ° ΠΈ Π±ΡΠΊΠ΅Π½Π΄Π°;apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gitverse-hello-ingress labels: name: gitverse-hello-ingress spec: rules: - http: paths: - pathType: Prefix path: "/" backend: service: name: gitverse-hello-service port: number: 80
- Π½Π΅Ρ: liveness/readiness, limits/requests, HPA, nodeSelector ΠΈ Ρ.Π΄;
- ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π΄Π»Ρ Π΄Π΅ΠΌΠΎ ΠΈ ΡΠ΅ΡΡΠΎΠ², Π½ΠΎ Π½Π΅ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°.
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΡ Π±Π΅Π· production-Π½Π°ΡΡΡΠΎΠ΅ΠΊ:
-
Ingress:
- IP-Π°Π΄ΡΠ΅Ρ Ingress-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΊΠ°Π·Π°Π½ Π² ΡΠ΅ΠΊΡΠ΅ΡΠ΅:
KUBE_INGRESS_IP; - ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Ingress-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
- IP-Π°Π΄ΡΠ΅Ρ Ingress-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΊΠ°Π·Π°Π½ Π² ΡΠ΅ΠΊΡΠ΅ΡΠ΅:
Workflow
name: ΠΠ΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Kubernetes (kubectl)
on:
workflow_dispatch:
jobs:
# ΠΠ΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Kubernetes ΡΠ΅ΡΠ΅Π· kubectl
deploy-k8s-kubectl:
name: ΠΠ΅ΠΏΠ»ΠΎΠΉ Π² Kubernetes (kubectl)
runs-on: ubuntu-cloud-runner
steps:
- name: ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
uses: actions/checkout@v4
- name: Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ (kubectl)
shell: bash
run: |
echo "π οΈ Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° kubectl ΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²..."
bash ./distribution/dependencies/install_k8s_dependencies.sh
- name: ΠΠ°ΡΡΡΠΎΠΈΡΡ kubeconfig
run: |
echo "π Π Π°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ kubeconfig..."
mkdir -p ~/.kube
echo "${{ secrets.KUBE_CONFIG }}" > ~/.kube/config
chmod 600 ~/.kube/config
- name: ΠΡΠΎΠ²Π΅ΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°
run: |
echo "π ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ Kubernetes..."
kubectl get nodes
kubectl get ns
- name: ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΡ
run: |
echo "π¦ ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ GitVerse Hello Deployment..."
kubectl apply -f ./distribution/k8s-manifest/gitverse-hello-deployment.yaml --force
echo "π ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ingress..."
kubectl apply -f ./distribution/k8s-manifest/ingress-deployment.yaml --force
- name: ΠΡΠΎΠ²Π΅ΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ°
run: |
echo "β³ ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΠΎΠ΄ΠΎΠ²..."
sleep 15
echo "π ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ΅Π· Ingress..."
curl -f http://${{ secrets.KUBE_INGRESS_IP }} || exit 1
- name: Π£Π΄Π°Π»ΠΈΡΡ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΡ
if: always()
run: |
echo "π Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ deployment ΠΈ ingress..."
kubectl delete -f ./distribution/k8s-manifest/gitverse-hello-deployment.yaml --grace-period=5 || true
kubectl delete -f ./distribution/k8s-manifest/ingress-deployment.yaml --grace-period=5 || trueΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ°Π³ΠΎΠ² workflow
1. ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ action
actions/checkout@v4Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
- Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΊΡΠΈΠΏΡ
./distribution/dependencies/install_k8s_dependencies.shΠ΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ kubectl ΠΈ Π΄ΡΡΠ³ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΡΠΈΠ»ΠΈΡ; - ΡΡΠΎΡ ΡΠ°Π³ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΠ΅ Π²ΡΠ΅Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ kubernetes.
3. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° kubeconfig.
- ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ
~/.kubeΠ΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ; - ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ kubernetes ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΡΡΡ ΠΈΠ· ΡΠ΅ΠΊΡΠ΅ΡΠ°
KUBE_CONFIGΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ°ΠΉΠ»; - ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° 600 Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.
4. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
- ΠΊΠΎΠΌΠ°Π½Π΄Ρ
kubectl get nodesΠΈkubectl get nsΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΊΠ»Π°ΡΡΠ΅ΡΡ; - ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π²ΡΠ΅ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΎΠ².
5. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΎΠ².
- ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡ deployment:
gitverse-hello-deployment.yaml; - Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡ ingress:
ingress-deployment.yaml; - ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ»Π°Π³
--forceΠ΄Π»Ρ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ².
6. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°.
- ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ 15 ΡΠ΅ΠΊΡΠ½Π΄ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ²;
- ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· ingress Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ curl;
- Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π΅ ΠΏΡΠΎΠΉΠ΄Π΅Π½Π°, workflow Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ.
7. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΎΠ².
- ΠΏΡΠΈ Π»ΡΠ±ΠΎΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΠ»ΠΈ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ) ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΡΠΈΡΡΠΊΠ° ΡΠ΅ΡΡΡΡΠΎΠ²;
- ΡΠ΄Π°Π»ΡΡΡΡΡ deployment ΠΈ ingress Ρ grace period 5 ΡΠ΅ΠΊΡΠ½Π΄;
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
|| trueΠ΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ, Π΅ΡΠ»ΠΈ ΡΠ΅ΡΡΡΡΡ ΡΠΆΠ΅ ΡΠ΄Π°Π»Π΅Π½Ρ.