Script Terraform di esempio (pod nativo per VCN)
In Compute Cloud@Customer, puoi utilizzare gli script Terraform per automatizzare la creazione di risorse di rete OKE per la rete pod nativa per la VCN.
La maggior parte dei valori mostrati in questi script, come i nomi di visualizzazione delle risorse e i CIDR, sono esempi. È necessario specificare alcune porte come mostrato (vedere Porte di rete cluster del carico di lavoro (pod nativo VCN)), la subnet del pod OKE deve essere denominata pod
e la subnet del piano di controllo OKE deve essere denominata control-plane
. Per i commenti sui valori CIDR, vedere Intervalli CIDR di rete del cluster del carico di lavoro (pod nativo VCN).
variables.tf
Questo file crea diverse variabili utilizzate per configurare le risorse di rete OKE quando si utilizza la rete pod nativa VCN. Molte di queste variabili non sono valori assegnati in questo file. Vengono assegnati valori a una porta e a cinque CIDR. La porta kubernetes_api_port
, 6443, è la porta utilizzata per accedere all'API Kubernetes. Vedere anche Porte di rete cluster del carico di lavoro (Pod VCN nativo). I sei CIDR definiti in questo file si riferiscono alla VCN OKE, alla subnet del pod, alla subnet del worker, alla subnet del load balancer del worker, alla subnet del piano di controllo e alla subnet del load balancer del piano di controllo.
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
Questo file assegna i valori ad alcune delle variabili create in 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
Questo file è necessario per utilizzare il provider OCI. Il file inizializza il modulo OCI utilizzando il file di configurazione del profilo OCI.
provider "oci" { config_file_profile = var.oci_config_file_profile tenancy_ocid = var.tenancy_ocid }
main.tf
Questo file specifica il provider da utilizzare (oracle/oci
), definisce diverse regole dell'elenco di sicurezza e inizializza le variabili locali richieste.
La versione del provider OCI utilizzata deve essere almeno v4.50.0 ma non superiore alla 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
Questo file definisce una VCN, un gateway NAT, un gateway Internet, una tabella di instradamento privato e una tabella di instradamento pubblico. La tabella di instradamento privato è la tabella di instradamento predefinita per 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
Questo file definisce la lista di sicurezza per la subnet pod. Le regole per questa lista di sicurezza sono state definite in altri file Terraform in questo set.
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
Questo file definisce la subnet pod.
Il nome della sottorete pod
deve essere esattamente 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
Questo file definisce le liste di sicurezza sia per la subnet del worker che per la subnet del load balancer del worker. Le regole per queste liste di sicurezza sono state definite in altri file Terraform in questo set.
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
Questo file definisce le subnet del load balancer per lavoratori e lavoratori. La subnet del load balancer worker è denominata 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
Questo file definisce le liste di sicurezza per il piano di controllo e le subnet del load balancer del piano di controllo. Questo file definisce inoltre gli aggiornamenti da apportare alla lista di sicurezza predefinita per 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
Questo file definisce il piano di controllo e le subnet del load balancer del piano di controllo.
Il nome della sottorete kmi
deve essere esattamente 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
]
}