Scripts de Terraform de ejemplo ( Pod nativo de VCN)
En Compute Cloud@Customer, puede utilizar scripts de Terraform para automatizar la creación de recursos de red de OKE para redes de pod nativo de VCN.
La mayoría de los valores que se muestran en estos scripts, como nombres mostrados de recursos y CIDR, son ejemplos. Algunos puertos se deben especificar como se muestra (consulte Puertos de red de cluster de carga de trabajo ( Pod nativo de VCN)), la subred del pod de OKE debe tener el nombre pod
y la subred del plano de control de OKE debe tener el nombre control-plane
. Consulte Rangos de CIDR de red de cluster de carga de trabajo ( Pod nativo de VCN) para obtener comentarios sobre los valores de CIDR.
variables.tf
Este archivo crea varias variables que se utilizan para configurar los recursos de red de OKE cuando se utiliza la red de pods nativos de VCN. Muchas de estas variables no tienen asignados valores en este archivo. Se asignan valores a un puerto y cinco CIDR. kubernetes_api_port
, puerto 6443, es el puerto que se utiliza para acceder a la API de Kubernetes. Consulte también Puertos de red de cluster de carga de trabajo ( Pod nativo de VCN). Los seis CIDR definidos en este archivo son para la VCN de OKE, la subred de pod, la subred de trabajador, la subred de equilibrador de carga de trabajador, la subred de plano de control y la subred de equilibrador de carga de plano de control.
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
Este archivo asigna valores a algunas de las variables que se crearon en 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 archivo es necesario para utilizar el proveedor de OCI. El archivo inicializa el módulo OCI mediante el archivo de configuración de perfil de OCI.
provider "oci" { config_file_profile = var.oci_config_file_profile tenancy_ocid = var.tenancy_ocid }
main.tf
Este archivo especifica el proveedor que se va a utilizar (oracle/oci
), define varias reglas de lista de seguridad e inicializa las variables locales necesarias.
La versión del proveedor de OCI que utilice debe ser al menos v4.50.0 pero no superior a 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
Este archivo define una VCN, un gateway de NAT, un gateway de Internet, una tabla de rutas privada y una tabla de rutas pública. La tabla de rutas privadas es la tabla de rutas por defecto para la 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 archivo define la lista de seguridad para la subred de pod. Las reglas de esta lista de seguridad se han definido en otros archivos de Terraform de este juego.
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 archivo define la subred de pod.
El nombre de la subred pod
debe ser exactamente 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
Este archivo define las listas de seguridad tanto para la subred de trabajador como para la subred de equilibrador de carga de trabajador. Las reglas para estas listas de seguridad se han definido en otros archivos de Terraform de este juego.
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 archivo define las subredes del equilibrador de carga de trabajador y trabajador. La subred del equilibrador de carga del trabajador se denomina 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 archivo define las listas de seguridad para las subredes del equilibrador de carga del plano de control y del plano de control. Este archivo también define las actualizaciones que se deben realizar en la lista de seguridad por defecto para la 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 archivo define las subredes del equilibrador de carga del plano de control y del plano de control.
El nombre de la subred kmi
debe ser exactamente 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
]
}