ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

سلام! تازي طور تي، ڊاکر تصويرون ٺاهڻ ۽ ڪبرنيٽس تي تعیناتي لاءِ ٻنهي جا ڪيترائي سٺا آٽوميشن اوزار جاري ڪيا ويا آهن. ان سلسلي ۾، مون فيصلو ڪيو GitLab سان گڏ راند ڪرڻ، مڪمل طور تي ان جي صلاحيتن جو مطالعو ۽، يقينا، پائپ لائن قائم ڪريو.

هي ڪم ويب سائيٽ طرفان متاثر ڪيو ويو kubernetes.io، جنهن مان ٺهيل آهي ذريعو ڪوڊ خودڪار طور تي، ۽ هر تلاء جي درخواست لاء موڪليو ويو، روبوٽ خودڪار طريقي سان سائيٽ جو هڪ ڏيک نسخو ٺاهي ٿو توهان جي تبديلين سان ۽ ڏسڻ لاء هڪ لنڪ مهيا ڪري ٿو.

مون ڪوشش ڪئي ته ساڳي عمل کي شروع کان، پر مڪمل طور تي Gitlab CI ۽ مفت اوزار تي ٺهيل آهي جيڪي آئون ڪبرنيٽس تي ايپليڪيشنن کي ترتيب ڏيڻ لاء استعمال ڪرڻ لاء استعمال ڪيا ويا آهن. اڄ مان آخر ۾ توهان کي انهن بابت وڌيڪ ٻڌائيندس.

مضمون بحث ڪندو اوزار جهڙوڪ:
هونگو, qbec, ڪنيڪو, git-crypt и گٽ لاب سي متحرڪ ماحول جي پيدائش سان.

مواد

  1. هوگو سان ملو
  2. Dockerfile تيار ڪرڻ
  3. ڪنيڪا کي سڃاڻڻ
  4. qbec کي ڄاڻڻ
  5. ڪوشش ڪري رهيو آهي Gitlab-رنر سان Kubernetes-executor
  6. qbec سان هيلم چارٽ ترتيب ڏيڻ
  7. Git-crypt متعارف ڪرايو
  8. ٽول باڪس جي تصوير ٺاهڻ
  9. اسان جي پهرين پائپ لائن ۽ تصويرن جي اسيمبلي ٽيگ ذريعي
  10. لڳائڻ جي خودڪار
  11. آرٽيڪل ۽ اسيمبلي جڏهن ماسٽر ڏانهن ڌڪڻ
  12. متحرڪ ماحول
  13. ائپس جو جائزو وٺو

1. هوگو کي ڄاڻڻ

اسان جي پروجيڪٽ جي مثال طور، اسان ڪوشش ڪنداسين ته هوگو تي ٺهيل دستاويزي پبلشنگ سائيٽ ٺاهي. هوگو هڪ جامد مواد جنريٽر آهي.

انهن لاءِ جيڪي جامد جنريٽر کان واقف نه آهن، مان توهان کي انهن بابت ٿورو وڌيڪ ٻڌائيندس. هڪ ڊيٽابيس ۽ ڪجهه پي ايڇ پي سان روايتي ويب سائيٽ انجڻ جي برعڪس، جيڪي، جڏهن صارف طرفان درخواست ڪئي وئي، اڏام تي صفحا ٺاهي، جامد جنريٽر ٿورو مختلف طرح سان ٺهيل آهن. اهي توهان کي ذريعا وٺڻ جي اجازت ڏين ٿا، عام طور تي مارڪ ڊائون مارڪ اپ ۽ موضوع ٽيمپليٽ ۾ فائلن جو هڪ سيٽ، پوء انهن کي مڪمل طور تي مڪمل ويب سائيٽ ۾ گڏ ڪريو.

اهو آهي، نتيجي طور، توهان هڪ ڊاريڪٽري جي جوڙجڪ ۽ ٺاهيل HTML فائلن جو هڪ سيٽ حاصل ڪندا، جنهن کي توهان آساني سان ڪنهن به سستي هوسٽنگ تي اپلوڊ ڪري سگهو ٿا ۽ هڪ ڪم ڪندڙ ويب سائيٽ حاصل ڪري سگهو ٿا.

توھان ھلوگو کي مقامي طور تي انسٽال ڪري سگھو ٿا ۽ ان کي آزمائي سگھو ٿا:

نئين سائيٽ جي شروعات:

hugo new site docs.example.org

۽ ساڳئي وقت git مخزن:

cd docs.example.org
git init

هينئر تائين، اسان جي سائيٽ پراڻي آهي ۽ ان تي ڪجهه ظاهر ٿيڻ لاءِ، اسان کي پهريان هڪ موضوع کي ڳنڍڻ جي ضرورت آهي؛ هڪ موضوع صرف ٽيمپليٽس جو هڪ سيٽ آهي ۽ مخصوص ضابطا جنهن جي ذريعي اسان جي سائيٽ ٺاهي وئي آهي.

موضوع لاءِ اسان استعمال ڪنداسين سکو, которая, на мой взгляд, как нельзя лучше подходит для сайта с документацией.

مان هن حقيقت تي خاص ڌيان ڏيڻ چاهيان ٿو ته اسان کي پنهنجي پروجيڪٽ جي مخزن ۾ موضوع فائلن کي محفوظ ڪرڻ جي ضرورت ناهي؛ ان جي بدران، اسان صرف ان کي استعمال ڪندي ڳنڍي سگهون ٿا. git submodule:

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

اهڙيء طرح، اسان جي مخزن ۾ صرف فائلون هونديون جيڪي سڌو سنئون اسان جي پروجيڪٽ سان لاڳاپيل آهن، ۽ ڳنڍيل موضوع هڪ مخصوص مخزن جي ڪڙي جي طور تي رهندو ۽ ان ۾ هڪ ڪمٽ، اهو آهي، اهو هميشه اصل ماخذ کان ڇڪي سگهجي ٿو ۽ نه ڊڄي. غير مطابقت واريون تبديليون.

اچو ته ترتيب کي درست ڪريو config.toml:

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

اڳ ۾ ئي هن اسٽيج تي توهان هلائي سگهو ٿا:

hugo server

И по адресу http://localhost:1313/ اسان جي نئين ٺاهيل ويب سائيٽ چيڪ ڪريو، ڊاريڪٽري ۾ ڪيل سڀ تبديليون خودڪار طور تي برائوزر ۾ کليل صفحي کي اپڊيٽ ڪريو، تمام آسان!

اچو ته هڪ ڍڪ پيج ٺاهڻ جي ڪوشش ڪريون content/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

نئين ٺاهيل صفحي جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

سائيٽ ٺاهڻ لاءِ، بس ھلايو:

hugo

ڊائريڪٽري جو مواد عوامي / ۽ توهان جي ويب سائيٽ هوندي.
ها، رستي جي ذريعي، اچو ته فوري طور تي ان کي شامل ڪريو .جيتگينور:

echo /public > .gitignore

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

2. Dockerfile تيار ڪرڻ

اهو اسان جي مخزن جي جوڙجڪ کي بيان ڪرڻ جو وقت آهي. مان عام طور تي ڪجھ استعمال ڪريان ٿو جهڙوڪ:

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

  • dockerfiles/ - ڊاڪر فائلن سان گڏ ڊاريڪٽريون ۽ اسان جي ڊاڪر تصويرون ٺاهڻ لاءِ ضروري شيون شامل آهن.
  • مقرر/ - ڪبرنيٽس تي اسان جي ايپليڪيشنن کي ترتيب ڏيڻ لاءِ ڊائريڪٽريون شامل آهن

اهڙيء طرح، اسان رستي ۾ اسان جي پهرين Dockerfile ٺاهي ويندي dockerfiles / ويب سائيٽ / 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" ]

جئين توهان ڏسي سگهو ٿا، Dockerfile ٻن تي مشتمل آهي کان، هن خاصيت کي سڏيو ويندو آهي گھڻ-اسٽيج تعمير ۽ توهان کي اجازت ڏئي ٿو ته هر شيءِ کي خارج ڪرڻ جي غير ضروري فائنل ڊاکر تصوير مان.
اهڙيء طرح، آخري تصوير صرف تي مشتمل هوندي ڳاڙهوhttpd (هلڪو وزن HTTP سرور) ۽ عوامي / - اسان جي جامد طور تي ٺاهيل ويب سائيٽ جو مواد.

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

3. ڪنيڪو ڄاڻڻ

هڪ ڊاکر تصوير بلڊر جي طور تي، مون استعمال ڪرڻ جو فيصلو ڪيو ڪنيڪو، ڇاڪاڻ ته ان جي آپريشن کي ڊاکر ڊيمن جي ضرورت ناهي، ۽ تعمير پاڻ کي ڪنهن به مشين تي ڪري سگهجي ٿو ۽ ڪيش سڌو سنئون رجسٽري ۾ ذخيرو ٿي سگهي ٿو، ان ڪري مڪمل طور تي مسلسل اسٽوريج جي ضرورت کي ختم ڪري ٿو.

تصوير ٺاهڻ لاء، صرف ڪنٽينر کي هلائڻ سان ڪنيڪو عملدار ۽ ان کي موجوده تعمير جي حوالي سان پاس ڪريو؛ اهو پڻ مقامي طور تي ڪري سگهجي ٿو، ڊڪر ذريعي:

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

ڪٿي registry.gitlab.com/kvaps/docs.example.org/website - توهان جي ڊاکر تصوير جو نالو؛ تعمير ڪرڻ کان پوء، اهو خودڪار طور تي ڊاکر رجسٽري ۾ شروع ڪيو ويندو.

نيم --ڪيش توهان کي اجازت ڏئي ٿو ته ڪيش تہن کي ڊاکر رجسٽري ۾؛ مثال طور ڏنل، اهي محفوظ ڪيا ويندا registry.gitlab.com/kvaps/docs.example.org/website/cache، پر توھان وضاحت ڪري سگھو ٿا ھڪڙو ٻيو رستو پيٽرول استعمال ڪندي —cache-repo.

ڊاڪر-رجسٽري جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

4. qbec ڄاڻڻ

ڪي بي سي هڪ ڊيپلائيمينٽ ٽول آهي جيڪو توهان کي اجازت ڏئي ٿو ته توهان جي ايپليڪيشن جي منشور کي واضح طور تي بيان ڪري ۽ انهن کي ڪبرنيٽس تي ترتيب ڏيو. Jsonnet کي بنيادي نحو جي طور تي استعمال ڪرڻ توهان کي اجازت ڏئي ٿو ته مختلف ماحولن ۾ اختلافن جي وضاحت کي تمام گهڻو آسان بڻائي، ۽ پڻ تقريبن مڪمل طور تي ڪوڊ جي ورهاڱي کي ختم ڪري ٿو.

اهو خاص طور تي انهن ڪيسن ۾ صحيح ٿي سگهي ٿو جتي توهان کي ايپليڪيشن کي ترتيب ڏيڻ جي ضرورت آهي ڪيترن ئي ڪلسٽرن سان مختلف پيٽرولن سان ۽ انهن کي Git ۾ واضح طور تي بيان ڪرڻ چاهيندا.

