Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Hello! Daghang mga cool nga kagamitan sa automation ang gipagawas karong bag-o alang sa paghimo og mga imahe sa Docker ug pag-deploy sa Kubernetes. Niining bahina, nakahukom ko nga magdula sa Gitlab, kung giunsa pagtuon ang mga kapabilidad niini ug, siyempre, pag-set up sa usa ka pipeline.

Kini nga site giinspirar ni kubernetes.io, nga namugna gikan sa source codes awtomatik, ug alang sa matag hangyo sa pagbitad nga gipadala, ang robot awtomatik nga nagmugna ug preview nga bersyon sa site uban sa imong mga kausaban ug naghatag ug link para sa pagtan-aw.

Gisulayan nako ang paghimo og parehas nga proseso gikan sa wala, apan hingpit nga gitukod sa Gitlab CI ug libre nga mga himan nga gigamit nako sa pag-deploy sa mga aplikasyon sa Kubernetes. Karon sa katapusan isulti ko kanimo ang labi pa bahin kanila.

Ang artikulo maglakip sa mga himan sama sa:
Hugo, qbec, kani, git-crypt и GitLab CI uban ang paghimo sa dinamikong mga palibot.

Sulud

  1. Pagkilala kay Hugo
  2. Pag-andam sa Dockerfile
  3. Pagkaila kaniko
  4. Pasiuna sa qbec
  5. Gisulayan ang Gitlab-runner sa Kubernetes-executor
  6. I-deploy ang mga tsart sa Helm gamit ang qbec
  7. Pasiuna sa git-crypt
  8. Paghimo usa ka imahe sa toolbox
  9. Ang among una nga pipeline ug asembliya sa mga imahe pinaagi sa mga tag
  10. I-deploy ang automation
  11. Mga artifact ug asembliya kung nagduso sa pag-master
  12. Dinamikong palibot
  13. Repasuha ang mga Aplikasyon

1. Pag-ila kang Hugo

Isip usa ka pananglitan sa among proyekto, among sulayan ang paghimo og usa ka site sa pagpatik sa dokumentasyon nga gitukod sa Hugo. Ang Hugo usa ka static content generator.

Alang sa mga dili pamilyar sa mga static generator, isulti ko kanimo ang labi pa bahin kanila. Dili sama sa regular nga mga makina sa site nga adunay database ug usa ka matang sa php, nga, kung gihangyo sa tiggamit, makamugna og mga panid sa langaw, ang mga static nga generator gihan-ay sa usa ka gamay nga lahi. Gitugotan ka nila sa pagkuha sa gigikanan, kasagaran usa ka set sa mga file sa Markdown markup ug mga template sa tema, dayon i-compile kini sa usa ka hingpit nga nahuman nga site.

Kana mao, sa output makakuha ka usa ka istruktura sa direktoryo ug usa ka hugpong sa mga nahimo nga html nga mga file nga mahimo nimong i-upload sa bisan unsang barato nga pag-host ug makakuha usa ka nagtrabaho nga site.

Mahimo nimong i-install ang Hugo sa lokal ug sulayan kini:

Pagsugod sa bag-ong site:

hugo new site docs.example.org

Ug sa samang higayon ang git repository:

cd docs.example.org
git init

Sa pagkakaron, ang among site limpyo ug aron adunay usa ka butang nga makita niini, kinahanglan una namon nga magkonektar sa usa ka tema, ang usa ka tema usa lamang ka hugpong sa mga templates ug magtakda og mga lagda diin ang among site nahimo.

Ingong tema atong gamiton Pagkat-on, nga, sa akong opinyon, mao ang labing angay alang sa usa ka site nga adunay dokumentasyon.

Gusto nako nga hatagan ug espesyal nga pagtagad ang kamatuoran nga dili na kinahanglan nga i-save ang mga file sa tema sa tipiganan sa among proyekto, imbes mahimo ra naton kini makonektar gamit ang git submodule:

git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn

Sa ingon, ang mga file lamang nga direktang may kalabutan sa among proyekto ang naa sa among repository, ug ang konektado nga tema magpabilin ingon usa ka link sa usa ka piho nga repository ug usa ka commit niini, nga mao, kini kanunay nga makuha gikan sa orihinal nga gigikanan ug dili mahadlok. sa dili managsama nga mga pagbag-o.

Ayuhon nato ang config config.toml:

baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"

Naa na sa kini nga yugto, mahimo ka nga modagan:

hugo server

Ug sa adres http://localhost:1313/ susiha ang among bag-ong gibuhat nga site, ang tanan nga mga pagbag-o nga gihimo sa direktoryo awtomatikong i-update ang bukas nga panid sa browser, dali kaayo!

Atong sulayan paghimo ug ulohan nga panid sa sulod/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

Screenshot sa bag-ong nahimo nga panid

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Aron makamugna og site, pagdagan lang:

hugo

Direktoryo nga sulod publiko/ ug mahimong imong site.
Oo, pinaagi sa dalan, atong dad-on dayon ngadto sa .gignignore:

echo /public > .gitignore

