Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ДЗ#3 Сетевое взаимодействие Pod, сервисы #3

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 139 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@

![alt text](./img/image.png)

## Запуск
### Запуск
1. Создать namespace командой `kubectl apply -f kubernetes-controllers/namespase.yaml`
2. Создать остальные ресурсы командой `kubectl apply -f kubernetes-controllers/`

![alt text](./img/image2.png)

## Описание решения
### Описание решения
1. За создание namespace отвечает файл `kubernetes-controllers/namespase.yaml`, который создает namespace с именем `homework`.
2. Файл `kubernetes-controllers/configmap-nginx-config.yaml` конфигурирует nginx, наследован из Д3#1
3. В файле `kubernetes-controllers/deployment.yaml`
Expand Down Expand Up @@ -77,7 +77,7 @@ nodeSelector:
homework: "true"
```

## Проверка
### Проверка
1. Если на нодах нет label `homework=true`, поды не запустятся. Если назначить label, pod-ы запускаются. Эти события видно через `kubectl get events --namespace homework | grep FailedScheduling`

![alt text](./img/image3.png)
Expand All @@ -90,4 +90,139 @@ nodeSelector:

3. Для проверки `strategy`, необходимо обновить в `deployment.yaml`, для примера я обновили image nginx с `nginx:1.25.5-bookworm` на `nginx:1.26.0-bookworm`. Поды перезапускаются по одному.

![alt text](./img/image7.png)
![alt text](./img/image7.png)

## ДЗ#3 Сетевое взаимодействие Pod, сервисы

### Задания:
- Изменить readiness-пробу в манифесте deployment.yaml из предыдущего ДЗ на httpGet, вызывая URL /index.html.
- Необходимо создать манифест service.yaml, описывающий сервис типа ClusterIP, который будет направлять трафик на поды, управляемые вашим deployment.
- Будет создаваться в namespace homework
- Установить в кластере ingress-контроллер nginx.
- В дополнение к этому будет иметь readiness пробу, проверяющую наличие файла /homework/index.html
- Создать манифест ingress.yaml, в котором будет описан объект типа Ingress, направляющий все HTTP запросы к хосту homework.otus на ранее созданный сервис. В результате запрос http://homework.otus/index.html должен отдавать код HTML страницы, находящейся в подах.

#### Задание с *
- Доработать манифест ingress.yaml, описав в нем rewrite-правила так, чтобы обращение по адресу http://homework.otus/index.html форвардилось на http://homework.otus/homepage.
UPD:
```
Здравствуйте!
Уточнил по поводу задания со * - запрос на http://homework.otus/homepage должен отдавать контент index.html, что нужно сделать через rewrite в ingress соответственно
```

### Подготовка
1. Необходимо убедиться, что на ноде есть label `homework=true`, это можно посмотреть командой `kubectl get nodes --show-labels`. В моем случае, label уже есть на нужной ноде. Если label нет, его необходимо создать командой `kubectl label nodes <node-name> homework=true`
2. Если, как у меня, нет dns-сервера, необходимо добавить запись в `/etc/hosts`, `127.0.0.1 homework.otus`
```sh
echo "127.0.0.1 homework.otus" | sudo tee -a /etc/hosts
```
![alt text](./img/image8.png)
## Запуск
1. Создать namespace командой `kubectl apply -f kubernetes-networks/namespase.yaml`
2. Создать остальные ресурсы командой `kubectl apply -f kubernetes-networks/`

### Описание решения
1. Файлы `configmap-nginx-config.yaml`, `deployment.yaml`, `namespace.yaml` наследованы из прошлого ДЗ
2. В `deployment.yaml` сконфиругирована readiness проба вида:
```yaml
spec:
type: ClusterIP
selector:
app: webserver
ports:
- name: websrv-svc-port
protocol: TCP
port: 8000
targetPort: webserver-port
```
3. Файл `service.yaml` конфигурирует service с типом ClusterIP:
```yaml
# /kubernetes-networks/service.yaml
...
spec:
type: ClusterIP
selector:
app: webserver
ports:
- name: websrv-svc-port
protocol: TCP
port: 8000
targetPort: webserver-port
```
Имя `targetPort: webserver-port` так же определено в `deployment.yaml`, для удобства:
```yaml
# /kubernetes-networks/deployment.yaml
...
containers:
- name: webserver
image: nginx:1.26.0-bookworm
ports:
- containerPort: 8000
name: webserver-port
```
4. В файле `ingress.yaml` сконфигурирован Ingress nginx, в кластер ingress nginx установлен по документации: https://kubernetes.github.io/ingress-nginx/deploy/#quick-start
```sh
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml
```
```yaml
...
rules:
- host: homework.otus
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webserver-svc
port:
name: websrv-svc-port
```
Имя порта `name: websrv-svc-port` определено в `service.yaml` для удобства (см. п 3)

5. В файле `ingress-homepage.yaml` выполнено задание с *, rewrite что бы запросы на /hopmepage перенаправлялись на /, то есть на "основной" ingress-nginx
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
namespace: homework
labels:
app: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: homework.otus
http:
paths:
- path: /homepage
pathType: Prefix
backend:
service:
name: webserver-svc
port:
name: websrv-svc-port
ingressClassName: nginx
```