Qbec پڻ توهان کي اجازت ڏئي ٿو ته هيلم چارٽ کي ترتيب ڏيڻ جي ذريعي انهن کي ضروري پيرا ميٽرز پاس ڪندي ۽ پوءِ انهن کي باقاعده منشور وانگر هلائڻ جي اجازت ڏئي ٿو، جنهن ۾ توهان انهن تي مختلف ميوٽيشنز لاڳو ڪري سگهو ٿا، ۽ اهو، موڙ ۾، توهان کي اجازت ڏئي ٿو ته توهان کي ضرورت کان نجات حاصل ڪرڻ جي ضرورت آهي. چارٽ ميوزيم استعمال ڪريو. اھو آھي، توھان ذخيرو ڪري سگھو ٿا چارٽ سڌو سنئون گٽ مان، جتي اھي آھن.

جيئن مون اڳ ۾ چيو آهي، اسان ڊاريڪٽري ۾ سڀئي ترتيبون ذخيرو ڪنداسين مقرر/:

mkdir deploy
cd deploy

اچو ته اسان جي پهرين ايپليڪيشن کي شروع ڪريون:

qbec init website
cd website

هاڻي اسان جي ايپليڪيشن جي جوڙجڪ هن طرح ڏسڻ ۾ اچي ٿي:

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

اچو ته فائل کي ڏسو qbec.yaml:

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

هتي اسان کي بنيادي طور تي دلچسپي آهي spec.environments, qbec اڳ ۾ ئي اسان لاء هڪ ڊفالٽ ماحول پيدا ڪيو آهي ۽ سرور ايڊريس ورتو آهي، انهي سان گڏ اسان جي موجوده kubeconfig مان namespace.
هاڻي جڏهن مقرري ڪرڻ رٿيل ماحول ۾، qbec هميشه صرف مخصوص ڪبرنيٽس ڪلستر ۽ مخصوص نالي واري جاءِ تي ڊيپلائي ڪندو، يعني، توهان کي هاڻي مقرري کي انجام ڏيڻ لاءِ ڪنٽينٽس ۽ نيمس اسپيس جي وچ ۾ تبديل ڪرڻ جي ضرورت ناهي.
جيڪڏهن ضروري هجي ته، توهان هميشه هن فائل ۾ سيٽنگون تازه ڪاري ڪري سگهو ٿا.

توهان جا سڀئي ماحول بيان ڪيا ويا آهن qbec.yaml, и в файле params.libsonnet، جتي اهو چوي ٿو ته انهن لاءِ پيرا ميٽر ڪٿي حاصل ڪجي.

اڳيون اسان ٻه ڊاريڪٽريون ڏسون ٿا:

  • اجزاء / - اسان جي ايپليڪيشن لاءِ سڀ پڌرا هتي محفوظ ڪيا ويندا؛ اهي بيان ڪري سگهجن ٿا ٻنهي ۾ jsonnet ۽ باقاعده yaml فائلن ۾
  • ماحول/ - هتي اسان بيان ڪنداسين سڀ متغير (پيراميٽر) اسان جي ماحول لاءِ.

ڊفالٽ طور اسان وٽ ٻه فائلون آهن:

  • ماحول/base.libsonnet - اهو سڀني ماحولن لاء عام پيٽرولر تي مشتمل هوندو
  • ماحول/default.libsonnet - ماحول لاءِ اووررائيڊ ٿيل پيٽرولر تي مشتمل آهي رٿيل

اچو ته کوليون ماحول/base.libsonnet ۽ اتي اسان جي پهرين جزو لاءِ پيٽرول شامل ڪريو:

{
  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',
    },
  },
}

اچو ته اسان جو پهريون جزو پڻ ٺاهيو اجزاء/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,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

هن فائل ۾ اسان ٽن ڪبرنيٽس ادارن کي هڪ ڀيرو بيان ڪيو آهي، اهي آهن: رنيجرز, خدمت и اندر اچڻ. جيڪڏهن اسان چاهيون ٿا، اسان انهن کي مختلف حصن ۾ وجهي سگهون ٿا، پر هن مرحلي ۾ اسان لاء هڪ ڪافي هوندو.

نحو jsonnet باقاعده json سان بلڪل ملندڙ جلندڙ آهي، اصول ۾، باقاعده json اڳ ۾ ئي صحيح jsonnet آهي، تنهن ڪري پهريان توهان لاء آن لائن خدمتون استعمال ڪرڻ آسان ٿي سگهي ٿي جهڙوڪ yaml2json توھان جي معمولي yaml کي json ۾ تبديل ڪرڻ لاءِ، يا، جيڪڏھن توھان جي اجزاء ۾ ڪي متغير شامل نه آھن، ته پوءِ انھن کي ريگولر yaml جي صورت ۾ بيان ڪري سگھجي ٿو.

جڏهن ڪم سان jsonnet مان توهان جي ايڊيٽر لاءِ هڪ پلگ ان انسٽال ڪرڻ جي صلاح ڏيان ٿو

مثال طور، ويم لاء هڪ پلگ ان آهي vim-jsonnet، جيڪو نحو کي نمايان ڪرڻ تي ڦرندو آهي ۽ خودڪار طريقي سان عمل ڪندو آهي jsonnet fmt هر دفعي توهان بچايو (جيسنيٽ انسٽال ڪرڻ جي ضرورت آهي).

Всё готово, теперь можем начинать деплой:

ڏسڻ لاءِ ته اسان کي ڇا مليو، اچو ته هلون:

qbec show default

ٻاھر نڪرندي، توھان ڏسندؤ ته پيش ڪيل yaml منشور جيڪي ڊفالٽ ڪلستر تي لاڳو ڪيا ويندا.

عظيم، هاڻي لاڳو ڪريو:

qbec apply default

آئوٽ پٽ تي توهان هميشه ڏسندا ته توهان جي ڪلستر ۾ ڇا ڪيو ويندو، qbec توهان کي ٽائپ ڪندي تبديلين سان متفق ٿيڻ لاء چيو ويندو. y توهان پنهنجي ارادن جي تصديق ڪرڻ جي قابل هوندا.

اسان جي درخواست تيار آهي ۽ ترتيب ڏني وئي آهي!

جيڪڏهن توهان تبديليون ڪيون ٿا، توهان هميشه ڪري سگهو ٿا:

qbec diff default

ڏسڻ لاءِ ته اهي تبديليون ڪيئن اثرانداز ٿينديون موجوده تعیناتي تي

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

5. ڪوشش ڪري رهيو آهي Gitlab-رنر سان Kubernetes-executor

تازو تائين مون صرف باقاعده استعمال ڪيو gitlab ڊوڙندڙ شيل يا ڊاڪر-ايگزيڪيوٽر سان اڳ ۾ تيار ڪيل مشين (LXC ڪنٽينر) تي. شروعات ۾، اسان وٽ ڪيترائي اهڙا رنر هئا جيڪي عالمي سطح تي اسان جي گيتلب ۾ بيان ڪيا ويا آهن. انهن سڀني منصوبن لاءِ ڊاکر تصويرون گڏ ڪيون.

پر جيئن ته عملي طور ڏيکاريو ويو آهي، هي اختيار سڀ کان وڌيڪ مثالي نه آهي، ٻنهي جي عملي ۽ حفاظت جي لحاظ کان. اهو تمام گهڻو بهتر آهي ۽ نظرياتي طور تي وڌيڪ صحيح آهي ته هر منصوبي لاءِ يا هر ماحول لاءِ الڳ رنر مقرر ڪيا وڃن.

خوشقسمتيء سان، اهو سڀ ڪجهه مسئلو ناهي، هاڻي اسان کي ترتيب ڏينداسين gitlab ڊوڙندڙ سڌو اسان جي منصوبي جي حصي طور ڪبرنيٽس ۾.

Gitlab مهيا ڪري ٿو تيار ٿيل هيلم چارٽ گٽليب-رنر کي ڪبرنيٽس تائين پهچائڻ لاءِ. تنهن ڪري توهان سڀني کي ڳولڻ جي ضرورت آهي رجسٽريشن جو نشان اسان جي منصوبي لاء سيٽنگون -> CI / CD -> ڊوڙندڙ ۽ هيل تائين پهچايو:

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

ڪٿي

  • https://gitlab.com - توھان جي Gitlab سرور جو پتو.
  • yga8y-jdCusVDn_t4Wxc - توهان جي پروجيڪٽ لاءِ رجسٽريشن ٽوڪن.
  • rbac.create=سچو - رنر کي مهيا ڪري ٿو ضروري مقدار جي استحقاق سان گڏ پوڊ ٺاهي سگھندا اسان جي ڪمن کي ڪبرنيٽس-ايگزيڪيوٽر استعمال ڪندي.

جيڪڏهن سڀ ڪجهه صحيح طريقي سان ڪيو وڃي، توهان کي سيڪشن ۾ رجسٽرڊ رنر ڏسڻ گهرجي ويڙهاڪتوهان جي پروجيڪٽ سيٽنگون ۾.

شامل ڪيل رنر جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

Вот так просто? — да, так просто! Больше никакой мороки с регистрацией раннеров вручную, с этой минуты раннеры будут создаваться и уничтожаться автоматически.

6. QBEC سان هيلم چارٽ ترتيب ڏيو

جتان اسان غور ڪرڻ جو فيصلو ڪيو gitlab ڊوڙندڙ частью нашего проекта, настало время описать его в нашем Git-репозитории.

اسان ان کي هڪ الڳ جزو طور بيان ڪري سگهون ٿا ويب سائيٽ، پر مستقبل ۾ اسان مختلف نقلن کي ترتيب ڏيڻ جو منصوبو ڪريون ٿا ويب سائيٽ گهڻو ڪري، برعڪس gitlab ڊوڙندڙ، جيڪو صرف هڪ ڀيرو في ڪبرنيٽس ڪلستر تي لڳايو ويندو. سو اچو ته ان لاءِ الڳ ايپليڪيشن شروع ڪريون:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

هن ڀيري اسان ڪبرنيٽس ادارن کي دستي طور بيان نه ڪنداسين، پر هڪ تيار ڪيل هيلم چارٽ کڻنداسين. qbec جي فائدن مان هڪ آهي هيلم چارٽس کي سڌو سنئون گٽ مخزن مان رينجر ڪرڻ جي صلاحيت.

اچو ته ان کي استعمال ڪندي ڳنڍيون git submodule:

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

ھاڻي ڊاريڪٽري وينڊر/گٽلاب-رنر اسان وٽ هڪ مخزن آهي هڪ چارٽ سان گڏ گٽلاب-رنر لاءِ.

ساڳئي طريقي سان، توهان ٻين مخزن کي ڳنڍي سگهو ٿا، مثال طور، سڄي مخزن کي سرڪاري چارٽ سان https://github.com/helm/charts

اچو ته جزو بيان ڪريون اجزاء/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,
  }
)

پهريون دليل expandHelmTemplate اسان چارٽ ڏانهن رستو گذري، پوء params.values، جيڪو اسان ماحوليات جي ماپن مان وٺون ٿا، پوءِ اعتراض اچي ٿو

  • name Template - ڇڏڻ جو نالو
  • نالو - نالي جي جاء هيلم ڏانهن منتقل ڪئي وئي
  • هي فائل - هڪ گهربل پيٽرولر جيڪو موجوده فائل ڏانهن رستو گذري ٿو
  • لفظي — показывает команду هيلم ٽيمپليٽ سڀني دليلن سان گڏ جڏهن چارٽ پيش ڪيو وڃي

ھاڻي اچو ته بيان ڪريون اسان جي جزو لاءِ پيرا ميٽرز ماحول/base.libsonnet:

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

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

ڌيان ڏيڻ runner Registration Token اسان هڪ خارجي فائل مان وٺون ٿا secrets/base.libsonnet، اچو ته ان کي ٺاهيو:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