Ayaw kalimti nga itugyan ang among mga pagbag-o:

git add .
git commit -m "New site created"

2. Pag-andam sa Dockerfile

Panahon na aron mahibal-an ang istruktura sa among repository. Kasagaran mogamit ako usa ka butang sama sa:

.
├── deploy
│   ├── app1
│   └── app2
└── dockerfiles
    ├── image1
    └── image2

  • dockerfiles/ - adunay mga direktoryo nga adunay mga Dockerfile ug tanan nga gikinahanglan aron matukod ang among mga imahe sa docker.
  • ipakatap/ - adunay mga direktoryo alang sa pag-deploy sa among mga aplikasyon sa Kubernetes

Sa ingon, maghimo kami sa among una nga Dockerfile sa dalan dockerfiles/website/dockerfile

FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src

FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]

Sama sa imong nakita, ang Dockerfile adunay duha GIKAN, kini nga posibilidad gitawag multi-stage nga pagtukod ug gitugotan ka nga dili iapil ang tanan nga wala kinahanglana gikan sa katapusan nga imahe sa docker.
Busa, ang kataposang hulagway maglangkob lamang ngitngithttpd (gaan nga HTTP server) ug publiko/ - ang sulod sa among statically generated nga site.

Ayaw kalimti nga itugyan ang among mga pagbag-o:

git add dockerfiles/website
git commit -m "Add Dockerfile for website"

3. Pag-ila sa kaniko

Ingon usa ka tigtukod sa mga imahe sa docker, nakahukom ako nga gamiton kani, tungod kay wala kini magkinahanglan og usa ka docker nga daemon nga magtrabaho, ug ang asembliya mismo mahimong ipatuman sa bisan unsang makina ug itago ang cache direkta sa rehistro, sa ingon makuha ang panginahanglan nga adunay usa ka bug-os nga padayon nga pagtipig.

Aron matukod ang imahe, padagana lang ang sudlanan nga adunay kaniko executor ug ipasa ang kasamtangan nga konteksto sa pagtukod niini, mahimo nimo kini sa lokal, pinaagi sa docker:

docker run -ti --rm 
  -v $PWD:/workspace 
  -v ~/.docker/config.json:/kaniko/.docker/config.json:ro 
  gcr.io/kaniko-project/executor:v0.15.0 
  --cache 
  --dockerfile=dockerfiles/website/Dockerfile 
  --destination=registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1

Diin registry.gitlab.com/kvaps/docs.example.org/website - ang ngalan sa imong docker nga imahe, pagkahuman sa pagtukod kini awtomatiko nga ilunsad sa rehistro sa docker.

Parameter --cache nagtugot kanimo sa pag-cache sa mga layer sa docker registry, alang sa gihatag nga pananglitan nga kini tipigan registry.gitlab.com/kvaps/docs.example.org/website/cache, apan mahimo nimong itakda ang lain nga agianan nga adunay parameter --cache-repo.

Screenshot sa docker-registry

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

4. Pasiuna sa qbec

Qbec usa ka himan sa pag-deploy nga nagtugot kanimo sa pagdeklarar nga ihulagway ang imong mga pagpakita sa aplikasyon ug i-deploy kini sa Kubernetes. Ang paggamit sa Jsonnet isip nag-unang syntax nagpasayon ​​kaayo sa paghulagway sa mga kalainan alang sa daghang mga palibot, ug halos hingpit usab nga nagwagtang sa pagbalik-balik sa code.

Mahimong tinuod kini ilabi na sa mga kaso diin kinahanglan nimo nga i-deploy ang usa ka aplikasyon ngadto sa daghang mga cluster nga adunay lain-laing mga parameter ug gusto nga ipahayag kini sa deklarasyon sa Git.

Gitugotan ka usab sa Qbec nga i-render ang mga tsart sa Helm pinaagi sa pagpasa kanila sa kinahanglan nga mga parameter ug dayon pag-operate niini sa parehas nga paagi sama sa mga regular nga pagpakita, lakip ang katakus nga magamit ang lainlaing mga mutasyon sa kanila, ug kini, sa baylo, nagwagtang sa panginahanglan sa paggamit sa ChartMuseum. Kana mao, mahimo nimong tipigan ug i-render ang mga tsart direkta gikan sa git, kung diin sila nahisakop.

Sama sa akong giingon kaniadto, among tipigan ang tanan nga pag-deploy sa direktoryo ipakatap/:

mkdir deploy
cd deploy

Atong sugdan ang atong unang aplikasyon:

qbec init website
cd website

Karon ang istruktura sa among aplikasyon ingon niini:

.
├── components
├── environments
│   ├── base.libsonnet
│   └── default.libsonnet
├── params.libsonnet
└── qbec.yaml

tan-awa ang file qbec.yaml:

apiVersion: qbec.io/v1alpha1
kind: App
metadata:
  name: website
spec:
  environments:
    default:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443
  vars: {}

