0

Небольшая подборка тестовых заданий для Junior DevOps инженера

CI/CD

Что такое CI/CD?

Ответ

Свод практик, направленный на автоматизацию тестирования и доставки новых компонент проекта заинтересованным сторонам (разработчики, аналитики, инженеры качества, конечные пользователи и др.).

Демон для systemd

Напишите простой демон для systemd, который будет поддерживать работу процесса и перезапускаться в случае выхода из строя процесса.

Решение

[Unit]
Description=Test_service
After=postgres.service
StartLimitBurst=5
StartLimitIntervalSec=10
[Service]
Type=simple
Restart=always
RestartSec=1
User=centos
ExecStart=/usr/bin/env python /app/server.py
[Install]
WantedBy=multi-user.target

inode

Что такое inode в Linux?

Ответ

Индексный дескриптор в файловой системе, который хранит метаданные о файлах, за исключением имени файла. В дескрипторе хранится: длина файла в байтах, id устройства с файлом, id пользователя владельца файла, id группы файла, режим файла (права доступа), timestamp последнего изменения файла, счётчик хардлинков, указатели на блоки файла.

Стратегии деплоймента

Сделайте реализацию blue/green стратегии деплоймента для Kubernetes на основе деплойментов, сервиса и ingress’а и опишите как переключать версии.

Решение

### Конфигурация ingress'а
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: / spec:
      rules:
      - http:
          paths:
          - path: /
          pathType: Prefix
          backend:
            service:
            name: app-service
            port:
              number: 80

### Сервис
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: app
    color: blue
  ports:
    - protocol: TCP
    port: 80
    targetPort: 8080

### Деплоймент синей версии
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-blue
  labels:
    app: app
    color: blue
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
      color: blue
  template:
    metadata:
      labels:
        app: app
        color: blue
    spec:
      containers:
      - name: app
        image: docker.registry.io/app:1.0.0
        ports:
          - containerPort: 8080

### Деплоймент зелёной версии
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-green
  labels:
    app: app
    color: green
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: app
        color: green
    template:
      metadata:
        labels:
          app: app
          color: green
      spec:
        containers:
        - name: app
          image: docker.registry.io/app:1.0.0
          ports:
            - containerPort: 8080
### Переключение версий осуществляется путём изменения селекторов в сервисе

Политика для AWS S3

Напишите политику для AWS S3 бакета, которая разрешает доступ только с определенных IP адресов.

Решение

{
    "Id": "AllowFromSourceIP",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SourceIP",
            "Action": "s3:*",
            "Effect": "Deny",
            "Resource": [
                "arn:aws:s3:::demo-bucket",
                "arn:aws:s3:::demo-bucket/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "11.11.11.11/32",
                        "22.22.22.22/32"
                    ]
                }
            },
            "Principal": "*"
        }
    ]
}

Паттерны IaaS/PaaS/SaaS

Объясните паттерны IaaS/PaaS/SaaS на примере пиццы.

Ответ

Или такой вариант ответа

Исправьте неправильно написанный Dockerfile

Есть условное Node.js приложение, и неправильно написанный Dockerfile, который не будет кэшироваться и будет занимать много места. Нужно переписать его в соответствии с best-practice

#плохой файл
FROM ubuntu:18.04
COPY ./src /app
RUN apt-get update -y
RUN apt-get install -y nodejs
RUN npm install
ENTRYPOINT ["npm"]
CMD ["run", "prod"]

Вариант решения

FROM node:14.15.4-buster as BUILDER
COPY ./src /build
RUN npm install
FROM node:14.15.4-alpine3.12
WORKDIR /app
COPY --from=BUILDER /build/out /app
CMD ["server.js"]

Сетевое взаимодействие в Kubernetes

С помощью чего можно ограничить в Kubernetes сетевое взаимодействие между подами? Приведите пример. Надо ли отдельно включать данный механизм?

Ответ

С помощью Network Policy. В зависимости от сетевого плагина, но по большей части сетевые политики всегда выключены по умолчанию, так что надо.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: demo-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
      - ipBlock:
            cidr: 172.16.0.0/16
            except:
            - 172.16.1.0/24
      - namespaceSelector:
            matchLabels:
               project: demo
      - podSelector:
           matchLabels:
              role: frontend
      ports:
      - protocol: TCP
          port: 8080
  egress:
  - to:
      - ipBlock:
         cidr: 10.0.0.0/24
      ports:
          - protocol: TCP
              port: 5432

POSIX

Что такое POSIX?

Ответ

Набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой (системный API), библиотеку языка Cи и набор приложений и их интерфейсов. Создан для совместимости различных Unix-подобных дистрибутивов.

Типы DNS записей

Приведите основные типы DNS записей и для чего они используются?

Ответ

  • A — запись соответствия с IPv4 адресом;
  • AAAA — запись соответствия с IPv6 адресом;
  • CNAME — запись соответствия другому доменному имени;
  • MX — адресная запись, указывающая на почтовый сервер домена;
  • NS — адресная запись указывающая на DNS-резолверы, отвечающие за данный домен;
  • TXT — произвольная текстовая запись в домене, часто используется для верификации принадлежности домена.

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:398 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(845): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(418): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 398