اچو ته چيڪ ڪريو ته سڀ ڪجھ ڪم ڪري ٿو:

qbec show default

если всё в порядке, то можем удалить наш ранее, задеплоенный через Helm, релиз:

helm uninstall gitlab-runner

۽ ان کي ساڳئي طريقي سان ترتيب ڏيو، پر qbec ذريعي:

qbec apply default

7. git-crypt جو تعارف

Git-crypt هڪ اوزار آهي جيڪو توهان کي توهان جي مخزن لاءِ شفاف انڪرپشن قائم ڪرڻ جي اجازت ڏئي ٿو.

هن وقت، gitlab-رنر لاءِ اسان جي ڊاريڪٽري جي جوڙجڪ هن طرح نظر اچي ٿي:

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

پر Git ۾ رازن کي محفوظ ڪرڻ محفوظ ناهي، ڇا اهو آهي؟ تنهنڪري اسان کي انهن کي صحيح طور تي انڪوڊ ڪرڻ جي ضرورت آهي.

عام طور تي، هڪ متغير جي خاطر، اهو هميشه احساس نٿو ڪري. توهان رازن کي منتقل ڪري سگهو ٿا qbec ۽ توهان جي CI سسٽم جي ماحولياتي متغير ذريعي.
پر اها ڳالهه نوٽ ڪرڻ جي قابل آهي ته اهڙا به وڌيڪ پيچيده منصوبا آهن جن ۾ ڪيترائي راز شامل ٿي سگهن ٿا؛ انهن سڀني کي ماحولياتي تبديلين ذريعي منتقل ڪرڻ انتهائي مشڪل هوندو.

ان کان علاوه، هن معاملي ۾، مان توهان کي اهڙي شاندار اوزار جي باري ۾ نه ٻڌايان ها git-crypt.

git-crypt اهو پڻ آسان آهي ته اهو توهان کي رازن جي پوري تاريخ کي محفوظ ڪرڻ جي اجازت ڏئي ٿو، انهي سان گڏ مقابلو ڪرڻ، ضم ڪرڻ ۽ تڪرار کي حل ڪرڻ جي ساڳئي طرح جيئن اسان گٽ جي صورت ۾ ڪرڻ لاء استعمال ڪيو ويو آهي.

انسٽاليشن کان پوء پهرين شيء git-crypt اسان کي اسان جي مخزن لاء چابيون پيدا ڪرڻ جي ضرورت آهي:

git crypt init

جيڪڏهن توهان وٽ آهي PGP ڪي، ته پوءِ توهان فوري طور تي پاڻ کي هن منصوبي لاءِ هڪ مددگار طور شامل ڪري سگهو ٿا:

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

هن طريقي سان توهان هميشه هن مخزن کي پنهنجي پرائيويٽ ڪنجي استعمال ڪندي ڊيڪرپٽ ڪري سگهو ٿا.

جيڪڏهن توهان وٽ پي جي پي ڪيچ نه آهي ۽ ان جي توقع نه ڪريو، ته پوءِ توهان ٻئي طريقي سان وڃو ۽ پروجيڪٽ جي چاٻي کي برآمد ڪري سگهو ٿا:

git crypt export-key /path/to/keyfile

اهڙيء طرح، جيڪو به هڪ برآمد ڪيو آهي ڪي فائل توهان جي مخزن کي ڊسڪريٽ ڪرڻ جي قابل هوندو.

اهو اسان جو پهريون راز قائم ڪرڻ جو وقت آهي.
مون کي توهان کي ياد ڏيارڻ ڏيو ته اسان اڃا تائين ڊاريڪٽري ۾ آهيون deploy/gitlab-runner/, где у нас имеется директория راز/، اچو ته ان ۾ موجود سڀني فائلن کي انڪرپٽ ڪريون، ان لاءِ اسان هڪ فائيل ٺاهينداسين راز/.gitattributes هيٺين مواد سان:

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

جيئن مواد مان ڏسي سگھجي ٿو، سڀئي فائلون نقاب ٿيل آھن * ذريعي هلائي ويندي git-crypt، سواءِ سڀ کان وڌيڪ .gitaattributes

اسان هن کي هلائڻ سان چيڪ ڪري سگهون ٿا:

git crypt status -e

آئوٽ پٽ ريپوزٽري ۾ موجود سڀني فائلن جي هڪ فهرست هوندي جنهن لاءِ انڪرپشن فعال ٿيل آهي

اهو سڀ ڪجهه آهي، هاڻي اسان محفوظ طور تي اسان جي تبديلين کي انجام ڏئي سگهون ٿا:

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

مخزن کي بلاڪ ڪرڻ لاءِ، بس ھلايو:

git crypt lock

۽ فوري طور تي سڀئي اينڪرپٽ فائلون بائنري شيء ۾ تبديل ٿي وينديون، انهن کي پڙهڻ ناممڪن ٿي ويندو.
مخزن کي ختم ڪرڻ لاءِ، ھلايو:

git crypt unlock

8. ٽول باڪس جي تصوير ٺاھيو

هڪ ٽول باڪس تصوير سڀني اوزارن سان گڏ هڪ تصوير آهي جيڪا اسان پنهنجي پروجيڪٽ کي ترتيب ڏيڻ لاءِ استعمال ڪنداسين. اهو استعمال ڪيو ويندو Gitlab رنر پاران عام لڳائڻ جي ڪمن کي انجام ڏيڻ لاء.

هتي سڀ ڪجهه سادو آهي، اچو ته هڪ نئون ٺاهيو dockerfiles/toolbox/dockerfile هيٺين مواد سان:

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

جئين توهان ڏسي سگهو ٿا، هن تصوير ۾ اسان سڀني افاديت کي انسٽال ڪريون ٿا جيڪي اسان اسان جي ايپليڪيشن کي ترتيب ڏيڻ لاء استعمال ڪندا هئا. اسان کي هتي ان جي ضرورت نه آهي جيستائين ڪيوبڪبل، پر توھان شايد ان سان گڏ راند ڪرڻ چاھيو ٿا پائپ لائن سيٽ اپ واري مرحلي دوران.

