mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 15:22:37 +03:00
homework 15.1: partially complete task 1
This commit is contained in:
@@ -72,3 +72,4 @@
|
|||||||
* [14.3. Карты конфигураций](/src/homework/14-kubernetes-security/14.3)
|
* [14.3. Карты конфигураций](/src/homework/14-kubernetes-security/14.3)
|
||||||
* [14.4. Сервис-аккаунты](/src/homework/14-kubernetes-security/14.4)
|
* [14.4. Сервис-аккаунты](/src/homework/14-kubernetes-security/14.4)
|
||||||
* [14.5. SecurityContext, NetworkPolicies](/src/homework/14-kubernetes-security/14.5)
|
* [14.5. SecurityContext, NetworkPolicies](/src/homework/14-kubernetes-security/14.5)
|
||||||
|
* [15.1. Организация сети](/src/homework/15-cloud-providers/15.1)
|
||||||
|
|||||||
186
src/homework/15-cloud-providers/15.1/readme.md
Normal file
186
src/homework/15-cloud-providers/15.1/readme.md
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
Выполнение [домашнего задания](https://github.com/netology-code/clokub-homeworks/blob/clokub-5/15.1/README.md)
|
||||||
|
по теме "15.1. Организация сети"
|
||||||
|
|
||||||
|
## Q/A
|
||||||
|
|
||||||
|
> Домашнее задание будет состоять из обязательной части, которую необходимо выполнить на провайдере Яндекс.Облако и дополнительной части в AWS по желанию.
|
||||||
|
> Все домашние задания в 15 блоке связаны друг с другом и в конце представляют пример законченной инфраструктуры.
|
||||||
|
> Все задания требуется выполнить с помощью Terraform, результатом выполненного домашнего задания будет код в репозитории.
|
||||||
|
|
||||||
|
### Задача 1
|
||||||
|
|
||||||
|
> Яндекс.Облако
|
||||||
|
|
||||||
|
Вся конфигурация terraform прописана в директории [terraform](./terraform). Для запуска необходимо скопировать файл
|
||||||
|
[variables.tf.example](./terraform/variables.tf.example) в [variables.tf](./terraform/variables.tf) и проставить актуальные
|
||||||
|
значения для всех переменных: `yandex_cloud_id`, `yandex_folder_id`, `yandex_cloud_token`.
|
||||||
|
Последнее значение можно получить выполнив команду `yc iam create-token`.
|
||||||
|
|
||||||
|
> 1. Создать VPC.
|
||||||
|
> - Создать пустую VPC. Выбрать зону.
|
||||||
|
|
||||||
|
В качестве зоны выбрана `ru-central1-a`. Для создания новой VPC необходимо добавить следующий конфиг terraform:
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
resource "yandex_vpc_network" "network-vpc" {
|
||||||
|
name = "network-vpc"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 2. Публичная подсеть.
|
||||||
|
> - Создать в vpc subnet с названием public, сетью 192.168.10.0/24.
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
resource "yandex_vpc_subnet" "public" {
|
||||||
|
name = "subnet-public"
|
||||||
|
zone = "ru-central1-a"
|
||||||
|
network_id = yandex_vpc_network.network-vpc.id
|
||||||
|
v4_cidr_blocks = ["192.168.10.0/24"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> - Создать в этой подсети NAT-инстанс, присвоив ему адрес 192.168.10.254. В качестве image_id использовать fd80mrhj8fl2oe87o4e1
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
resource "yandex_compute_instance" "nat-instance" {
|
||||||
|
name = "nat-instance"
|
||||||
|
|
||||||
|
resources {
|
||||||
|
cores = 2
|
||||||
|
memory = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_disk {
|
||||||
|
initialize_params {
|
||||||
|
image_id = "fd80mrhj8fl2oe87o4e1" # nat-instance-ubuntu-1559218207
|
||||||
|
size = "20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
subnet_id = yandex_vpc_subnet.public.id
|
||||||
|
ip_address = "192.168.10.254"
|
||||||
|
nat = true
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> - Создать в этой публичной подсети виртуалку с публичным IP и подключиться к ней, убедиться что есть доступ к интернету.
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
resource "yandex_compute_instance" "public-instance" {
|
||||||
|
name = "public-instance"
|
||||||
|
|
||||||
|
resources {
|
||||||
|
cores = 2
|
||||||
|
memory = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_disk {
|
||||||
|
initialize_params {
|
||||||
|
image_id = "fd8kdq6d0p8sij7h5qe3" # ubuntu-20-04-lts-v20220822
|
||||||
|
size = "20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
subnet_id = yandex_vpc_subnet.public.id
|
||||||
|
nat = true
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
После применения конфигурации `terraform apply` необходимо подключится к `public-instance` через `ssh`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ssh ubuntu@<public_external_ip>
|
||||||
|
```
|
||||||
|
|
||||||
|
Чтобы убедиться, что есть доступ в интернет, необходимо сделать `curl` запрос на внешний ресурс, например, `google.com`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl -sS -D - -o /dev/null https://google.com
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
HTTP/2 301
|
||||||
|
location: https://www.google.com/
|
||||||
|
<...>
|
||||||
|
```
|
||||||
|
|
||||||
|
> 3. Приватная подсеть.
|
||||||
|
> - Создать в vpc subnet с названием private, сетью 192.168.20.0/24.
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
resource "yandex_vpc_subnet" "private" {
|
||||||
|
name = "subnet_private"
|
||||||
|
zone = "ru-central1-a"
|
||||||
|
network_id = yandex_vpc_network.network-vpc.id
|
||||||
|
v4_cidr_blocks = ["192.168.20.0/24"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> - Создать route table. Добавить статический маршрут, направляющий весь исходящий трафик private сети в NAT-инстанс
|
||||||
|
|
||||||
|
```shell
|
||||||
|
resource "yandex_vpc_route_table" "private_egress" {
|
||||||
|
name = "private_egress"
|
||||||
|
network_id = yandex_vpc_network.network-vpc.id
|
||||||
|
|
||||||
|
static_route {
|
||||||
|
destination_prefix = "0.0.0.0/0"
|
||||||
|
next_hop_address = yandex_compute_instance.nat-instance.network_interface.0.ip_address
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> - Создать в этой приватной подсети виртуалку с внутренним IP, подключиться к ней через виртуалку, созданную ранее и убедиться что есть доступ к интернету
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
resource "yandex_compute_instance" "private-instance" {
|
||||||
|
name = "private-instance"
|
||||||
|
|
||||||
|
resources {
|
||||||
|
cores = 2
|
||||||
|
memory = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_disk {
|
||||||
|
initialize_params {
|
||||||
|
image_id = "fd8kdq6d0p8sij7h5qe3" # ubuntu-20-04-lts-v20220822
|
||||||
|
size = "20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
subnet_id = yandex_vpc_subnet.private.id
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
После `terraform apply` необходимо сначала подключится к машине `nat-instance` по `ssh`,
|
||||||
|
а затем произвести подключение к `private-instance` и выполнить `curl` запрос к внешнему ресурсу.
|
||||||
|
|
||||||
|
Подключение к приватной машине через `nat-instance` можно произвести одной командой `ssh`, используя ключ `-J`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ssh -J ubuntu@<nat_external_ip> ubuntu@<private_internal_ip>
|
||||||
|
|
||||||
|
curl -sS -D - -o /dev/null https://google.com
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
todo Что-то идёт не так и запрос не проходит. tracepath виснет на _gateway шаге (сразу после localhost).
|
||||||
|
```
|
||||||
38
src/homework/15-cloud-providers/15.1/terraform/.gitignore
vendored
Normal file
38
src/homework/15-cloud-providers/15.1/terraform/.gitignore
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# Local .terraform directories
|
||||||
|
**/.terraform/*
|
||||||
|
|
||||||
|
# .tfstate files
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.*
|
||||||
|
|
||||||
|
# Crash log files
|
||||||
|
crash.log
|
||||||
|
crash.*.log
|
||||||
|
|
||||||
|
# Exclude all .tfvars files, which are likely to contain sentitive data, such as
|
||||||
|
# password, private keys, and other secrets. These should not be part of version
|
||||||
|
# control as they are data points which are potentially sensitive and subject
|
||||||
|
# to change depending on the environment.
|
||||||
|
#
|
||||||
|
*.tfvars
|
||||||
|
|
||||||
|
# Ignore override files as they are usually used to override resources locally and so
|
||||||
|
# are not checked in
|
||||||
|
override.tf
|
||||||
|
override.tf.json
|
||||||
|
*_override.tf
|
||||||
|
*_override.tf.json
|
||||||
|
|
||||||
|
# Include override files you do wish to add to version control using negated pattern
|
||||||
|
#
|
||||||
|
# !example_override.tf
|
||||||
|
|
||||||
|
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
|
||||||
|
# example: *tfplan*
|
||||||
|
|
||||||
|
# Ignore CLI configuration files
|
||||||
|
.terraformrc
|
||||||
|
terraform.rc
|
||||||
|
.terraform.lock.hcl
|
||||||
|
|
||||||
|
variables.tf
|
||||||
128
src/homework/15-cloud-providers/15.1/terraform/main.tf
Normal file
128
src/homework/15-cloud-providers/15.1/terraform/main.tf
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
yandex = {
|
||||||
|
source = "yandex-cloud/yandex"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
required_version = ">= 0.13"
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "yandex" {
|
||||||
|
token = var.yandex_cloud_token
|
||||||
|
cloud_id = var.yandex_cloud_id
|
||||||
|
folder_id = var.yandex_folder_id
|
||||||
|
zone = "ru-central1-a"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "yandex_vpc_network" "network-vpc" {
|
||||||
|
name = "network-vpc"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "yandex_vpc_subnet" "public" {
|
||||||
|
name = "subnet-public"
|
||||||
|
zone = "ru-central1-a"
|
||||||
|
network_id = yandex_vpc_network.network-vpc.id
|
||||||
|
v4_cidr_blocks = ["192.168.10.0/24"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "yandex_vpc_subnet" "private" {
|
||||||
|
name = "subnet_private"
|
||||||
|
zone = "ru-central1-a"
|
||||||
|
network_id = yandex_vpc_network.network-vpc.id
|
||||||
|
v4_cidr_blocks = ["192.168.20.0/24"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "yandex_vpc_route_table" "private_egress" {
|
||||||
|
name = "private_egress"
|
||||||
|
network_id = yandex_vpc_network.network-vpc.id
|
||||||
|
|
||||||
|
static_route {
|
||||||
|
destination_prefix = "0.0.0.0/0"
|
||||||
|
next_hop_address = yandex_compute_instance.nat-instance.network_interface.0.ip_address
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "yandex_compute_instance" "nat-instance" {
|
||||||
|
name = "nat-instance"
|
||||||
|
|
||||||
|
resources {
|
||||||
|
cores = 2
|
||||||
|
memory = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_disk {
|
||||||
|
initialize_params {
|
||||||
|
image_id = "fd80mrhj8fl2oe87o4e1" # nat-instance-ubuntu-1559218207
|
||||||
|
size = "20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
subnet_id = yandex_vpc_subnet.public.id
|
||||||
|
ip_address = "192.168.10.254"
|
||||||
|
nat = true
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "yandex_compute_instance" "public-instance" {
|
||||||
|
name = "public-instance"
|
||||||
|
|
||||||
|
resources {
|
||||||
|
cores = 2
|
||||||
|
memory = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_disk {
|
||||||
|
initialize_params {
|
||||||
|
image_id = "fd8kdq6d0p8sij7h5qe3" # ubuntu-20-04-lts-v20220822
|
||||||
|
size = "20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
subnet_id = yandex_vpc_subnet.public.id
|
||||||
|
nat = true
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "yandex_compute_instance" "private-instance" {
|
||||||
|
name = "private-instance"
|
||||||
|
|
||||||
|
resources {
|
||||||
|
cores = 2
|
||||||
|
memory = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_disk {
|
||||||
|
initialize_params {
|
||||||
|
image_id = "fd8kdq6d0p8sij7h5qe3" # ubuntu-20-04-lts-v20220822
|
||||||
|
size = "20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
subnet_id = yandex_vpc_subnet.private.id
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ips" {
|
||||||
|
value = {
|
||||||
|
nat_internal_ip = yandex_compute_instance.nat-instance.network_interface.0.ip_address
|
||||||
|
nat_external_ip = yandex_compute_instance.nat-instance.network_interface.0.nat_ip_address
|
||||||
|
public_internal_ip = yandex_compute_instance.public-instance.network_interface.0.ip_address
|
||||||
|
public_external_ip = yandex_compute_instance.public-instance.network_interface.0.nat_ip_address
|
||||||
|
private_internal_ip = yandex_compute_instance.private-instance.network_interface.0.ip_address
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Заменить на ID своего облака
|
||||||
|
# https://console.cloud.yandex.ru/cloud?section=overview
|
||||||
|
variable "yandex_cloud_id" {
|
||||||
|
default = "b1gu1gt5nqi6lqgu3t7s"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Заменить на Folder своего облака
|
||||||
|
# https://console.cloud.yandex.ru/cloud?section=overview
|
||||||
|
variable "yandex_folder_id" {
|
||||||
|
default = "b1gaec42k169jqpo02f7"
|
||||||
|
}
|
||||||
|
|
||||||
|
# OAuth токен, используемый утилитой yc. Применялся на этапе с packer.
|
||||||
|
variable "yandex_cloud_token" {
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user