Dinhi kita nag-una nga interesado sa spec.mga palibot, Gibuhat na sa qbec ang default nga palibot alang kanamo ug gikuha ang adres sa server ug namespace gikan sa among karon nga kubeconfig.
Karon sa dihang nag-deploy sa Default environment, ang qbec kanunay nga mag-deploy lamang sa espesipikong Kubernetes cluster ug sa espesipikong namespace, i.e. dili na nimo kinahanglan nga magbalhinbalhin tali sa mga konteksto ug namespaces aron ma-deploy.
Kung gikinahanglan, mahimo nimo kanunay nga i-update ang mga setting sa kini nga file.

Ang tanan nimong palibot gihulagway sa qbec.yaml, ug sa file params.libsonnet, nga nag-ingon kung asa nimo kinahanglan nga kuhaon ang mga parameter alang kanila.

Sunod atong makita ang duha ka mga direktoryo:

  • sangkap/ - ang tanan nga mga pagpakita alang sa among aplikasyon itago dinhi, mahimo silang ihulagway sa jsonnet ug sa mga regular nga yaml file
  • palibot/ - dinhi atong ihulagway ang tanang variables (parameters) para sa atong environment.

Sa kasagaran kami adunay duha ka mga file:

  • environment/base.libsonnet - kini maglangkob sa komon nga mga parameter alang sa tanan nga mga palibot
  • environments/default.libsonnet - Naglangkob sa mga parameter nga gibag-o alang sa kalikopan Default

abli ta environment/base.libsonnet ug idugang ang mga parameter alang sa among una nga sangkap didto:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

Himoon usab nato ang atong unang bahin component/website.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.website;

