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

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

Александр Шуляк

Александр Шуляк

DevOps инженер в Gearset

Junior специалисты часто не знают, чего ожидать от собеседований. Особенно, если человек только начинает свой профессиональный путь и собеседование первое. Как же готовиться DevOps-у, который делает свои первые шаги в поиске работы?

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

У Junior DevOps-ов на собеседованиях меньше задач и конкретных реализаций, чем у Middle и, тем более, Senior. Но они есть в любом случае. Ниже приведены задачи, которые чаще всего встречаются на собеседованиях. Вряд ли собеседование будет состоять только из этих вопросов, но несколько штук скорее всего попадется.

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 — произвольная текстовая запись в домене, часто используется для верификации принадлежности домена.