### Проверка
1. Работу readiness пробы можно проверить командой
```sh
kubectl logs --namespace homework pods/webserver-***-*** --tail 10
```
![alt text](./img/image9.png)

2. Так как service Type ClusterIP доступен только изнутри кластера, для проверки необходимо сделать exec в под и проверять "изнутри", `head -n 20` добавлено для обрезки вывода и более удобного отображения.
```sh
kubectl --namespace homework exec -it pods/webserver-55d7f6d76f-cjhsk -- curl http://localhost:8000/index.html | head -n 20
```

![alt text](./img/image10.png)

3. Для проверки ingress достаточно сделать (`head -n 20` так же добавлден для удобства отображения)
```sh
curl http://homework.otus/index.html | head -n 20
```

![alt text](./img/image11.png)
Binary file added img/image10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image11.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/image9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions kubernetes-networks/configmap-nginx-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: homework
data:
nginx.conf: |
server {
listen 8000;
server_name localhost;

location / {
root /homework;
index index.html;
}
}
66 changes: 66 additions & 0 deletions kubernetes-networks/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: webserver
namespace: homework
labels:
app: webserver
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
replicas: 3
selector:
matchLabels:
app: webserver
template:
metadata:
labels:
app: webserver
spec:
initContainers:
- name: init-websever
image: busybox:1.36.1
command: ["/bin/sh", "-c"]
volumeMounts:
- name: homework-vol
mountPath: /init
args:
- wget -O /init/index.html https://github.com/ || echo 'Failed wget to https://github.com/' > /init/index.html

containers:
- name: webserver
image: nginx:1.26.0-bookworm
ports:
- containerPort: 8000
name: webserver-port
volumeMounts:
- name: homework-vol
mountPath: /homework
- name: nginx-conf
mountPath: /etc/nginx/conf.d/
readOnly: true
lifecycle:
preStop:
exec:
command: ["rm", "-f", "/homework/index.html"]
readinessProbe:
httpGet:
path: /index.html
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3

volumes:
- name: homework-vol
emptyDir:
sizeLimit: 250Mi
- name: nginx-conf
configMap:
name: nginx-config

nodeSelector:
homework: "true"
22 changes: 22 additions & 0 deletions kubernetes-networks/ingress-homepage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx-homepage
namespace: homework
labels:
app: ingress-nginx-homepage
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: homework.otus
http:
paths:
- path: /homepage
pathType: Prefix
backend:
service:
name: webserver-svc
port:
name: websrv-svc-port
ingressClassName: nginx
20 changes: 20 additions & 0 deletions kubernetes-networks/ingress.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
namespace: homework
labels:
app: ingress-nginx
spec:
rules:
- host: homework.otus
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webserver-svc
port:
name: websrv-svc-port
ingressClassName: nginx
4 changes: 4 additions & 0 deletions kubernetes-networks/namespase.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: homework
16 changes: 16 additions & 0 deletions kubernetes-networks/service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: webserver-svc
namespace: homework
labels:
app: webserver-svc
spec:
type: ClusterIP
selector:
app: webserver
ports:
- name: websrv-svc-port
protocol: TCP
port: 8000
targetPort: webserver-port
Loading