Exemplo de Scripts do Terraform (Pod Nativo da VCN)
No Compute Cloud@Customer, você pode usar scripts do Terraform para automatizar a criação de recursos de rede do OKE para Rede de Pods Nativos da VCN.
A maioria dos valores mostrados nesses scripts, como nomes de exibição de recursos e CIDRs, são exemplos. Algumas portas devem ser especificadas conforme mostrado (consulte Portas de Rede de Clusters de Carga de Trabalho (Pod Nativo da VCN)), a sub-rede de pod do OKE deve ser nomeada como pod
e a sub-rede do plano de controle do OKE deve ser nomeada como control-plane
. Consulte Intervalos CIDR de Rede de Clusters de Carga de Trabalho (Pod Nativo da VCN) para obter comentários sobre valores CIDR.
variables.tf
Esse arquivo cria várias variáveis que são usadas para configurar recursos de rede do OKE quando você está usando a Rede de Pods Nativos da VCN. Muitas dessas variáveis não recebem valores neste arquivo. Uma porta e cinco CIDRs são valores designados. O kubernetes_api_port
, porta 6443, é a porta usada para acessar a API do Kubernetes. Consulte também Portas de Rede de Clusters de Carga de Trabalho (Pod Nativo da VCN). Os seis CIDRs definidos neste arquivo são para VCN do OKE, sub-rede de pod, sub-rede de worker, sub-rede de balanceador de carga de worker, sub-rede de plano de controle e sub-rede de balanceador de carga de plano de controle.
variable "oci_config_file_profile" {
type = string
default = "DEFAULT"
}
variable "tenancy_ocid" {
description = "tenancy OCID"
type = string
nullable = false
}
variable "compartment_id" {
description = "compartment OCID"
type = string
nullable = false
}
variable "vcn_name" {
description = "VCN name"
nullable = false
}
variable "kube_client_cidr" {
description = "CIDR of Kubernetes API clients"
type = string
nullable = false
}
variable "kubernetes_api_port" {
description = "Port used for Kubernetes API"
type = string
default = "6443"
}
# IP network addressing
variable "vcn_cidr" {
default = "172.31.0.0/19"
}
# Subnet for KMIs where kube-apiserver and other control
# plane applications run, max 9 nodes
variable "kmi_cidr" {
description = "Kubernetes control plane subnet CIDR"
default = "172.31.4.0/22"
}
# Subnet for KMI load balancer
variable "kmilb_cidr" {
description = "Kubernetes control plane LB subnet CIDR"
default = "172.31.2.0/23"
}
#Subnet CIDR configured for VCN public IP for NAT in Network
variable "public_ip_cidr" {
description = "Public IP CIDR"
type = string
nullable = false
}
# Subnet for worker nodes, max 128 nodes
variable "worker_cidr" {
description = "Kubernetes worker subnet CIDR"
default = "172.31.8.0/21"
}
# Subnet for worker load balancer (for use by CCM)
variable "workerlb_cidr" {
description = "Kubernetes worker LB subnet CIDR"
default = "172.31.0.0/23"
}
# Subnet for pod communication
variable "pod_cidr" {
description = "Kubernetes pod communication subnet CIDR"
default = "172.31.16.0/20"
}
# Flag to Enable private endpoint
variable "enable_private_endpoint" {
description = "Flag to create private control plane endpoint/service-lb"
type = bool
default = false
nullable = false
}
terraform.tfvars
Esse arquivo atribui valores a algumas das variáveis que foram criadas no variables.tf
.
# name of the profile to use from $HOME/.oci/config oci_config_file_profile = "DEFAULT" # tenancy ocid from the above profile tenancy_ocid = "tenancy_OCID" # compartment in which to build the OKE cluster compartment_id = "compartment_OCID" # display-name for the OKE VCN vcn_name = "oketest"
provider.tf
Este arquivo é necessário para utilizar o provedor da OCI. O arquivo inicializa o módulo do OCI usando o arquivo de configuração de perfil do OCI.
provider "oci" { config_file_profile = var.oci_config_file_profile tenancy_ocid = var.tenancy_ocid }
main.tf
Esse arquivo especifica o provedor a ser usado (oracle/oci
), define várias regras de lista de segurança e inicializa as variáveis locais necessárias.
A versão do provedor do OCI que você usa deve ser pelo menos v4.50.0, mas não maior que v6.36.0.
terraform {
required_providers {
oci = {
source = "oracle/oci"
version = ">= 4.50.0, <= 6.36.0"
# If necessary, you can pin a specific version here
#version = "4.71.0"
}
}
required_version = ">= 1.1"
}
locals {
kube_internal_cidr = "253.255.0.0/16"
worker_lb_ingress_rules = [
{
source = var.kube_client_cidr
port_min = 80
port_max = 80
},
{
source = var.kube_client_cidr
port_min = 443
port_max = 443
}
]
worker_ingress_rules = [
{
source = var.kube_client_cidr
port_min = 30000
port_max = 32767
},
{
source = var.kmi_cidr
port_min = 22
port_max = 22
},
{
source = var.worker_cidr
port_min = 22
port_max = 22
},
{
source = var.worker_cidr
port_min = 10250
port_max = 10250
},
{
source = var.worker_cidr
port_min = 10256
port_max = 10256
},
{
source = var.worker_cidr
port_min = 30000
port_max = 32767
},
{
source = var.workerlb_cidr
port_min = 10256
port_max = 10256
},
{
source = var.workerlb_cidr
port_min = 30000
port_max = 32767
},
{
source = var.kmi_cidr
port_min = 10250
port_max = 10250
},
{
source = var.kmi_cidr
port_min = 10256
port_max = 10256
},
{
source = var.pod_cidr
port_min = 30000
port_max = 32767
},
]
kmi_lb_ingress_rules = [
{
source = local.kube_internal_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.kube_client_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.kmi_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.worker_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.worker_cidr
port_min = 12250
port_max = 12250
},
{
source = var.pod_cidr
port_min = 12250
port_max = 12250
},
]
kmi_ingress_rules = [
{
source = var.kube_client_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.kmilb_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.kmilb_cidr
port_min = 12250
port_max = 12250
},
{
source = var.worker_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.worker_cidr
port_min = 12250
port_max = 12250
},
{
source = var.kmi_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.kmi_cidr
port_min = 2379
port_max = 2381
},
{
source = var.kmi_cidr
port_min = 10250
port_max = 10250
},
{
source = var.kmi_cidr
port_min = 10257
port_max = 10260
},
{
source = var.pod_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
{
source = var.pod_cidr
port_min = 12250
port_max = 12250
},
]
pod_ingress_rules = [
{
source = var.vcn_cidr
port_min = 22
port_max = 22
},
{
source = var.workerlb_cidr
port_min = 10256
port_max = 10256
},
{
source = var.worker_cidr
port_min = 10250
port_max = 10250
},
{
source = var.worker_cidr
port_min = 10256
port_max = 10256
},
{
source = var.worker_cidr
port_min = 80
port_max = 80
},
]
}
oke_vcn.tf
Esse arquivo define uma VCN, um gateway NAT, um gateway de internet, uma tabela de roteamento privada e uma tabela de roteamento pública. A tabela de roteamento privada é a tabela de roteamento padrão da VCN.
resource "oci_core_vcn" "oke_vcn" {
cidr_block = var.vcn_cidr
dns_label = var.vcn_name
compartment_id = var.compartment_id
display_name = "${var.vcn_name}-vcn"
}
resource "oci_core_nat_gateway" "vcn_ngs" {
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
count = var.enable_private_endpoint ? 0:1
display_name = "VCN nat g6s"
}
resource "oci_core_internet_gateway" "vcn_igs" {
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
count = var.enable_private_endpoint ? 0:1
display_name = "VCN i6t g6s"
enabled = true
}
resource "oci_core_default_route_table" "default_private" {
manage_default_resource_id = oci_core_vcn.oke_vcn.default_route_table_id
display_name = "Default - private"
count = var.enable_private_endpoint ? 1:0
}
resource "oci_core_default_route_table" "private" {
count = var.enable_private_endpoint ? 0:1
manage_default_resource_id = oci_core_vcn.oke_vcn.default_route_table_id
display_name = "Default - private"
route_rules {
destination = "0.0.0.0/0"
destination_type = "CIDR_BLOCK"
network_entity_id = oci_core_nat_gateway.vcn_ngs[0].id
}
}
resource "oci_core_route_table" "public" {
count = var.enable_private_endpoint ? 0:1
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
display_name = "public"
route_rules {
destination = "0.0.0.0/0"
destination_type = "CIDR_BLOCK"
network_entity_id = oci_core_internet_gateway.vcn_igs[0].id
}
}
oke_pod_seclist.tf
Este arquivo define a lista de segurança da sub-rede de pod. As regras dessa lista de segurança foram definidas em outros arquivos do Terraform nesse conjunto.
resource "oci_core_security_list" "pod" { compartment_id = var.compartment_id vcn_id = oci_core_vcn.oke_vcn.id display_name = "${var.vcn_name}-pod" dynamic "ingress_security_rules" { iterator = port for_each = local.pod_ingress_rules content { source = port.value.source source_type = "CIDR_BLOCK" protocol = "6" tcp_options { min = port.value.port_min max = port.value.port_max } } } dynamic "ingress_security_rules" { iterator = icmp_type for_each = [0, 8] content { # ping from VCN; unreachable/TTL from anywhere source = var.kmi_cidr source_type = "CIDR_BLOCK" protocol = "1" icmp_options { type = icmp_type.value } } } dynamic "ingress_security_rules" { for_each = var.pod_cidr != null ? [var.pod_cidr] : [] content { source = ingress_security_rules.value source_type = "CIDR_BLOCK" protocol = "all" } } }
oke_pod_subnet.tf
Este arquivo define a sub-rede do pod.
O nome da sub-rede pod
deve ser exatamente pod
.
resource "oci_core_subnet" "pod" { cidr_block = var.pod_cidr compartment_id = var.compartment_id vcn_id = oci_core_vcn.oke_vcn.id display_name = "pod" dns_label = "pod" prohibit_public_ip_on_vnic = true security_list_ids = [ oci_core_default_security_list.oke_vcn.id, oci_core_security_list.pod.id ] }
oke_worker_seclist.tf
Esse arquivo define as listas de segurança da sub-rede do colaborador e da sub-rede do balanceador de carga do colaborador. As regras dessas listas de segurança foram definidas em outros arquivos do Terraform nesse conjunto.
resource "oci_core_security_list" "workerlb" {
display_name = "${var.vcn_name}-workerlb"
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
dynamic "ingress_security_rules" {
iterator = port
for_each = local.worker_lb_ingress_rules
content {
source = port.value.source
source_type = "CIDR_BLOCK"
protocol = "6"
tcp_options {
min = port.value.port_min
max = port.value.port_max
}
}
}
}
resource "oci_core_security_list" "worker" {
display_name = "${var.vcn_name}-worker"
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
dynamic "ingress_security_rules" {
iterator = port
for_each = local.worker_ingress_rules
content {
source = port.value.source
source_type = "CIDR_BLOCK"
protocol = "6"
tcp_options {
min = port.value.port_min
max = port.value.port_max
}
}
}
dynamic "ingress_security_rules" {
iterator = icmp_type
for_each = [0, 8]
content {
# ping from VCN; unreachable/TTL from anywhere
source = var.kmi_cidr
source_type = "CIDR_BLOCK"
protocol = "1"
icmp_options {
type = icmp_type.value
}
}
}
}
oke_worker_subnet.tf
Este arquivo define as sub-redes do worker e do worker load balancer. A sub-rede do balanceador de carga de trabalho é denominada service-lb
.
resource "oci_core_subnet" "worker" {
cidr_block = var.worker_cidr
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
display_name = "worker"
dns_label = "worker"
prohibit_public_ip_on_vnic = true
security_list_ids = [
oci_core_default_security_list.oke_vcn.id,
oci_core_security_list.worker.id
]
}
resource "oci_core_subnet" "worker_lb" {
cidr_block = var.workerlb_cidr
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
display_name = "service-lb"
dns_label = "servicelb"
prohibit_public_ip_on_vnic = var.enable_private_endpoint
route_table_id = var.enable_private_endpoint==false ? oci_core_route_table.public[0].id : oci_core_vcn.oke_vcn.default_route_table_id
security_list_ids = [
oci_core_default_security_list.oke_vcn.id,
oci_core_security_list.workerlb.id
]
}
oke_kmi_seclist.tf
Este arquivo define as listas de segurança para as sub-redes do balanceador de carga do plano de controle e do plano de controle. Esse arquivo também define atualizações para serem feitas na lista de segurança padrão da VCN.
resource "oci_core_default_security_list" "oke_vcn" {
manage_default_resource_id = oci_core_vcn.oke_vcn.default_security_list_id
egress_security_rules {
destination = "0.0.0.0/0"
destination_type = "CIDR_BLOCK"
protocol = "all"
}
dynamic "ingress_security_rules" {
iterator = icmp_type
for_each = [3, 8, 11]
content {
# ping from VCN; unreachable/TTL from anywhere
source = (icmp_type.value == "8" ? var.vcn_cidr : "0.0.0.0/0")
source_type = "CIDR_BLOCK"
protocol = "1"
icmp_options {
type = icmp_type.value
}
}
}
}
resource "oci_core_security_list" "kmilb" {
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
display_name = "${var.vcn_name}-kmilb"
dynamic "ingress_security_rules" {
iterator = port
for_each = local.kmi_lb_ingress_rules
content {
source = port.value.source
source_type = "CIDR_BLOCK"
protocol = "6"
tcp_options {
min = port.value.port_min
max = port.value.port_max
}
}
}
dynamic "ingress_security_rules" {
for_each = var.enable_private_endpoint ? [1] : []
content {
source = var.kmilb_cidr
source_type = "CIDR_BLOCK"
protocol = "6"
tcp_options {
min = var.kubernetes_api_port
max = var.kubernetes_api_port
}
}
}
dynamic "ingress_security_rules" {
for_each = var.enable_private_endpoint ? [] : [0]
content {
source = var.public_ip_cidr
source_type = "CIDR_BLOCK"
protocol = "6"
tcp_options {
min = var.kubernetes_api_port
max = var.kubernetes_api_port
}
}
}
depends_on = []
}
resource "oci_core_security_list" "kmi" {
compartment_id = var.compartment_id
vcn_id = oci_core_vcn.oke_vcn.id
display_name = "${var.vcn_name}-kmi"
dynamic "ingress_security_rules" {
iterator = port
for_each = local.kmi_ingress_rules
content {
source = port.value.source
source_type = "CIDR_BLOCK"
protocol = "6"
tcp_options {
min = port.value.port_min
max = port.value.port_max
}
}
}
}
oke_kmi_subnet.tf
Este arquivo define as sub-redes do balanceador de carga do plano de controle e do plano de controle.
O nome da sub-rede kmi
deve ser exatamente control-plane
.
resource "oci_core_subnet" "kmi" {
cidr_block = var.kmi_cidr
compartment_id = var.compartment_id
display_name = "control-plane"
dns_label = "kmi"
vcn_id = oci_core_vcn.oke_vcn.id
prohibit_public_ip_on_vnic = true
security_list_ids = [
oci_core_default_security_list.oke_vcn.id,
oci_core_security_list.kmi.id
]
}
resource "oci_core_subnet" "kmi_lb" {
cidr_block = var.kmilb_cidr
compartment_id = var.compartment_id
dns_label = "kmilb"
vcn_id = oci_core_vcn.oke_vcn.id
display_name = "control-plane-endpoint"
prohibit_public_ip_on_vnic = var.enable_private_endpoint
route_table_id = var.enable_private_endpoint==false ? oci_core_route_table.public[0].id : oci_core_default_route_table.default_private[0].id
security_list_ids = [
oci_core_default_security_list.oke_vcn.id,
oci_core_security_list.kmilb.id
]
}