[
  {
    apiVersion: 'apps/v1',
    kind: 'Deployment',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      replicas: params.replicas,
      selector: {
        matchLabels: {
          app: params.name,
        },
      },
      template: {
        metadata: {
          labels: { app: params.name },
        },
        spec: {
          containers: [
            {
              name: 'darkhttpd',
              image: params.image,
              ports: [
                {
                  containerPort: params.containerPort,
                },
              ],
            },
          ],
          nodeSelector: params.nodeSelector,
          tolerations: params.tolerations,
          imagePullSecrets: [{ name: 'regsecret' }],
        },
      },
    },
  },
  {
    apiVersion: 'v1',
    kind: 'Service',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      selector: {
        app: params.name,
      },
      ports: [
        {
          port: params.servicePort,
          targetPort: params.containerPort,
        },
      ],
    },
  },
  {
    apiVersion: 'extensions/v1beta1',
    kind: 'Ingress',
    metadata: {
      annotations: {
        'kubernetes.io/ingress.class': params.ingressClass,
      },
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      rules: [
        {
          host: params.domain,
          http: {
            paths: [
              {
                backend: {
                  serviceName: params.name,
                  servicePort: params.servicePort,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

Niini nga file, among gihulagway ang tulo ka Kubernetes entity sa usa ka higayon, kini mao ang: deployment, nga pag-alagad и Ingress. Kung gusto, mahimo naton kini ibalhin sa lainlaing mga sangkap, apan sa kini nga yugto, ang usa igo na alang kanato.

syntax jsonnet susama kaayo sa regular nga json, sa prinsipyo, ang regular nga json usa na ka balido nga jsonnet, mao nga sa una mahimong mas sayon ​​​​alang kanimo ang paggamit sa mga serbisyo sa online sama sa yaml2json aron mabag-o ang imong naandan nga yaml sa json, o kung ang imong mga sangkap wala’y bisan unsang mga baryable, nan mahimo silang ihulagway sa porma sa regular nga yaml.

Kung nagtrabaho kauban jsonnet Gitambagan ko ikaw nga mag-install usa ka plugin alang sa imong editor

Pananglitan, adunay usa ka plugin alang sa vim vim-jsonnet, nga nagpalihok sa pag-highlight sa syntax ug awtomatiko nga gipatuman jsonnet fmt sa matag save (nagkinahanglan og jsonnet nga ma-install).

Andam na ang tanan, karon makasugod na kami sa pag-deploy:

Aron makita kung unsa ang among nakuha, padaganon ta:

qbec show default

Sa output, imong makita ang gihubad nga yaml manifests nga magamit sa default cluster.

Maayo, karon pag-apply:

qbec apply default

Sa output makita nimo kanunay kung unsa ang buhaton sa imong cluster, hangyoon ka sa qbec nga dawaton ang mga pagbag-o pinaagi sa pag-type y makumpirma nimo ang imong mga intensyon.

Tapos na karon ang among app na-deploy na!

Kung gihimo ang mga pagbag-o, mahimo ka kanunay nga modagan:

qbec diff default

aron makita kung giunsa kini nga mga pagbag-o makaapekto sa karon nga pag-deploy

Ayaw kalimti nga itugyan ang among mga pagbag-o:

cd ../..
git add deploy/website
git commit -m "Add deploy for website"

5. Sulayi ang Gitlab-runner sa Kubernetes-executor

Until bag-o lang, regular ra akong gigamit gitlab-runner sa usa ka pre-prepared machine (LXC container) nga adunay shell- o docker-executor. Sa sinugdan, kami adunay pipila niini nga mga runner sa tibuok kalibutan nga gihubit sa among gitlab. Naghimo sila og mga imahe sa docker alang sa tanan nga mga proyekto.

Apan sama sa gipakita sa praktis, kini nga kapilian dili ang labing sulundon, sa mga termino sa pagkapraktikal ug sa mga termino sa seguridad. Mas maayo ug husto sa ideolohiya nga adunay bulag nga mga runner nga ipakatap para sa matag proyekto, ug bisan sa matag palibot.

Maayo na lang, kini dili usa ka problema, tungod kay karon kami mag-deploy gitlab-runner direkta isip kabahin sa among proyekto diha mismo sa Kubernetes.

Naghatag ang Gitlab og andam na nga tsart sa timon alang sa pag-deploy sa gitlab-runner sa Kubernetes. Busa ang kinahanglan nimong masayran mao timaan sa pagparehistro para sa among proyekto sa Mga Setting -> CI / CD -> Mga Runner ug ipasa kini sa timon:

helm repo add gitlab https://charts.gitlab.io

helm install gitlab-runner 
  --set gitlabUrl=https://gitlab.com 
  --set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc 
  --set rbac.create=true 
  gitlab/gitlab-runner

Asa:

  • https://gitlab.com mao ang adres sa imong Gitlab server.
  • yga8y-jdCusVDn_t4Wxc - token sa pagparehistro alang sa imong proyekto.
  • rbac.create=tinuod - naghatag sa runner sa gikinahanglan nga gidaghanon sa mga pribilehiyo aron makahimo og mga pod aron mahimo ang among mga buluhaton gamit ang kubernetes-executor.

Kung ang tanan nahimo sa husto, kinahanglan nimo nga makita ang narehistro nga runner sa seksyon Mga runner, sa imong mga setting sa proyekto.

Screenshot sa gidugang nga runner

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Simple ra ba kana? - oo, yano ra kana! Wala nay hasol sa manual nga pagrehistro sa mga runners, gikan karon ang mga runners mabuhat ug awtomatikong malaglag.

6. I-deploy ang mga tsart sa Helm sa QBEC

Since naka decide mi nga mag consider gitlab-runner bahin sa among proyekto, panahon na nga ihulagway kini sa among Git repository.

Mahimo natong ihulagway kini isip usa ka bulag nga sangkap website, apan sa umaabot nagplano kami nga mag-deploy ug lain-laing mga kopya website sa kasagaran, dili sama gitlab-runner, nga i-deploy kausa lang matag Kubernetes cluster. Busa atong sugdan ang usa ka bulag nga aplikasyon alang niini:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

Niining higayona dili namo ihulagway nga mano-mano ang mga entidad sa Kubernetes, apan magkuha ug andam na nga tsart sa Helm. Usa sa mga benepisyo sa qbec mao ang abilidad sa paghubad sa mga tsart sa Helm direkta gikan sa usa ka Git repository.

Himoon nato kini gamit ang git submodule:

git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner

Karon ang direktoryo vendor/gitlab-runner naglangkob sa among repository nga adunay tsart alang sa gitlab-runner.

Ang ubang mga repository mahimong konektado sa parehas nga paagi, pananglitan, ang tibuuk nga repository nga adunay opisyal nga mga tsart https://github.com/helm/charts

Atong ihulagway ang component component/gitlab-runner.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.gitlabRunner;

std.native('expandHelmTemplate')(
  '../vendor/gitlab-runner',
  params.values,
  {
    nameTemplate: params.name,
    namespace: env.namespace,
    thisFile: std.thisFile,
    verbose: true,
  }
)

Ang unang argumento sa expandHelmTemplate kita moagi sa dalan ngadto sa tsart, unya params.values, nga atong gikuha gikan sa mga parameter sa palibot, unya moabut ang butang nga adunay

  • ngalanTemplate - ngalan sa pagpagawas
  • namespace - namespace gipasa sa timon
  • kini nga File - usa ka gikinahanglan nga parameter nga moagi sa agianan sa kasamtangan nga file
  • sinultihan - nagpakita sa sugo template sa timon uban sa tanan nga mga argumento sa paghubad sa usa ka tsart

Karon atong ihulagway ang mga parameter alang sa atong component sa environment/base.libsonnet:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
      },
    },
  },
}

Pagtagad runnerRegistrationToken gikuha namo gikan sa external file sekreto/base.libsonnet, buhata nato kini:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

Atong susihon kung ang tanan nagtrabaho:

qbec show default

kung maayo na ang tanan, mahimo namong tangtangon ang among nauna nga gipakatap pinaagi sa pagpagawas sa Helm:

helm uninstall gitlab-runner

ug i-deploy kini, apan pinaagi sa qbec:

qbec apply default

7. Pasiuna sa git-crypt

git-crypt usa ka himan nga nagtugot kanimo sa pag-set up sa transparent encryption alang sa imong repository.

Sa pagkakaron, ang among istruktura sa direktoryo alang sa gitlab-runner ingon niini:

.
├── components
│   ├── gitlab-runner.jsonnet
├── environments
│   ├── base.libsonnet
│   └── default.libsonnet
├── params.libsonnet
├── qbec.yaml
├── secrets
│   └── base.libsonnet
└── vendor
    └── gitlab-runner (submodule)

Apan ang pagtipig sa mga sekreto sa Git dili luwas, dili ba? Mao nga kinahanglan naton nga i-encrypt sila sa husto.

Kasagaran alang sa usa ka variable dili kini kanunay nga makatarunganon. Mahimo nimong ibalhin ang mga sekreto sa qbec ug pinaagi sa environment variables sa imong CI system.
Apan angay nga hinumdoman nga adunay usab labi ka komplikado nga mga proyekto nga mahimo’g adunay daghang mga sekreto, labi ka lisud nga ipasa kini tanan pinaagi sa mga variable sa palibot.

Dugang pa, sa kini nga kaso, dili ako makasulti kanimo bahin sa usa ka talagsaon nga himan sama sa git-crypt.

git-crypt Kombenyente usab kini tungod kay gitugotan ka nga i-save ang tibuuk nga kasaysayan sa mga sekreto, ingon man pagtandi, paghiusa ug pagsulbad sa mga panagbangi sa parehas nga paagi sama sa among gibuhat kaniadto sa kaso sa Git.

Ang unang butang human sa pag-instalar git-crypt kinahanglan namon nga makamugna og mga yawe alang sa among repository:

git crypt init

Kung ikaw adunay PGP nga yawe, mahimo nimo dayon nga idugang ang imong kaugalingon ingon usa ka kolaborator alang niini nga proyekto:

git-crypt add-gpg-user [email protected]

Niining paagiha mahimo nimong ma-decrypt kini nga repository gamit ang imong pribadong yawe.

Kung wala kay PGP nga yawe ug wala gipaabut, nan mahimo kang moadto sa laing paagi ug i-export ang yawe sa proyekto:

git crypt export-key /path/to/keyfile

Busa, bisan kinsa nga adunay usa ka exported keyfile makahimo sa pag-decrypt sa imong repository.

Panahon na aron ipahimutang ang among una nga sekreto.
Pahinumdum ko nimo nga naa pa ta sa direktoryo deploy/gitlab-runner/diin kami adunay usa ka direktoryo mga sekreto/, atong i-encrypt ang tanan nga mga file niini, alang niini maghimo kita og file sekreto/.gitattributes nga adunay sulod nga sama niini:

* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff

Ingon sa makita gikan sa sulod, ang tanan nga mga file pinaagi sa maskara * modagan sa git-crypt, gawas sa mga .gitattributes

Masusi nato kini pinaagi sa pagdagan:

git crypt status -e

Sa output, nakakuha kami usa ka lista sa tanan nga mga file sa repository diin ang pag-encrypt gipagana

Mao na, karon luwas na natong mabuhat ang atong mga kausaban:

cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"

Aron mapugngan ang repository, igo na nga ipatuman:

git crypt lock

ug diha-diha dayon ang tanan nga na-encrypt nga mga file mahimong usa ka binary nga butang, imposible nga mabasa kini.
Aron ma-decrypt ang repository, pagdagan:

git crypt unlock

8. Paghimo og hulagway sa toolbox

Ang imahe sa toolbox usa ka imahe nga adunay tanan nga mga himan nga among gamiton sa pag-deploy sa among proyekto. Kini gamiton sa gitlab runner sa paghimo sa kasagaran nga mga buluhaton sa pag-deploy.

Ang tanan yano dinhi, naghimo kami usa ka bag-o dockerfiles/toolbox/Dockerfile nga adunay sulod nga sama niini:

FROM alpine:3.11

RUN apk add --no-cache git git-crypt

RUN QBEC_VER=0.10.3 
 && wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz 
     | tar -C /tmp -xzf - 
 && mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/

RUN KUBECTL_VER=1.17.0 
 && wget -O /usr/local/bin/kubectl 
      https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl 
 && chmod +x /usr/local/bin/kubectl

RUN HELM_VER=3.0.2 
 && wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz 
     | tar -C /tmp -zxf - 
 && mv /tmp/linux-amd64/helm /usr/local/bin/helm

Sama sa imong nakita, sa kini nga imahe gi-install namon ang tanan nga mga utilities nga among gigamit sa pag-deploy sa among aplikasyon. Wala kami magkinahanglan dinhi gawas kung kubectl, pero basin gusto nimong magdula-dula niini sa dihang mag-set up sa pipeline.

Usab, aron makahimo sa pagpakigsulti sa mga Kubernetes ug pag-deploy niini, kinahanglan namon nga magbutang usa ka papel alang sa mga pod nga gihimo sa gitlab-runner.

Aron mahimo kini, adto sa direktoryo nga adunay gitlab-runner'om:

cd deploy/gitlab-runner

ug pagdugang usa ka bag-ong sangkap component/rbac.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;

[
  {
    apiVersion: 'v1',
    kind: 'ServiceAccount',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'Role',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    rules: [
      {
        apiGroups: [
          '*',
        ],
        resources: [
          '*',
        ],
        verbs: [
          '*',
        ],
      },
    ],
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'RoleBinding',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    roleRef: {
      apiGroup: 'rbac.authorization.k8s.io',
      kind: 'Role',
      name: params.name,
    },
    subjects: [
      {
        kind: 'ServiceAccount',
        name: params.name,
        namespace: env.namespace,
      },
    ],
  },
]

Gihubit usab namon ang bag-ong mga parameter sa environment/base.libsonnet, nga karon tan-awon sama niini:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
        runners: {
          serviceAccountName: $.components.rbac.name,
          image: 'registry.gitlab.com/kvaps/docs.example.org/toolbox:v0.0.1',
        },
      },
    },
    rbac: {
      name: 'gitlab-runner-deploy',
    },
  },
}

Pagtagad $.components.rbac.name nagtumong sa ngalan alang sa component rbac

Atong susihon kon unsay nausab:

qbec diff default

ug ipadapat ang among mga kausaban sa Kubernetes:

qbec apply default

Usab, ayaw kalimti nga itugyan ang among mga pagbag-o sa git:

cd ../..
git add dockerfiles/toolbox
git commit -m "Add Dockerfile for toolbox"
git add deploy/gitlab-runner
git commit -m "Configure gitlab-runner to use toolbox"

9. Ang among unang pipeline ug asembliya sa mga hulagway pinaagi sa mga tag

Sa ugat sa proyekto nga atong himoon .gitlab-ci.yml nga adunay sulod nga sama niini:

.build_docker_image:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug-v0.15.0
    entrypoint: [""]
  before_script:
    - echo "{"auths":{"$CI_REGISTRY":{"username":"$CI_REGISTRY_USER","password":"$CI_REGISTRY_PASSWORD"}}}" > /kaniko/.docker/config.json

build_toolbox:
  extends: .build_docker_image
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR/dockerfiles/toolbox --dockerfile $CI_PROJECT_DIR/dockerfiles/toolbox/Dockerfile --destination $CI_REGISTRY_IMAGE/toolbox:$CI_COMMIT_TAG
  only:
    refs:
      - tags

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_TAG
  only:
    refs:
      - tags