انهي سان گڏ، ڪبرنيٽس سان رابطو ڪرڻ ۽ ان کي ترتيب ڏيڻ جي قابل ٿيڻ لاء، اسان کي گٽليب-رنر پاران ٺاهيل پوڊ لاء ڪردار ترتيب ڏيڻ جي ضرورت آهي.

هن کي ڪرڻ لاء، اچو ته ڊاريڪٽري ڏانهن وڃو gitlab-runner سان:

cd deploy/gitlab-runner

۽ نئون حصو شامل ڪريو اجزاء/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,
      },
    ],
  },
]

اسان پڻ بيان ڪنداسين نئين پيٽرولن ۾ ماحول/base.libsonnet, который теперь выглядит так:

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',
    },
  },
}

ڌيان ڏيڻ $.components.rbac.name ڏانهن اشارو نالو جزو لاء rbac

اچو ته ڏسو ته ڇا تبديلي آئي آهي:

qbec diff default

۽ Kubernetes تي اسان جي تبديلين کي لاڳو ڪريو:

qbec apply default

پڻ، اسان جي تبديلين کي انجام ڏيڻ نه وساريو 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. اسان جي پهرين پائپ لائن ۽ تصويرن جي اسيمبلي ٽيگ ذريعي

منصوبي جي روٽ تي اسين ٺاهينداسين gitlab-ci.yml هيٺين مواد سان:

.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

مهرباني ڪري نوٽ ڪريو ته اسان استعمال ڪندا آهيون GIT_SUBMODULE_STRATEGY: عام انهن نوڪرين لاءِ جتي توهان کي عمل ڪرڻ کان پهريان واضح طور تي ذيلي ماڊل شروع ڪرڻ جي ضرورت آهي.

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

منهنجو خيال آهي ته اسان محفوظ طور تي هن نسخي کي سڏي سگهون ٿا v0.0.1 ۽ ٽيگ شامل ڪريو:

git tag v0.0.1

اسان ٽيگ شامل ڪنداسين جڏهن به اسان کي نئون نسخو ڇڏڻ جي ضرورت پوندي. Docker تصويرن ۾ ٽيگ Git ٽيگ سان ڳنڍيل هوندا. نئين ٽيگ سان هر هڪ ڌڪ هن ٽيگ سان تصويرن جي تعمير جي شروعات ڪندو.

اچو ته اهو ڪريون git push --tags، ۽ اچو ته اسان جي پهرين پائپ لائن کي ڏسو:

پهرين پائپ لائن جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

اهو توهان جي ڌيان ڏانهن ڌيان ڏيڻ جي قابل آهي ته ٽيگ ذريعي اسيمبلي ڊاکر تصويرون ٺاهڻ لاء مناسب آهي، پر ڪوبرنيٽس تي ايپليڪيشن کي ترتيب ڏيڻ لاء مناسب ناهي. جيئن ته نوان ٽيگ پراڻي ڪمن کي تفويض ڪري سگھجن ٿيون، ان صورت ۾، ان لاءِ پائپ لائن کي شروع ڪرڻ سان پراڻي ورزن جي مقرري ٿيندي.

هن مسئلي کي حل ڪرڻ لاء، عام طور تي ڊاکر تصويرن جي تعمير کي ٽيگ سان ڳنڍيو ويندو آهي، ۽ ايپليڪيشن کي هڪ برانچ ۾ لڳائڻ. رکن ٿا، جنهن ۾ گڏ ڪيل تصويرن جا نسخا هارڊ ڪوڊ ٿيل آهن. اهو آهي جتي توهان هڪ سادي واپسي سان رول بيڪ شروع ڪري سگهو ٿا رکن ٿا- شاخون.

10. لڳائڻ جي خودڪار

Gitlab-رنر لاءِ اسان جي رازن کي ختم ڪرڻ لاءِ، اسان کي ريپوزٽري چيڪ کي برآمد ڪرڻ ۽ ان کي اسان جي سي آءِ ماحوليات ۾ شامل ڪرڻ جي ضرورت پوندي.

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

اسان Gitlab ۾ نتيجو واري لائن کي محفوظ ڪنداسين؛ هن کي ڪرڻ لاء، اچو ته اسان جي پروجيڪٽ سيٽنگون ڏانهن وڃو:
سيٽنگون -> CI / CD -> متغير

۽ اچو ته هڪ نئون متغير ٺاهيو:

قسم
چاٻي
قدر
پناهه
Masked
دائري

File
GITCRYPT_KEY
<your string>
true (تربيت دوران توهان ڪري سگهو ٿا false)
true
All environments

شامل ڪيل متغير جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

هاڻي اچو ته اسان جي تازه ڪاري gitlab-ci.yml ان ۾ شامل ڪرڻ:

.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

هتي اسان qbec لاءِ ڪيترائي نوان آپشن فعال ڪيا آهن:

  • —root some/app - توھان کي اجازت ڏئي ٿو ھڪڙي مخصوص ايپليڪيشن جي ڊاريڪٽري کي طئي ڪرڻ جي
  • --force:k8s-context __incluster__ - ھي ھڪڙو جادوئي متغير آھي جيڪو چوي ٿو ته ڊيپلائيمينٽ ساڳئي ڪلستر ۾ ٿيندي جنھن ۾ gtilab-runner ھلندو آھي. اهو ضروري آهي ڇو ته ٻي صورت ۾ qbec توهان جي kubeconfig ۾ مناسب ڪبرنيٽس سرور ڳولڻ جي ڪوشش ڪندو
  • --انتظار - qbec کي انتظار ڪرڻ تي مجبور ڪري ٿو جيستائين اهو وسيلا ٺاهي ٿو تيار حالت ۾ وڃي ۽ صرف پوءِ ڪامياب ايگزٽ ڪوڊ سان ٻاهر نڪري.
  • -ها - بس غير فعال شيل کي غير فعال ڪري ٿو ڇا توهان کي پڪ آهي؟ جڏهن مقرر ڪيو ويو.

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

