Тестовое задание

parent c878f04a
......@@ -2,5 +2,154 @@
[Резюме pdf](./cv/Ilin_Vladimir_System_administrator.pdf)
[Резюме tex](./cv/Ilin_Vladimir_System_administrator.tex)
## Тестовое задание
### Задание 1
```sh
awk '{data[$1] += $10} END {for (ip in data) print data[ip], "bytes for", ip}' access.log
```
### Задание 2
```sh
lsof -iTCP -sTCP:ESTABLISHED
```
### Задание 3
Время недоступности сервера 13:00 по настоящее.
Судя по графику, в 13:00 создалось множество подключений к БД до достижения максимума и они не закрылись, при этом
количество запросов к самой БД (Questions) упало минимума. Так же, судя по графику Thread Cache ничего не кешируется.
Итого, я бы предположил что в 13:00 поступил либо ОЧЕНЬ не оптимальный запрос, либо AFTER INSERT trigger модифицирует таблицу на
которой он находится или допущена подобная логическая ошибка с циклами.
### Задание 4
```doickerfile
FROM ubuntu:latest
MAINTAINER MyCompany
COPY . /var/www/html
RUN apt-get update -y
RUN apt-get install -y nginx
CMD ["nginx", "-g", "daemon off;"]
```
* Я бы выбрал образы на основе alpine из за меньшего потребления ресурсов. Или уже готовый, официальный образ nginx.
* И, возможно, конкретную версию для большей стабильности при воспроизведении сервиса.
* Инструкция MAINTAINER устарела, рекомендуется использовать LABEL.
* Так же имеет смысл указать почту или любые другие контактные данные.
* COPY до *apt-get update* и установки необходимого ПО делают переиспользование слоев невозможным
* В данном случае не получится использовать уже обновленный образ для создания других образов.
* *apt-get update* без *apt-get upgrade* имеет смысл при использовании конкретной версии базового образа, но не при теге latest.
* Нету инструкции *EXPOSE*, она не обязательна, но рекомендована.
Предлагаемый мной Dockerfile:
```Dockerfile
FROM nginx:1.29-alpine
#если критично необходимы свежие пакеты то
# FROM nginx:latest
LABEL maintainer="MyCompany Ltd maintainer@mycompany.org" \
title="Nginx backend X" \
version="0.1-beta" \
description="Nginx based backend for service X"
# RUN apk add nginx-mod-http-perl ...
COPY . /var/www/html
EXPOSE 80
#EXPOSE 443
CMD ["nginx", "-g", "daemon off;"]
```
Так-же стоит добавить .git\*, \*.md, в .dockerignore.
### Задание 5
0. Проверить веб-сервер самому, ping и/или подключится к серверу.
1. Сохранить логи.
2. Попробовать перезапустить веб-сервер.
* При неудаче, если недавно была изменена конфигурация/обновлен контейнер итд, откатить изменения и попробовать перезапустить снова.
3. Вне зависимости от исхода шага 2 проверить логи до (и после перезапуска).
4. Диагностировать ошибку через логи и исправить.
### Задание 6
Я использовал *minikube*.
После установки *minikube* и *kubectl*
1. Запустить кластер
```sh
minikube start
```
2. Создать манифест *deployment.yaml*
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3 # Увеличить для масштабирования
selector:
matchLabels:
app: my-app-deployment
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app-image
ports:
- containerPort: 80
# Перезапускается при падении по умолчанию
3. Создать манифест *service.yaml*
```yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
type: NodePort
selector:
app: my-app
ports:
- port: 80
targetPort: 80
nodePort: 30080 # Открыть порт
```
4. Применить манифесты
```sh
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
```
5. Получить доступ к сервису в контейнере
```sh
curl `minikube ip`:30080
```
* Временно увеличить количество реплик
```sh
kubectl scale deployment my-app-deployment --replicas=5
```
ИЛИ изменить ```replicas: 3``` в *deployment.yaml*.
### Задание 7
1. Уточнить "Что конкретно не работает?"
* Параллельно, при возможности, проверить самому логи или попросить их.
2. При наличии недавних изменений попробовать откатить в рабочее состояние.
3. Диагностировать ошибку через логи.
* Поддерживать связь с заказчиком.
4. По возможности исправить проблему или объяснить ситуацию и назвать примерные сроки исправления.
This diff is collapsed.
#!/bin/sh
awk :'{data[$1] += $10} END {for (ip in data) print data[ip], "bytes for", ip}' $1
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment