Sefydlu clwstwr Nomad gan ddefnyddio Conswl ac integreiddio â Gitlab

Cyflwyniad

Yn ddiweddar, mae poblogrwydd Kubernetes wedi bod yn tyfu'n gyflym - mae mwy a mwy o brosiectau'n ei weithredu. Roeddwn i eisiau cyffwrdd â cherddorfawr fel Nomad: mae'n berffaith ar gyfer prosiectau sydd eisoes yn defnyddio atebion eraill gan HashiCorp, er enghraifft, Vault and Consul, ac nid yw'r prosiectau eu hunain yn gymhleth o ran seilwaith. Bydd y deunydd hwn yn cynnwys cyfarwyddiadau ar gyfer gosod Nomad, gan gyfuno dau nod yn glwstwr, yn ogystal ag integreiddio Nomad â Gitlab.

Sefydlu clwstwr Nomad gan ddefnyddio Conswl ac integreiddio â Gitlab

stondin prawf

Ychydig am y fainc prawf: defnyddir tri gweinydd rhithwir gyda nodweddion 2 CPU, 4 RAM, 50 Gb SSD, wedi'u huno i rwydwaith lleol cyffredin. Eu henwau a'u cyfeiriadau IP:

  1. nomad-livelinux-01: 172.30.0.5
  2. nomad-livelinux-02: 172.30.0.10
  3. conswl-livelinux-01: 172.30.0.15

Gosod Nomad, Consul. Creu clwstwr Nomad

Gadewch i ni ddechrau gyda'r gosodiad sylfaenol. Er bod y gosodiad yn syml, byddaf yn ei ddisgrifio er mwyn cywirdeb yr erthygl: fe'i crëwyd yn y bôn o ddrafftiau a nodiadau ar gyfer mynediad cyflym pan fo angen.

Cyn i ni ddechrau ymarfer, byddwn yn trafod y rhan ddamcaniaethol, oherwydd ar hyn o bryd mae'n bwysig deall strwythur y dyfodol.

Mae gennym ddau nod crwydrol ac rydym am eu cyfuno'n glwstwr, ac yn y dyfodol bydd angen i ni hefyd raddio clwstwr yn awtomatig - ar gyfer hyn bydd angen Conswl arnom. Gyda'r offeryn hwn, mae clystyru ac ychwanegu nodau newydd yn dod yn dasg syml iawn: mae'r nod Nomad a grëwyd yn cysylltu â'r asiant Conswl, ac yna'n cysylltu â'r clwstwr Nomad presennol. Felly, ar y dechrau byddwn yn gosod y gweinydd Conswl, yn ffurfweddu awdurdodiad http sylfaenol ar gyfer y panel gwe (mae heb awdurdodiad yn ddiofyn a gellir ei gyrchu mewn cyfeiriad allanol), yn ogystal â'r asiantau Conswl eu hunain ar weinyddion Nomad, ac ar ôl hynny symudwn ymlaen at Nomad yn unig.

Mae gosod offer HashiCorp yn syml iawn: yn y bôn, rydyn ni'n symud y ffeil ddeuaidd i'r cyfeiriadur biniau, yn sefydlu ffeil ffurfweddu'r offeryn, ac yn creu ei ffeil gwasanaeth.

Dadlwythwch ffeil ddeuaidd y Conswl a'i dadbacio i gyfeiriadur cartref y defnyddiwr:

root@consul-livelinux-01:~# wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
root@consul-livelinux-01:~# unzip consul_1.5.0_linux_amd64.zip
root@consul-livelinux-01:~# mv consul /usr/local/bin/

Nawr mae gennym deuaidd conswl parod ar gyfer cyfluniad pellach.

I weithio gyda Conswl, mae angen i ni greu allwedd unigryw gan ddefnyddio'r gorchymyn keygen:

root@consul-livelinux-01:~# consul keygen

Gadewch i ni symud ymlaen i sefydlu'r cyfluniad Conswl, gan greu cyfeiriadur /etc/consul.d/ gyda'r strwythur canlynol:

/etc/consul.d/
├── bootstrap
│   └── config.json

Bydd y cyfeiriadur bootstrap yn cynnwys ffeil ffurfweddu config.json - ynddo byddwn yn gosod y gosodiadau Conswl. Ei gynnwys:

{
"bootstrap": true,
"server": true,
"datacenter": "dc1",
"data_dir": "/var/consul",
"encrypt": "your-key",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["172.30.0.15"]
}