۽ پوءِ گٽ پٽي اسان ڏسنداسين ته اسان جون درخواستون ڪيئن ڪيون ويون آهن:

سيڪنڊ پائپ لائن جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

11. آرٽيڪل ۽ اسيمبلي جڏهن ماسٽر ڏانهن ڌڪڻ

عام طور تي، مٿي بيان ڪيل مرحلا تقريبن ڪنهن به مائڪرو سروس کي ٺاهڻ ۽ پهچائڻ لاءِ ڪافي آهن، پر اسان نه ٿا چاهيون ته ٽيگ شامل ڪرڻ هر وقت اسان کي سائيٽ کي اپڊيٽ ڪرڻ جي ضرورت آهي. تنهن ڪري، اسان هڪ وڌيڪ متحرڪ رستو وٺي سگهنداسين ۽ ماسٽر برانچ ۾ ڊائجسٽ جي تعیناتي قائم ڪنداسين.

خيال سادو آهي: هاڻي اسان جي تصوير ويب سائيٽ هر وقت ٻيهر تعمير ڪيو ويندو جڏهن توهان داخل ڪيو رکن ٿا، ۽ پوءِ خودڪار طور تي ڪبرنيٽس ڏانھن ترتيب ڏيو.

اچو ته انهن ٻن نوڪرين کي تازه ڪاري ڪريون اسان جي 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"

مهرباني ڪري نوٽ ڪريو ته اسان هڪ موضوع شامل ڪيو آهي رکن ٿا к حوالو نوڪريون لاء build_website ۽ اسان هاڻي استعمال ڪريون ٿا $CI_COMMIT_REF_NAME بدران بدران $CI_COMMIT_TAG، اهو آهي، اسان گٽ ۾ ٽيگ مان نڪتل آهيون ۽ هاڻي اسان هڪ تصوير کي دٻائي ڇڏينداسين ڪمٽ برانچ جي نالي سان جيڪا پائپ لائن جي شروعات ڪئي. اهو نوٽ ڪرڻ جي قابل آهي ته اهو پڻ ٽيگ سان ڪم ڪندو، جيڪو اسان کي اجازت ڏيندو سائيٽ جي سنيپ شاٽ کي محفوظ ڪرڻ جي مخصوص ورزن سان ڊاکر-رجسٽري ۾.

جڏهن سائيٽ جي نئين ورزن لاءِ ڊاکر ٽيگ جو نالو تبديل نه ٿي سگهي ٿو، اسان کي اڃا تائين ڪبرنيٽس ۾ تبديلين کي بيان ڪرڻو پوندو، ٻي صورت ۾ اهو صرف نئين تصوير مان ايپليڪيشن کي ٻيهر بحال نه ڪندو، ڇاڪاڻ ته اهو ڪنهن به تبديلي کي نوٽيس نه ڪندو. تعیناتي پڌرو.

اختيار -vm: ext-str هضم = "$ DIGEST" qbec لاءِ - توهان کي jsonnet ڏانهن هڪ خارجي متغير منتقل ڪرڻ جي اجازت ڏئي ٿي. اسان چاهيون ٿا ته اهو اسان جي ايپليڪيشن جي هر رليز سان گڏ ڪلستر ۾ ٻيهر بحال ڪيو وڃي. اسان هاڻي ٽيگ جو نالو استعمال نٿا ڪري سگهون، جيڪو هاڻي تبديل نه ٿي سگهي، ڇو ته اسان کي تصوير جي مخصوص ورزن سان ڳنڍڻ جي ضرورت آهي ۽ ان کي تبديل ڪرڻ جي صورت ۾ ترتيب ڏيڻ جي ضرورت آهي.

هتي اسان کي مدد ڪئي ويندي Kaniko جي قابليت سان هڪ ڊائجسٽ تصوير کي فائل ۾ محفوظ ڪرڻ (اختيار --digest-file)
ان کان پوء اسان هن فائل کي منتقل ڪنداسين ۽ ان کي ترتيب ڏيڻ جي وقت تي پڙهي سگهنداسين.

اچو ته اسان جي پيٽرولن کي اپڊيٽ ڪريو deploy/website/environments/base.libsonnet جيڪو هاڻي هن طرح نظر ايندو:

{
  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',
    },
  },
}

ٿي ويو، هاڻي ڪو به ڪم ۾ رکن ٿا ڊاکر تصوير جي تعمير کي شروع ڪري ٿو ويب سائيٽ، ۽ پوء ان کي ترتيب ڏيو Kubernetes.

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

اسان بعد ۾ چيڪ ڪنداسين گٽ پٽي اسان کي هن وانگر ڪجهه ڏسڻ گهرجي:

ماسٽر لاء پائپ لائن جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

اصولي طور تي، اسان کي هر پش سان گٽليب رنر کي ٻيهر ترتيب ڏيڻ جي ضرورت ناهي، جيستائين، يقينا، ان جي ترتيب ۾ ڪجھ به تبديل نه ٿيو آهي، اچو ته ان کي درست ڪريون. 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/**/*

تبديليون توهان کي تبديلين جي نگراني ڪرڻ جي اجازت ڏيندو deploy/gitlab-runner/ ۽ اسان جي نوڪري کي صرف ان صورت ۾ شروع ڪنداسين جيڪڏهن ڪو به هجي

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

گٽ پٽي، اهو بهتر آهي:

اپڊيٽ ٿيل پائپ لائن جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

