መጀመሪያ ምን መጣ - ዶሮ ወይስ እንቁላል? ስለ መሠረተ ልማት-እንደ-ኮድ መጣጥፍ በጣም እንግዳ ጅምር ፣ አይደለም?
እንቁላል ምንድን ነው?
ብዙ ጊዜ፣ መሠረተ ልማት-እንደ-ኮድ (IaC) መሠረተ ልማትን የሚወክል ገላጭ መንገድ ነው። በእሱ ውስጥ ከሃርድዌር ክፍል ጀምሮ እና በሶፍትዌር ውቅር በማጠናቀቅ ማግኘት የምንፈልገውን ሁኔታ እንገልፃለን. ስለዚህ IaC ጥቅም ላይ የሚውለው ለ:
- የንብረት አቅርቦት. እነዚህ VMs፣ S3፣ VPC፣ ወዘተ ናቸው። ለስራ መሰረታዊ መሳሪያዎች;
Terraform иCloudFormation . የሶፍትዌር ውቅር . መሰረታዊ መሳሪያዎች፡-የሚጠራ , ሼፍ, ወዘተ.
ማንኛውም ኮድ በgit ማከማቻዎች ውስጥ አለ። እና ፈጥኖም ሆነ ዘግይቶ የቡድን መሪው በቅደም ተከተል መቀመጥ እንዳለባቸው ይወስናል. እና እሱ እንደገና ይገለጻል። እና አንዳንድ መዋቅር ይፈጥራል. እና ይህ ጥሩ እንደሆነ ያያል.
አስቀድሞ መኖሩም ጥሩ ነው።
እንቁላሉ የመጣው ከየት ነው?
ስለዚህ ቀስ በቀስ ወደ ዋናው ጥያቄ እንቀርባለን.
በመጀመሪያ ደረጃ, እራስዎን ጨምሮ የሌሎች ማከማቻዎችን መዋቅር በሚገልጽ ማከማቻ መጀመር ያስፈልግዎታል. እና በእርግጥ፣ እንደ GitOps አካል፣ ለውጦች በራስ-ሰር እንዲከናወኑ CI ን ማከል ያስፈልግዎታል።
Git ገና ካልተፈጠረ?
- በ Git ውስጥ እንዴት ማከማቸት?
- CI እንዴት እንደሚጫን?
- IaCን በመጠቀም Gitlab ን ብናሰማራ እና በኩበርኔትስ ውስጥም ቢሆን?
- እና GitLab Runner ደግሞ በኩበርኔትስ ውስጥ?
- በደመና አቅራቢው ውስጥ ስለ Kubernetesስ?
መጀመሪያ ምን መጣ፡ ኮዴን የምሰቅልበት GitLab ወይስ ምን አይነት GitLab እንደሚያስፈልገኝ የሚገልጽ ኮድ?
ዶሮ ከእንቁላል ጋር
«ኦያኮዶን 3 ከዳይኖሰር ጋር"src ]
እንደ ደመና አቅራቢ ተጠቅመን ምግብ ለማብሰል እንሞክር
TL; DR
በአንድ ጊዜ አንድ ቡድን መቀላቀል ይቻላል?
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash
ግብዓቶች
- መለያ ከ my.selectel.ru;
- መለያ ማስመሰያ;
- የኩበርኔትስ ችሎታዎች;
- Helm ችሎታዎች;
- ቴራፎርም ችሎታዎች;
- Helm ገበታ GitLab;
- Helm ገበታ GitLab Runner.
መልመጃ
- MY_SELECTEL_TOKENን ከፓነል ያግኙ my.selectel.ru.
- የመለያ ቶከንን ወደ እሱ በማስተላለፍ የኩበርኔትስ ክላስተር ይፍጠሩ።
- KUBECONFIG ከተፈጠረው ዘለላ ያግኙ።
- በ Kubernetes ላይ GitLab ን ይጫኑ።
- ለተጠቃሚ የተፈጠረ GitLab-tokenን ከ GitLab ያግኙ ሥር.
- GitLab-tokenን በመጠቀም በ GitLab ውስጥ የፕሮጀክት መዋቅር ይፍጠሩ።
- ያለውን ኮድ ወደ GitLab ግፋ።
- ???
- ትርፍ!
1 ደረጃ. ማስመሰያው በክፍል ውስጥ ሊገኝ ይችላል
2 ደረጃ. የእኛን Terraform የ 2 ኖዶች ክላስተር "ለመጋገር" እናዘጋጃለን. ለሁሉም ነገር የሚሆን በቂ ግብዓት እንዳለህ እርግጠኛ ከሆንክ ራስ-ሰር ኮታዎችን ማንቃት ትችላለህ፡-
provider "selectel" {
token = var.my_selectel_token
}
variable "my_selectel_token" {}
variable "username" {}
variable "region" {}
resource "selectel_vpc_project_v2" "my-k8s" {
name = "my-k8s-cluster"
theme = {
color = "269926"
}
quotas {
resource_name = "compute_cores"
resource_quotas {
region = var.region
zone = "${var.region}a"
value = 16
}
}
quotas {
resource_name = "network_floatingips"
resource_quotas {
region = var.region
value = 1
}
}
quotas {
resource_name = "load_balancers"
resource_quotas {
region = var.region
value = 1
}
}
quotas {
resource_name = "compute_ram"
resource_quotas {
region = var.region
zone = "${var.region}a"
value = 32768
}
}
quotas {
resource_name = "volume_gigabytes_fast"
resource_quotas {
region = var.region
zone = "${var.region}a"
# (20 * 2) + 50 + (8 * 3 + 10)
value = 130
}
}
}
resource "selectel_mks_cluster_v1" "k8s-cluster" {
name = "k8s-cluster"
project_id = selectel_vpc_project_v2.my-k8s.id
region = var.region
kube_version = "1.17.9"
}
resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
cluster_id = selectel_mks_cluster_v1.k8s-cluster.id
project_id = selectel_mks_cluster_v1.k8s-cluster.project_id
region = selectel_mks_cluster_v1.k8s-cluster.region
availability_zone = "${var.region}a"
nodes_count = 2
cpus = 8
ram_mb = 16384
volume_gb = 15
volume_type = "fast.${var.region}a"
labels = {
"project": "my",
}
}
ተጠቃሚ ወደ ፕሮጀክቱ አክል፡
resource "random_password" "my-k8s-user-pass" {
length = 16
special = true
override_special = "_%@"
}
resource "selectel_vpc_user_v2" "my-k8s-user" {
password = random_password.my-k8s-user-pass.result
name = var.username
enabled = true
}
resource "selectel_vpc_keypair_v2" "my-k8s-user-ssh" {
public_key = file("~/.ssh/id_rsa.pub")
user_id = selectel_vpc_user_v2.my-k8s-user.id
name = var.username
}
resource "selectel_vpc_role_v2" "my-k8s-role" {
project_id = selectel_vpc_project_v2.my-k8s.id
user_id = selectel_vpc_user_v2.my-k8s-user.id
}
ውጤት፡
output "project_id" {
value = selectel_vpc_project_v2.my-k8s.id
}
output "k8s_id" {
value = selectel_mks_cluster_v1.k8s-cluster.id
}
output "user_name" {
value = selectel_vpc_user_v2.my-k8s-user.name
}
output "user_pass" {
value = selectel_vpc_user_v2.my-k8s-user.password
}
እንጀምራለን፡-
$ env
TF_VAR_region=ru-3
TF_VAR_username=diamon
TF_VAR_my_selectel_token=<token>
terraform plan -out planfile
$ terraform apply -input=false -auto-approve planfile
3 ደረጃ. cubeconfig ን እናገኛለን.
KUBECONFIGን በፕሮግራም ለማውረድ ከOpenStack ማስመሰያ ማግኘት ያስፈልግዎታል፡-
openstack token issue -c id -f value > token
እና በዚህ ማስመሰያ የሚተዳደረው Kubernetes Selectel API ይጠይቁ። k8s_መታወቂያ ይሰጣል ቴራፎርም:
curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yaml
Cupconfig በፓነል በኩል ሊደረስበት ይችላል.
4 ደረጃ. ክላስተር ከተጋገረ በኋላ እና ወደ እሱ መድረስ ከቻልን በኋላ ለመቅመስ ያሚል በላዩ ላይ ማከል እንችላለን።
ማከል እመርጣለሁ፡-
- የስም ቦታ
- የማከማቻ ክፍል
- የፖድ ደህንነት ፖሊሲ እና የመሳሰሉት።
መጀመሪያ ላይ በዞኑ ውስጥ ክላስተር መርጫለሁ። ru-3a, ከዚያ ከዚህ ዞን የማከማቻ ክፍል እፈልጋለሁ.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: fast.ru-3a
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parameters:
type: fast.ru-3a
availability: ru-3a
allowVolumeExpansion: true
5 ደረጃ. የጭነት ሚዛንን ይጫኑ.
ደረጃውን ለብዙዎች እንጠቀማለን nginx-ingress. እሱን ለመጫን ብዙ መመሪያዎች አሉ ፣ ስለሆነም በእሱ ላይ አናተኩርም።
$ helm repo add nginx-stable https://helm.nginx.com/stable
$ helm upgrade nginx-ingress nginx-stable/nginx-ingress -n ingress --install -f ../internal/K8S-cluster/ingress/values.yml
ለ3-4 ደቂቃ ያህል ውጫዊ አይፒን እስኪቀበል እንጠብቃለን።
የተቀበለው የውጭ አይፒ፡
6 ደረጃ. GitLab ን ይጫኑ።
$ helm repo add gitlab https://charts.gitlab.io
$ helm upgrade gitlab gitlab/gitlab -n gitlab --install -f gitlab/values.yml --set "global.hosts.domain=gitlab.$EXTERNAL_IP.nip.io"
እንደገና ሁሉም እንክብሎች እስኪነሱ ድረስ እንጠብቃለን።
kubectl get po -n gitlab
NAME READY STATUS RESTARTS AGE
gitlab-gitaly-0 0/1 Pending 0 0s
gitlab-gitlab-exporter-88f6cc8c4-fl52d 0/1 Pending 0 0s
gitlab-gitlab-runner-6b6867c5cf-hd9dp 0/1 Pending 0 0s
gitlab-gitlab-shell-55cb6ccdb-h5g8x 0/1 Init:0/2 0 0s
gitlab-migrations.1-2cg6n 0/1 Pending 0 0s
gitlab-minio-6dd7d96ddb-zd9j6 0/1 Pending 0 0s
gitlab-minio-create-buckets.1-bncdp 0/1 Pending 0 0s
gitlab-postgresql-0 0/2 Pending 0 0s
gitlab-prometheus-server-6cfb57f575-v8k6j 0/2 Pending 0 0s
gitlab-redis-master-0 0/2 Pending 0 0s
gitlab-registry-6bd77b4b8c-pb9v9 0/1 Pending 0 0s
gitlab-registry-6bd77b4b8c-zgb6r 0/1 Init:0/2 0 0s
gitlab-shared-secrets.1-pc7-5jgq4 0/1 Completed 0 20s
gitlab-sidekiq-all-in-1-v1-54dbcf7f5f-qbq67 0/1 Pending 0 0s
gitlab-task-runner-6fd6857db7-9x567 0/1 Pending 0 0s
gitlab-webservice-d9d4fcff8-hp8wl 0/2 Pending 0 0s
Waiting gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
waiting for pod...
waiting for pod...
waiting for pod...
ዱባዎቹ ተነሱ;
7 ደረጃ. GitLab-token እንቀበላለን.
መጀመሪያ የመግቢያ ይለፍ ቃል እወቅ፡-
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decode
አሁን ግባ እና ማስመሰያ እንያዝ፡-
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.io
8 ደረጃ. Gitlab አቅራቢን በመጠቀም የጂት ማከማቻዎችን ወደ ትክክለኛው ተዋረድ ማምጣት።
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile
እንደ አለመታደል ሆኖ የቴራፎርም GitLab አቅራቢ ተንሳፋፊ አለው።
ሳንካ . ከዚያ tf.state እንዲስተካከል እርስ በርስ የሚጋጩ ፕሮጀክቶችን በእጅ መሰረዝ ይኖርብዎታል። ከዚያ `$ make all` የሚለውን ትዕዛዙን እንደገና ያሂዱ
9 ደረጃ. የአካባቢ ማከማቻዎችን ወደ አገልጋዩ እናስተላልፋለን።
$ make push
[master (root-commit) b61d977] Initial commit
3 files changed, 46 insertions(+)
create mode 100644 .gitignore
create mode 100644 values.yml
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 770 bytes | 770.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
ተከናውኗል
መደምደሚያ
ከአገር ውስጥ ማሽን ሁሉንም ነገር ገላጭ በሆነ መንገድ ማስተዳደር እንደምንችል ደርሰናል። አሁን እነዚህን ሁሉ ተግባራት ወደ CI ማስተላለፍ እፈልጋለሁ እና አዝራሮችን ብቻ ይጫኑ. ይህንን ለማድረግ የአካባቢያችንን ግዛቶች (ቴራፎርም ግዛት) ወደ CI ማስተላለፍ አለብን. ይህንን እንዴት ማድረግ እንደሚቻል በሚቀጥለው ክፍል ውስጥ ነው.
የእኛን ይመዝገቡ
ጦማር አዳዲስ መጣጥፎችን እንዳያመልጥዎት!
ምንጭ: hab.com