Palihug timan-i nga among gigamit GIT_SUBMODULE_STRATEGY: normal alang sa mga trabaho diin kinahanglan nimo nga klaro nga magsugod ang mga submodules sa wala pa ipatuman.

Ayaw kalimti nga itugyan ang among mga pagbag-o:

git add .gitlab-ci.yml
git commit -m "Automate docker build"

Sa akong hunahuna mahimo nimo kini luwas nga matawag nga usa ka bersyon v0.0.1 ug pagdugang usa ka tag:

git tag v0.0.1

Magbitay kami og mga tag bisan kanus-a kinahanglan namon nga buhian ang usa ka bag-ong bersyon. Ang mga tag sa mga imahe sa Docker ma-mapa sa mga tag sa Git. Ang matag pagduso sa usa ka bag-ong tag mag-initialize sa usa ka imahen nga pagtukod sa kana nga tag.

Buhaton nato kini git push --tags, ug tan-awa ang among unang pipeline:

Screenshot sa unang pipeline

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Angayan nga itudlo nga ang tag-based nga mga pagtukod maayo alang sa pagtukod sa mga imahe sa docker, apan dili alang sa pag-deploy sa usa ka aplikasyon sa Kubernetes. Tungod kay ang mga bag-ong tag mahimo usab nga ma-assign sa daan nga mga commit, sa kini nga kaso, ang pagsugod sa pipeline alang kanila modala sa pag-deploy sa daan nga bersyon.

Aron masulbad kini nga problema, ang paghimo sa mga imahe sa docker sagad nga gihigot sa mga tag, ug ang pag-deploy sa aplikasyon sa sanga. agalon, diin ang mga bersyon sa nakolekta nga mga imahe gi-hardcode. Niini nga kaso nga mahimo nimong sugdan ang rollback sa usa ka yano nga pagbalik agalon-mga sanga.

10. I-deploy ang automation

Aron ma-decrypt sa Gitlab-runner ang atong mga sekreto, kinahanglan natong i-export ang repository key ug idugang kini sa atong CI environment variables:

git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo

atong i-save ang resulta nga string sa Gitlab, alang niini kita moadto sa mga setting sa atong proyekto:
Mga setting -> CI / CD -> Mga Variable

Ug paghimo usa ka bag-ong variable:

Type
Key
bili
protected
masked
kasangkaran

File
GITCRYPT_KEY
<your string>
true (sa panahon sa pagbansay, mahimo nimo false)
true
All environments

Screenshot sa gidugang nga variable

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Karon atong i-update ang atong .gitlab-ci.yml pagdugang niini:

.deploy_qbec_app:
  stage: deploy
  only:
    refs:
      - master

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes

deploy_website:
  extends: .deploy_qbec_app
  script:
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes

Dinhi among gipalihok ang pipila ka bag-ong mga kapilian para sa qbec:

  • --gamut sa pipila/app - nagtugot kanimo sa paghubit sa direktoryo sa usa ka piho nga aplikasyon
  • --force:k8s-context __incluster__ - kini usa ka magic variable nga nag-ingon nga ang pag-deploy mahitabo sa parehas nga cluster diin ang gtilab-runner nagdagan. Kini mao ang gikinahanglan, kon dili qbec mosulay sa pagpangita sa usa ka angay nga Kubernetes server sa imong kubeconfig
  • -hulat - nagpugos sa qbec nga maghulat hangtod ang mga kahinguhaan nga nahimo niini moadto sa kahimtang nga Andam ug pagkahuman makompleto sa usa ka malampuson nga exit-code.
  • -oo - gi-disable lang ang interactive nga kabhang Naa ba ka? atol sa deployment.

Ayaw kalimti nga itugyan ang among mga pagbag-o:

git add .gitlab-ci.yml
git commit -m "Automate deploy"

Ug pagkahuman gitusok atong tan-awon kon sa unsang paagi ang atong mga aplikasyon gipakatap:

Screenshot sa ikaduhang pipeline

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

11. Artifacts ug asembliya sa diha nga pagduso sa master

Kasagaran, ang mga lakang sa ibabaw igo na sa paghimo ug paghatud sa halos bisan unsang microservice, apan dili kami gusto nga magdugang usa ka tag matag higayon nga kinahanglan namon nga i-update ang site. Busa, moadto kami sa mas dinamikong paagi ug mag-set up og digest deployment sa master branch.

Ang ideya yano ra: karon ang imahe sa among website pagatukuron pag-usab sa matag higayon nga ikaw moduso sa agalon, ug dayon awtomatikong i-deploy sa Kubernetes.

Atong i-update kining duha ka trabaho sa atong .gitlab-ci.yml:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/
  only:
    refs:
      - master
      - tags

deploy_website:
  extends: .deploy_qbec_app
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

Palihug timan-i nga kami midugang og usa ka sanga agalon к refs alang sa trabaho build_website ug atong gigamit karon $CI_COMMIT_REF_NAME imbis nga $CI_COMMIT_TAG, kana mao, gitangtang namo ang mga tag sa Git ug karon among iduso ang imahe nga adunay ngalan sa commit branch nga nag-initialize sa imong pipeline. Angay nga hinumdoman nga kini magamit usab sa mga tag, nga magtugot kanamo sa pagtipig sa mga snapshot sa site nga adunay usa ka piho nga bersyon sa docker-registry.

Kung ang ngalan sa tag sa docker alang sa bag-ong bersyon sa site mahimong dili mabag-o, kinahanglan pa namon nga ihulagway ang mga pagbag-o alang sa Kubernetes, kung dili kini dili na i-redeploy ang aplikasyon gikan sa bag-ong imahe, tungod kay dili kini makamatikod sa bisan unsang mga pagbag-o sa pagpakita sa deployment.

Kapilian --vm:ext-str digest="$DIGEST" alang sa qbec - nagtugot kanimo sa pagpasa sa usa ka eksternal nga variable sa jsonnet. Gusto namon nga ang among aplikasyon ma-redeploy sa cluster sa matag pagpagawas. Dili na namo magamit ang ngalan sa tag, nga dili na mausab, tungod kay kinahanglan namong ibugkos ang usa ka piho nga bersyon sa imahe ug i-trigger ang pag-deploy kung kini mausab.

Dinhi, ang abilidad ni Kaniko sa pag-save sa digest sa imahe sa usa ka file makatabang kanamo (opsyon --digest-file)
Dayon among ibalhin kini nga file ug basahon kini sa panahon sa pag-deploy.

Atong i-update ang mga parameter para sa atong deploy/website/environments/base.libsonnet nga karon tan-awon sama niini:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

Tapos na, karon bisan unsang commit in agalon nag-initialize sa pagtukod sa docker nga imahe alang sa website, ug dayon i-deploy kini sa Kubernetes.

Ayaw kalimti nga itugyan ang among mga pagbag-o:

git add .
git commit -m "Configure dynamic build"

Susiha kini pagkahuman gitusok kinahanglan natong makita ang usa ka butang nga sama niini:

Screenshot sa pipeline alang sa master

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Sa prinsipyo, dili kinahanglan nga i-redeploy ang gitlab-runner sa matag pagduso, gawas kung, siyempre, wala’y nabag-o sa pag-configure niini, ayohon naton kini sa .gitlab-ci.yml:

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes
  only:
    changes:
      - deploy/gitlab-runner/**/*

mga kausaban magsubay sa mga pagbag-o sa deploy/gitlab-runner/ ug mag-trigger lang sa among trabaho kung naa

Ayaw kalimti nga itugyan ang among mga pagbag-o:

git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"

gitusok, mas maayo:

Screenshot sa updated nga pipeline

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

12. Dinamikong palibot

Panahon na sa pag-diversify sa among pipeline gamit ang dinamikong palibot.

Una, atong i-update ang trabaho build_website sa among .gitlab-ci.yml, kuhaa ang block gikan niini lamang, nga magpugos sa Gitlab sa pag-trigger niini sa bisan unsang commit sa bisan unsang sanga:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/