12. متحرڪ ماحول

اهو وقت آهي اسان جي پائپ لائن کي متحرڪ ماحول سان متنوع ڪرڻ.

پهرين، اچو ته نوڪري کي اپڊيٽ ڪريو build_website اسان ۾ gitlab-ci.yml، ان مان بلاڪ هٽائڻ صرف، جيڪو Gitlab کي مجبور ڪندو ته ان کي ڪنهن به شاخ تي ڪنهن به عزم تي ٽاريندو:

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/

پوء نوڪري کي اپڊيٽ ڪريو deploy_website, اتي هڪ بلاڪ شامل ڪريو ماحول:

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"

هي Gitlab کي نوڪري سان لاڳاپيل ڪرڻ جي اجازت ڏيندو prod ماحول ۽ ان جي صحيح لنڪ ڏيکاري.

هاڻي اچو ته ٻه وڌيڪ نوڪريون شامل ڪيون:

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

اهي ماسٽر کان سواءِ ڪنهن به شاخ ڏانهن ڌڪڻ تي شروع ڪيا ويندا ۽ سائيٽ جي ڏيک واري ورزن کي ترتيب ڏيندو.

اسان qbec لاءِ هڪ نئون آپشن ڏسون ٿا: --app-tag - اهو توهان کي اجازت ڏئي ٿو ته ايپليڪيشن جي ترتيب ڏنل ورجن کي ٽيگ ڪرڻ ۽ صرف هن ٽيگ جي اندر ڪم ڪرڻ؛ جڏهن Kubernetes ۾ وسيلن کي ٺاهڻ ۽ تباهه ڪرڻ، qbec صرف انهن سان ڪم ڪندو.
اهڙيءَ طرح اسان هر جائزي لاءِ الڳ ماحول پيدا نٿا ڪري سگهون، پر صرف هڪ ئي کي ٻيهر استعمال ڪري سگهون ٿا.

هتي اسان پڻ استعمال ڪندا آهيون qbec لاڳو جائزو، جي بدران qbec لاڳو ڪريو ڊفالٽ - اھو اھو ئي لمحو آھي جڏھن اسان پنھنجي ماحول جي فرق کي بيان ڪرڻ جي ڪوشش ڪنداسين (جائزو ۽ ڊفالٽ):

اچو ته شامل ڪريون جو جائزو ماحول ۾ deploy/website/qbec.yaml

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

پوء اسان ان ۾ اعلان ڪنداسين 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

۽ ان لاءِ ڪسٽم پيٽرولر لکو 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',
    },
  },
}

اچو ته نوڪريء تي هڪ ويجهي نظر رکون stop_review، اهو شروع ڪيو ويندو جڏهن برانچ ختم ٿي ويندي آهي ۽ انهي ڪري ته gitlab چيڪ ڪرڻ جي ڪوشش نه ڪندو آهي ان کي استعمال ڪيو ويندو آهي GIT_STRATEGY: ڪو به نه، بعد ۾ اسان کلون رکن ٿا- برانچ ۽ ان جي ذريعي جائزو حذف ڪريو.
اهو ٿورڙو مونجهارو آهي، پر مون کي اڃا تائين وڌيڪ خوبصورت رستو نه مليو آهي.
هڪ متبادل اختيار هوندو ته هر جائزي کي هوٽل جي نالي جي جاءِ تي لڳايو وڃي، جنهن کي هميشه مڪمل طور ڊاهي سگهجي ٿو.

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

گٽ پٽي, git checkout -b ٽيسٽ, git push origin test، چيڪ:

Gitlab ۾ ٺاهيل ماحول جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

سڀ ڪجهه ڪم ڪري رهيو آهي؟ - عظيم، اسان جي ٽيسٽ شاخ کي ختم ڪريو: گٽ جانچ ماسٽر, git push origin: test، اسان چيڪ ڪريون ٿا ته ماحول کي ختم ڪرڻ واريون نوڪريون بغير ڪنهن غلطي جي ڪم ڪيون.

Здесь сразу хочется уточнить, что создавать ветки может любой девелопер в проекте, он также может изменить gitlab-ci.yml فائل ۽ رسائي رازداري متغير.
تنهن ڪري، ان کي سختي سان سفارش ڪئي وئي آهي ته انهن جي استعمال کي صرف محفوظ شاخن لاء، مثال طور، ۾ رکن ٿا، يا هر ماحول لاءِ متغيرن جو هڪ الڳ سيٽ ٺاهيو.

13. ائپس جو جائزو وٺو

ائپس جو جائزو وٺو هي هڪ GitLab خاصيت آهي جيڪا توهان کي مخزن ۾ هر فائل لاءِ هڪ بٽڻ شامل ڪرڻ جي اجازت ڏئي ٿي ان کي جلدي طور تي ترتيب ڏنل ماحول ۾ ڏسڻ لاءِ.

انهن بٽڻن کي ظاهر ڪرڻ لاء، توهان کي هڪ فائل ٺاهڻ جي ضرورت آهي .gitlab/route-map.yml ۽ ان ۾ سڀني رستي جي تبديلين کي بيان ڪريو؛ اسان جي صورت ۾ اهو تمام سادو هوندو:

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

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

اسان جي تبديلين کي انجام ڏيڻ نه وساريو:

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

گٽ پٽي۽ چيڪ ڪريو:

نظرثاني ايپ بٽڻ جو اسڪرين شاٽ

ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

نوڪري ٿي وئي!

پروجيڪٽ جا ذريعا:

توهان جي توجه لاء مهرباني، مون کي اميد آهي ته توهان ان کي پسند ڪيو ڪوشش ڪري رهيا آهن نوان اوزار تعمير ڪرڻ ۽ خودڪار ڪرڻ لاءِ ڪبرنيٽس ۾ تعیناتي

جو ذريعو: www.habr.com

تبصرو شامل ڪريو