Edrychwn ar y prif gyfarwyddebau a'u hystyron ar wahân:

  • bootstrap: gwir. Rydym yn galluogi ychwanegu nodau newydd yn awtomatig os ydynt wedi'u cysylltu. Sylwaf nad ydym yn nodi yma union nifer y nodau disgwyliedig.
  • gweinydd: gwir. Galluogi modd gweinydd. Bydd conswl ar y peiriant rhithwir hwn yn gweithredu fel yr unig weinydd a meistr ar hyn o bryd, VM Nomad fydd y cleientiaid.
  • datacenter: dc1. Nodwch enw'r ganolfan ddata i greu'r clwstwr. Rhaid iddo fod yn union yr un fath ar gleientiaid a gweinyddwyr.
  • amgryptio: dy-allwedd. Yr allwedd, y mae'n rhaid iddo hefyd fod yn unigryw ac yn cyfateb ar bob cleient a gweinydd. Wedi'i gynhyrchu gan ddefnyddio'r gorchymyn consul keygen.
  • cychwyn_join. Yn y rhestr hon rydym yn nodi rhestr o gyfeiriadau IP y bydd y cysylltiad yn cael ei wneud iddynt. Ar hyn o bryd dim ond ein cyfeiriad ein hunain rydyn ni'n ei adael.

Ar y pwynt hwn gallwn redeg consul gan ddefnyddio'r llinell orchymyn:

root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui

Mae hon yn ffordd dda o ddadfygio nawr, fodd bynnag, ni fyddwch yn gallu defnyddio'r dull hwn yn barhaus am resymau amlwg. Gadewch i ni greu ffeil gwasanaeth i reoli Conswl trwy systemd:

root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service

Cynnwys y ffeil gwasanaeth consul:

[Unit]
Description=Consul Startup process
After=network.target
 
[Service]
Type=simple
ExecStart=/bin/bash -c '/usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui' 
TimeoutStartSec=0
 
[Install]
WantedBy=default.target

Lansio Conswl trwy systemctl:

root@consul-livelinux-01:~# systemctl start consul

Gadewch i ni wirio: mae'n rhaid i'n gwasanaeth fod yn rhedeg, a thrwy weithredu'r gorchymyn aelodau conswl dylem weld ein gweinydd:

root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux    172.30.0.15:8301  alive   server  1.5.0  2         dc1  <all>

Y cam nesaf: gosod Nginx a sefydlu awdurdodiad dirprwy ac http. Rydym yn gosod nginx trwy'r rheolwr pecyn ac yn y cyfeiriadur /etc/nginx/sites-enabled rydym yn creu ffeil ffurfweddu consul.conf gyda'r cynnwys canlynol:

upstream consul-auth {
    server localhost:8500;
}

server {

    server_name consul.doman.name;
    
    location / {
      proxy_pass http://consul-auth;
      proxy_set_header Host $host;
      auth_basic_user_file /etc/nginx/.htpasswd;
      auth_basic "Password-protected Area";
    }
}

Peidiwch ag anghofio creu ffeil .htpasswd a chynhyrchu enw defnyddiwr a chyfrinair ar ei gyfer. Mae angen yr eitem hon fel nad yw'r panel gwe ar gael i bawb sy'n adnabod ein parth. Fodd bynnag, wrth sefydlu Gitlab, bydd yn rhaid i ni roi'r gorau i hyn - fel arall ni fyddwn yn gallu defnyddio ein cais i Nomad. Yn fy mhrosiect, dim ond ar y we lwyd y mae Gitlab a Nomad, felly nid oes problem o'r fath yma.

Ar y ddau weinydd sy'n weddill rydym yn gosod asiantau Conswl yn unol â'r cyfarwyddiadau canlynol. Rydyn ni'n ailadrodd y camau gyda'r ffeil ddeuaidd:

root@nomad-livelinux-01:~# wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
root@nomad-livelinux-01:~# unzip consul_1.5.0_linux_amd64.zip
root@nomad-livelinux-01:~# mv consul /usr/local/bin/

Trwy gyfatebiaeth â'r gweinydd blaenorol, rydym yn creu cyfeiriadur ar gyfer ffeiliau ffurfweddu /etc/consul.d gyda'r strwythur canlynol:

/etc/consul.d/
├── client
│   └── config.json

Cynnwys y ffeil config.json:

