- Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌΡΡ Π² Mail.ru Cloud Solutions
- ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ MCS ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ»Π°ΡΡΠ΅Ρ Kubernetes. Π ΠΏΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ°Ρ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ Ngins Ingress Controller
- ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΠΌ kubeconfig ΡΠ°ΠΉΠ» ΠΈ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ
export KUBECONFIG=<path to downloaded kubeconfig>- ΠΠΎΠΊΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΊΠ»Π°ΡΡΠ΅Ρ, ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
- ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ PostgreSQL
- ΠΠ° ΡΡΠ°ΠΏΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΆΠΌΠ΅ΠΌ Π°Π²ΡΠΎΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π΅Π³ΠΎ, ΠΎΠ½ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ
- Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌΡΡ Π½Π° Gitlab.com
- ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΡΡΡΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ mcs-kubernetes-project
- ΠΠ»ΠΎΠ½ΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠ΅Π±Π΅
- ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ app ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π³ΠΈΡΠ»Π°Π±Π°
- ΠΡΡΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
- ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Ρ Π΅Π»ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π³ΠΈΡΠ»Π°Π±Π°
helm repo add gitlab https://charts.gitlab.io- Π‘ΡΠ°Π²ΠΈΠΌ ΡΠ°Π½Π½Π΅Ρ
kubectl create namespace gitlab
helm install --namespace gitlab gitlab-runner gitlab/gitlab-runner \
--set rbac.create=true \
--set runners.privileged=true \
--set gitlabUrl=https://gitlab.com/ \
--set runnerRegistrationToken=<token from project settings/CI/CD/Runners>- ΠΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°ΡΠ΅Π½Π½ΡΠ΅ ΡΠ°Π½Π½Π΅ΡΡ Π² Settings/CI/CD/Runners
- ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ» .gitlab-ci.yml ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π½Π° Π³ΠΈΡΠ»Π°Π±Π΅ ΠΈ ΠΏΡΡΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
- Π‘ΠΌΠΎΡΡΠΈΠΌ Π·Π° ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠΌ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ Π³ΠΈΡΠ»Π°Π±Π°. Π¨Π°Π³ Π΄Π΅ΠΏΠ»ΠΎΡ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ°Π΄Π°ΡΡ, ΡΠ°ΠΊ ΠΈ Π·Π°Π΄ΡΠΌΠ°Π½ΠΎ
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
kubectl create ns mcs-kubernetes-project- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ RBAC ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΡΠ°Π½Π½Π΅ΡΠ° ΠΊ API Kubernetes
kubectl create sa deploy -n mcs-kubernetes-project
kubectl create rolebinding deploy \
-n mcs-kubernetes-project \
--clusterrole edit \
--serviceaccount mcs-kubernetes-project:deploy- ΠΠΎΠ»ΡΡΠ°ΠΌ ΡΠΎΠΊΠ΅Π½ ΠΎΡ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΊΠΊΠ°ΡΠ½ΡΠ°
kubectl get secret -n mcs-kubernetes-project \
$(kubectl get sa -n mcs-kubernetes-project deploy \
-o jsonpath='{.secrets[].name}') \
-o jsonpath='{.data.token}'- ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π³ΠΈΡΠ»Π°Π±Π°. Π Π»Π΅Π²ΠΎΠΌ ΠΌΠ΅Π½Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ Settings, Π΄Π°Π»Π΅Π΅ CI/CD ΠΈ Π΄Π°Π»Π΅Π΅ Variables ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Expand Π Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ K8S_CI_TOKEN Π ΠΏΡΠ°Π²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄ΠΈΠΌ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Π½ ΠΈΠ· Π²ΡΠ²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ setup.sh Protected Π²ΡΠΊΠ»ΡΡΠ°Π΅ΠΌ! Masked Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ!
- ΠΠ°Π»Π΅Π΅ Π² ΡΠΎΠΌ ΠΆΠ΅ Π»Π΅Π²ΠΎΠΌ ΠΌΠ΅Π½Ρ Π² Settings > Repository Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ Deploy tokens ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Expand. Π ΠΏΠΎΠ»Π΅ Name Π²Π²ΠΎΠ΄ΠΈΠΌ k8s-pull-token Π ΡΡΠ°Π²ΠΈΠΌ Π³Π°Π»ΠΎΡΠΊΡ ΡΡΠ΄ΠΎΠΌ Ρ read_registry. ΠΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΏΡΡΡΡΠΌΠΈ. ΠΠ°ΠΆΠΈΠΌΠ°Π΅ΠΌ Create deploy token. ΠΠ ΠΠΠΠ Π«ΠΠΠΠ ΠΠΠΠ ΠΠ ΠΠ£ΠΠΠ Π!
- ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ image pull secret Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΊΡΠ±Π΅ΡΠ½Π΅ΡΠΈΡ ΠΌΠΎΠ³ ΠΏΡΠ»ΠΈΡΡ ΠΈΠΌΠ°Π΄ΠΆΠΈ ΠΈΠ· Π³ΠΈΡΠ»Π°Π±Π°
kubectl create secret docker-registry mcs-kubernetes-project-image-pull \
--docker-server registry.gitlab.com \
--docker-email '[email protected]' \
--docker-username '<ΠΏΠ΅ΡΠ²Π°Ρ ΡΡΡΠΎΡΠΊΠ° ΠΈΠ· ΠΎΠΊΠ½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° Π² gitlab>' \
--docker-password '<Π²ΡΠΎΡΠ°Ρ ΡΡΡΠΎΡΠΊΠ° ΠΈΠ· ΠΎΠΊΠ½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° Π² gitlab>' \
--namespace mcs-kubernetes-projectΠ‘ΠΎΠΎΡΠ²Π΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΡ Π½Π° ΠΌΠ΅ΡΡΠΎ <> Π½ΡΠΆΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ.
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ΅ΠΊΡΠ΅Ρ Ρ ΠΏΠ°ΡΠΎΠ»Π΅ΠΌ ΠΊ ΠΠ
kubectl create secret generic mcs-kubernetes-project \
-n mcs-kubernetes-project \
--from-literal db-password=<ΡΠΎΡ
ΡΠ°Π½Π΅Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅ ΠΏΠ°ΡΠΎΠ»Ρ ΠΎΡ ΠΠ>- ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ .kube ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Π³ΠΈΡΠ»Π°Π±Π΅
- ΠΡΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π² ΡΠ°ΠΉΠ»Π΅ deployment.yaml ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΠ
- ΠΡΡΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΆΠ΄Π΅ΠΌ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π΄Π΅ΠΏΠ»ΠΎΡ
- ΠΠΎ IP Π°Π΄ΡΠ΅ΡΡ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±Π»Π°ΠΊΠΎΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
kubectl get svc -n ingress-nginx nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[].ip}'- ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΏΠ°ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ
curl -k https://<INGRESS IP>/users -X POST -H "Content-Type: application/json" --data '{"name":"test","location":"asdf","age":12}'
curl -k https://<INGRESS IP>/users