Dayon i-update ang trabaho deploy_website, dugangi ug block didto palibot:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

Kini magtugot sa Gitlab nga i-associate ang trabaho sa prod palibot ug ipakita ang husto nga link niini.

Karon magdugang ta ug duha pa ka trabaho:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

deploy_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
    on_stop: stop_review
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  only:
    refs:
    - branches
  except:
    refs:
      - master

stop_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    action: stop
  stage: deploy
  before_script:
    - git clone "$CI_REPOSITORY_URL" master
    - cd master
  script:
    - qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  variables:
    GIT_STRATEGY: none
  only:
    refs:
    - branches
  except:
    refs:
      - master
  when: manual

Ma-trigger sila pinaagi sa pagduso sa bisan unsang mga sanga gawas sa master ug mag-deploy sa usa ka preview nga bersyon sa site.

Nakakita mig bag-ong opsyon para sa qbec: --app-tag - kini nagtugot kanimo sa pag-tag sa gipakatap nga mga bersyon sa aplikasyon ug sa pagtrabaho lamang sulod niini nga tag; sa diha nga paghimo ug pagguba sa mga kapanguhaan sa Kubernetes, ang qbec molihok lamang niini.
Sa ingon, dili kami makahimo og usa ka bulag nga palibot alang sa matag pagrepaso, apan gamiton lang pag-usab ang parehas.

Dinhi usab kami naggamit qbec apply review, imbes nga qbec i-apply ang default - mao gyud ni ang higayon nga atong sulayan nga ihulagway ang mga kalainan sa atong palibot (pagsusi ug default):

Pagdugang review palibot sa deploy/website/qbec.yaml

spec:
  environments:
    review:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443

Dayon among ipahayag kini deploy/website/params.libsonnet:

local env = std.extVar('qbec.io/env');
local paramsMap = {
  _: import './environments/base.libsonnet',
  default: import './environments/default.libsonnet',
  review: import './environments/review.libsonnet',
};

if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile

Ug isulat ang naandan nga mga parameter alang niini sa deploy/website/environments/review.libsonnet:

// this file has the param overrides for the default environment
local base = import './base.libsonnet';
local slug = std.extVar('qbec.io/tag');
local subdomain = std.extVar('subdomain');

base {
  components+: {
    website+: {
      name: 'example-docs-' + slug,
      domain: subdomain + '.docs.example.org',
    },
  },
}

Atong tan-awon usab pag-ayo ang trabaho stop_review, kini ma-trigger kung ang sanga gikuha ug aron ang gitlab dili mosulay sa pag-checkout niini gigamit GIT_STRATEGY: wala, sa ulahi among gi-clone agalon-branch ug delete review pinaagi niini.
Medyo makalibog, pero wala pa ko makakitag mas nindot nga paagi.
Usa ka alternatibo nga kapilian mao ang pag-deploy sa matag review sa usa ka namespace sa hotel, nga kanunay nga maguba sa kinatibuk-an.

Ayaw kalimti nga itugyan ang among mga pagbag-o:

git add .
git commit -m "Enable automatic review"

gitusok, git checkout -b pagsulay, git push origin test, susiha:

Screenshot sa gibuhat nga palibot sa Gitlab

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Ang tanan nagtrabaho? - maayo, tangtangon ang among sanga sa pagsulay: git checkout master, git push gigikanan:test, among gisusi nga ang mga trabaho alang sa pagtangtang sa palibot nagtrabaho nga walay mga sayup.

Dinhi gusto nako nga klarohon nga bisan kinsa nga developer sa proyekto makahimo og mga sanga, mahimo usab niya nga usbon .gitlab-ci.yml file ug pag-access sa sekreto nga mga variable.
Busa, kusganon nga girekomenda nga tugutan ang ilang paggamit alang lamang sa mga protektadong sanga, pananglitan sa agalon, o paghimo og lahi nga set sa mga variable para sa matag palibot.

13 Pagrepaso sa mga Aplikasyon

Repasuha ang mga Aplikasyon kini usa ka bahin sa gitlab nga nagtugot kanimo sa pagdugang usa ka buton alang sa matag file sa repository aron dali nga makita kini sa gipakatap nga palibot.

Aron makita kini nga mga buton, kinahanglan nimo nga maghimo usa ka file .gitlab/route-map.yml ug ihulagway niini ang tanan nga mga pagbag-o sa mga agianan, sa among kaso kini yano ra kaayo:

# Indices
- source: /content/(.+?)_index.(md|html)/ 
  public: '1'

# Pages
- source: /content/(.+?).(md|html)/ 
  public: '1/'

Ayaw kalimti nga itugyan ang among mga pagbag-o:

git add .gitlab/
git commit -m "Enable review apps"

gitusok, ug check:

Screenshot sa Review App Button

Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Nahuman na ang trabaho!

Mga tinubdan sa proyekto:

Salamat sa imong pagtagad, hinaut nga nagustohan nimo kini Pagsulay sa bag-ong mga himan alang sa pagtukod ug pag-automate sa pag-deploy sa Kubernetes

Source: www.habr.com

Idugang sa usa ka comment