{
    "datacenter": "dc1",
    "data_dir": "/opt/consul",
    "log_level": "DEBUG",
    "node_name": "nomad-livelinux-01",
    "server": false,
    "encrypt": "your-private-key",
    "domain": "livelinux",
    "addresses": {
      "dns": "127.0.0.1",
      "https": "0.0.0.0",
      "grpc": "127.0.0.1",
      "http": "127.0.0.1"
    },
    "bind_addr": "172.30.0.5", # локальный адрес вм
    "start_join": ["172.30.0.15"], # удаленный адрес консул сервера
    "ports": {
      "dns": 53
     }

Cadw'r newidiadau a symud ymlaen i sefydlu'r ffeil gwasanaeth, ei chynnwys:

/etc/systemd/system/consul.service:

[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target

[Service]
User=root
Group=root
ExecStart=/usr/local/bin/consul agent -config-dir=/etc/consul.d/client
ExecReload=/usr/local/bin/consul reload
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

Rydym yn lansio conswl ar y gweinydd. Nawr, ar ôl ei lansio, dylem weld y gwasanaeth wedi'i ffurfweddu yn aelodau nsul. Bydd hyn yn golygu ei fod wedi cysylltu'n llwyddiannus â'r clwstwr fel cleient. Ailadroddwch yr un peth ar yr ail weinydd ac ar ôl hynny gallwn ddechrau gosod a ffurfweddu Nomad.

Disgrifir gosodiad manylach o Nomad yn ei ddogfennaeth swyddogol. Mae dau ddull gosod traddodiadol: lawrlwytho ffeil ddeuaidd a chasglu o'r ffynhonnell. Byddaf yn dewis y dull cyntaf.

Nodyn: Mae'r prosiect yn datblygu'n gyflym iawn, mae diweddariadau newydd yn aml yn cael eu rhyddhau. Efallai y bydd fersiwn newydd yn cael ei rhyddhau erbyn i'r erthygl hon gael ei chwblhau. Felly, cyn darllen, rwy'n argymell gwirio'r fersiwn gyfredol o Nomad ar hyn o bryd a'i lawrlwytho.

root@nomad-livelinux-01:~# wget https://releases.hashicorp.com/nomad/0.9.1/nomad_0.9.1_linux_amd64.zip
root@nomad-livelinux-01:~# unzip nomad_0.9.1_linux_amd64.zip
root@nomad-livelinux-01:~# mv nomad /usr/local/bin/
root@nomad-livelinux-01:~# nomad -autocomplete-install
root@nomad-livelinux-01:~# complete -C /usr/local/bin/nomad nomad
root@nomad-livelinux-01:~# mkdir /etc/nomad.d

Ar ôl dadbacio, byddwn yn derbyn ffeil ddeuaidd Nomad sy'n pwyso 65 MB - rhaid ei symud i /usr/local/bin.

Gadewch i ni greu cyfeiriadur data ar gyfer Nomad a golygu ei ffeil gwasanaeth (mae'n debyg na fydd yn bodoli ar y dechrau):

root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service

Gludwch y llinellau canlynol yno:

[Unit]
Description=Nomad
Documentation=https://nomadproject.io/docs/
Wants=network-online.target
After=network-online.target

[Service]
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d
KillMode=process
KillSignal=SIGINT
LimitNOFILE=infinity
LimitNPROC=infinity
Restart=on-failure
RestartSec=2
StartLimitBurst=3
StartLimitIntervalSec=10
TasksMax=infinity

[Install]
WantedBy=multi-user.target

Fodd bynnag, nid ydym ar unrhyw frys i lansio nomad - nid ydym wedi creu ei ffeil ffurfweddu eto:

root@nomad-livelinux-01:~# mkdir --parents /etc/nomad.d
root@nomad-livelinux-01:~# chmod 700 /etc/nomad.d
root@nomad-livelinux-01:~# nano /etc/nomad.d/nomad.hcl
root@nomad-livelinux-01:~# nano /etc/nomad.d/server.hcl

Bydd y strwythur cyfeiriadur terfynol fel a ganlyn:

/etc/nomad.d/
├── nomad.hcl
└── server.hcl

Dylai'r ffeil nomad.hcl gynnwys y ffurfweddiad canlynol:

datacenter = "dc1"
data_dir = "/opt/nomad"

Cynnwys y ffeil server.hcl:

server {
  enabled = true
  bootstrap_expect = 1
}

consul {
  address             = "127.0.0.1:8500"
  server_service_name = "nomad"
  client_service_name = "nomad-client"
  auto_advertise      = true
  server_auto_join    = true
  client_auto_join    = true
}

bind_addr = "127.0.0.1" 

advertise {
  http = "172.30.0.5"
}

client {
  enabled = true
}

Peidiwch ag anghofio newid y ffeil ffurfweddu ar yr ail weinydd - yno bydd angen i chi newid gwerth y gyfarwyddeb http.

Y peth olaf ar hyn o bryd yw ffurfweddu Nginx ar gyfer dirprwy a sefydlu awdurdodiad http. Cynnwys y ffeil nomad.conf:

upstream nomad-auth {
        server 172.30.0.5:4646;
}

server {

        server_name nomad.domain.name;
        
        location / {
	        proxy_pass http://nomad-auth;
	        proxy_set_header Host $host;
	        auth_basic_user_file /etc/nginx/.htpasswd;
		   auth_basic "Password-protected Area";
        }
        
}

Nawr gallwn gael mynediad i'r panel gwe trwy rwydwaith allanol. Cysylltwch ac ewch i'r dudalen gweinyddwyr:

Sefydlu clwstwr Nomad gan ddefnyddio Conswl ac integreiddio â Gitlab
Delwedd 1 . Rhestr o weinyddion yng nghlwstwr Nomad

Mae'r ddau weinydd yn cael eu harddangos yn llwyddiannus yn y panel, byddwn yn gweld yr un peth yn allbwn y gorchymyn statws nod nomad:

Sefydlu clwstwr Nomad gan ddefnyddio Conswl ac integreiddio â Gitlab
Delwedd 2 . Allbwn y gorchymyn statws nod nomad

Beth am Gonswl? Gadewch i ni gael golwg. Ewch i'r panel rheoli Conswl, i'r dudalen nodau:
Sefydlu clwstwr Nomad gan ddefnyddio Conswl ac integreiddio â Gitlab
Delwedd 3 . Rhestr o nodau yn y clwstwr Conswl

Nawr mae gennym Nomad parod yn gweithio ar y cyd â Chonswl. Yn y cam olaf, byddwn yn cyrraedd y rhan hwyliog: sefydlu danfon cynwysyddion Docker o Gitlab i Nomad, a hefyd yn siarad am rai o'i nodweddion nodedig eraill.

Creu Gitlab Runner

I ddefnyddio delweddau docwyr i Nomad, byddwn yn defnyddio rhedwr ar wahân gyda ffeil ddeuaidd Nomad y tu mewn (yma, gyda llaw, gallwn nodi nodwedd arall o gymwysiadau Hashicorp - yn unigol maent yn ffeil ddeuaidd sengl). Llwythwch ef i'r cyfeiriadur rhedwr. Gadewch i ni greu Dockerfile syml ar ei gyfer gyda'r cynnwys canlynol:


FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad

Yn yr un prosiect rydym yn creu .gitlab-ci.yml:

variables:
  DOCKER_IMAGE: nomad/nomad-deploy
  DOCKER_REGISTRY: registry.domain.name
 

stages:
  - build

build:
  stage: build
  image: ${DOCKER_REGISTRY}/nomad/alpine:3
  script:
    - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:latest
    - docker build --pull -t ${tag} -f Dockerfile .
    - docker push ${tag}

O ganlyniad, bydd gennym ddelwedd ar gael o'r rhedwr Nomad yng Nghofrestrfa Gitlab, nawr gallwn fynd yn uniongyrchol i ystorfa'r prosiect, creu Piblinell a ffurfweddu swydd nomad Nomad.

Gosodiad y prosiect

Gadewch i ni ddechrau gyda ffeil swydd Nomad. Bydd fy mhrosiect yn yr erthygl hon yn eithaf cyntefig: bydd yn cynnwys un dasg. Bydd cynnwys .gitlab-ci fel a ganlyn:

variables:
  NOMAD_ADDR: http://nomad.address.service:4646
  DOCKER_REGISTRY: registry.domain.name
  DOCKER_IMAGE: example/project

stages:
  - build
  - deploy

build:
  stage: build
  image: ${DOCKER_REGISTRY}/nomad-runner/alpine:3
  script:
    - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA}
    - docker build --pull -t ${tag} -f Dockerfile .
    - docker push ${tag}


deploy:
  stage: deploy
  image: registry.example.com/nomad/nomad-runner:latest
  script:
    - envsubst '${CI_COMMIT_SHORT_SHA}' < project.nomad > job.nomad
    - cat job.nomad
    - nomad validate job.nomad
    - nomad plan job.nomad || if [ $? -eq 255 ]; then exit 255; else echo "success"; fi
    - nomad run job.nomad
  environment:
    name: production
  allow_failure: false
  when: manual

Yma mae'r gosodiad yn digwydd â llaw, ond gallwch ei ffurfweddu i newid cynnwys cyfeiriadur y prosiect. Mae'r biblinell yn cynnwys dau gam: cydosod delwedd a'i defnyddio i nomad. Yn y cam cyntaf, rydym yn cydosod delwedd docwr a'i gwthio i'n Cofrestrfa, ac ar yr ail rydym yn lansio ein swydd yn Nomad.

job "monitoring-status" {
    datacenters = ["dc1"]
    migrate {
        max_parallel = 3
        health_check = "checks"
        min_healthy_time = "15s"
        healthy_deadline = "5m"
    }

    group "zhadan.ltd" {
        count = 1
        update {
            max_parallel      = 1
            min_healthy_time  = "30s"
            healthy_deadline  = "5m"
            progress_deadline = "10m"
            auto_revert       = true
        }
        task "service-monitoring" {
            driver = "docker"

            config {
                image = "registry.domain.name/example/project:${CI_COMMIT_SHORT_SHA}"
                force_pull = true
                auth {
                    username = "gitlab_user"
                    password = "gitlab_password"
                }
                port_map {
                    http = 8000
                }
            }
            resources {
                network {
                    port "http" {}
                }
            }
        }
    }
}

Sylwch fod gennyf Gofrestrfa breifat ac i dynnu delwedd docwr yn llwyddiannus mae angen i mi fewngofnodi iddi. Yr ateb gorau yn yr achos hwn yw mewngofnodi a chyfrinair i Vault ac yna ei integreiddio â Nomad. Mae Nomad yn cefnogi Vault yn frodorol. Ond yn gyntaf, gadewch i ni osod y polisïau angenrheidiol ar gyfer Nomad yn Vault ei hun; gellir eu lawrlwytho:

# Download the policy and token role
$ curl https://nomadproject.io/data/vault/nomad-server-policy.hcl -O -s -L
$ curl https://nomadproject.io/data/vault/nomad-cluster-role.json -O -s -L

# Write the policy to Vault
$ vault policy write nomad-server nomad-server-policy.hcl

# Create the token role with Vault
$ vault write /auth/token/roles/nomad-cluster @nomad-cluster-role.json

Nawr, ar ôl creu'r polisïau angenrheidiol, byddwn yn ychwanegu integreiddio â Vault yn y bloc tasgau yn y ffeil job.nomad:

vault {
  enabled = true
  address = "https://vault.domain.name:8200"
  token = "token"
}

Rwy'n defnyddio awdurdodiad trwy docyn ac yn ei gofrestru'n uniongyrchol yma, mae yna hefyd yr opsiwn o nodi'r tocyn fel newidyn wrth gychwyn asiant nomad:

$ VAULT_TOKEN=<token> nomad agent -config /path/to/config

Nawr gallwn ddefnyddio'r allweddi gyda Vault. Mae'r egwyddor o weithredu yn syml: rydym yn creu ffeil yn swydd Nomad a fydd yn storio gwerthoedd newidynnau, er enghraifft:

template {
                data = <<EOH
{{with secret "secrets/pipeline-keys"}}
REGISTRY_LOGIN="{{ .Data.REGISTRY_LOGIN }}"
REGISTRY_PASSWORD="{{ .Data.REGISTRY_LOGIN }}{{ end }}"

EOH
    destination = "secrets/service-name.env"
    env = true
}

Gyda'r dull syml hwn, gallwch chi ffurfweddu danfon cynwysyddion i glwstwr Nomad a gweithio gydag ef yn y dyfodol. Byddaf yn dweud fy mod i ryw raddau yn cydymdeimlo â Nomad - mae'n fwy addas ar gyfer prosiectau bach lle gall Kubernetes achosi cymhlethdod ychwanegol ac ni fydd yn gwireddu ei botensial llawn. Hefyd, mae Nomad yn berffaith ar gyfer dechreuwyr - mae'n hawdd ei osod a'i ffurfweddu. Fodd bynnag, wrth brofi ar rai prosiectau, rwy'n dod ar draws problem gyda'i fersiynau cynnar - yn syml, nid yw llawer o swyddogaethau sylfaenol yno neu nid ydynt yn gweithio'n gywir. Fodd bynnag, credaf y bydd Nomad yn parhau i ddatblygu ac yn y dyfodol bydd yn caffael y swyddogaethau sydd eu hangen ar bawb.

Awdur: Ilya Andreev, wedi'i olygu gan Alexey Zhadan a thîm Live Linux


Ffynhonnell: hab.com

Ychwanegu sylw