Exemples de scripts Terraform pour les ressources de réseau (couche de canal)
Sur Compute Cloud@Customer, vous pouvez utiliser des scripts Terraform pour automatiser la création de ressources de réseau OKE pour le réseau superposé Flannel.
Les scripts Terraform suivants créent les ressources de réseau requises par le moteur Kubernetes (OKE) lorsque vous utilisez le réseau superposé Flannel. Les sections suivantes de cette rubrique présentent d'autres façons de définir ces mêmes ressources réseau.
La plupart des valeurs affichées dans ces scripts, telles que les noms d'affichage des ressources et les blocs CIDR, sont des exemples. Certains ports doivent être spécifiés comme indiqué (voir Ports de réseau en grappe de charge de travail (couche Flannel)) et le sous-réseau de plan de contrôle OKE doit être nommé control-plane
. Voir Intervalles CIDR de réseau en grappe de charge de travail (couche Flannel) pour obtenir des commentaires sur les valeurs CIDR.
Exemples de script Terraform
- variables.tf
- terraform.tfvars
- provider.tf
- main.tf
- oke_vcn.tf
- oke_worker_seclist.tf
- oke_worker_subnet.tf
- oke_kmi_seclist.tf
- oke_kmi_subnet.tf
variables.tf
Ce fichier crée plusieurs variables qui sont utilisées pour configurer les ressources de réseau OKE lorsque vous utilisez le réseau superposé Flannel. Beaucoup de ces variables ne sont pas affectées de valeurs dans ce fichier. Un port et cinq blocs CIDR sont affectés. kubernetes_api_port
, port 6443, est le port utilisé pour accéder à l'API Kubernetes. Voir aussi Ports de réseau en grappe de charge de travail (couche Flannel). Les cinq blocs CIDR définis dans ce fichier concernent le VCN OKE, le sous-réseau de travail, le sous-réseau d'équilibreurs de charge de travail, le sous-réseau de plan de contrôle et le sous-réseau d'équilibreurs de charge de plan de contrôle.
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 "public_ip_cidr" {
description = "Public IP CIDR"
type = string
nullable = false
}
variable "kubernetes_api_port" {
description = "Port used for Kubernetes API"
type = string
default = "6443"
}
variable "vcn_cidr" {
default = "172.31.252.0/23"
}
# 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.252.224/28"
}
# Subnet for KMI load balancer
variable "kmilb_cidr" {
description = "Kubernetes control plane LB subnet CIDR"
default = "172.31.252.240/28"
}
# Subnet for worker nodes, max 128 nodes
variable "worker_cidr" {
description = "Kubernetes worker subnet CIDR"
default = "172.31.253.0/24"
}
# Subnet for worker load balancer (for use by CCM)
variable "workerlb_cidr" {
description = "Kubernetes worker LB subnet CIDR"
default = "172.31.252.0/25"
}
# 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
Ce fichier affecte des valeurs à certaines des variables créées dans 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
Ce fichier est requis pour utiliser le fournisseur OCI. Le fichier initialise le module OCI à l'aide du fichier de configuration du profil OCI.
provider "oci" {
config_file_profile = var.oci_config_file_profile
tenancy_ocid = var.tenancy_ocid
}
main.tf
Ce fichier spécifie le fournisseur à utiliser (oracle/oci
), définit plusieurs règles de liste de sécurité et initialise les variables locales requises.
La version du fournisseur OCI que vous utilisez doit être au moins v4.50.0, mais pas supérieure à 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.vcn_cidr
port_min = 22
port_max = 22
},
{
source = var.workerlb_cidr
port_min = 30000
port_max = 32767
},
{
source = var.workerlb_cidr
port_min = 10256
port_max = 10256
},
{
source = var.kmi_cidr
port_min = 22
port_max = 65535
},
]
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.vcn_cidr
port_min = var.kubernetes_api_port
port_max = var.kubernetes_api_port
},
]
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.worker_cidr
port_min = 1024
port_max = 65535
},
{
source = var.kmi_cidr
port_min = 1024
port_max = 65535
},
]
worker_ingress_udp_rules = [
{
source = var.worker_cidr
port_min = 8285
port_max = 8472
},
{
source = var.kmi_cidr
port_min = 8285
port_max = 8472
},
]
kmi_ingress_udp_rules = [
{
source = var.worker_cidr
port_min = 8285
port_max = 8472
},
{
source = var.kmi_cidr
port_min = 8285
port_max = 8472
},
]
}
oke_vcn.tf
Ce fichier définit un VCN, une passerelle NAT, une passerelle Internet, une table de routage privée et une table de routage publique. La table de routage privée est la table de routage par défaut du 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_worker_seclist.tf
Ce fichier définit les listes de sécurité à la fois pour le sous-réseau de travail et le sous-réseau d'équilibreurs de charge de travail. Les règles de ces listes de sécurité ont été définies dans d'autres fichiers Terraform de ce jeu.
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 = port
for_each = local.worker_ingress_udp_rules
content {
source = port.value.source
source_type = "CIDR_BLOCK"
protocol = "17"
udp_options {
min = port.value.port_min
max = port.value.port_max
}
}
}
}
oke_worker_subnet.tf
Ce fichier définit les sous-réseaux de l'équilibreur de charge du travailleur et du travailleur. Le sous-réseau de l'équilibreur de charge de travail est nommé 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
Ce fichier définit les listes de sécurité pour les sous-réseaux d'équilibreurs de charge du plan de contrôle et du plan de contrôle. Ce fichier définit également les mises à jour à apporter à la liste de sécurité par défaut pour le 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 ? [] : [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
}
}
}
}
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
}
}
}
dynamic "ingress_security_rules" {
iterator = port
for_each = local.kmi_ingress_udp_rules
content {
source = port.value.source
source_type = "CIDR_BLOCK"
protocol = "17"
udp_options {
min = port.value.port_min
max = port.value.port_max
}
}
}
}
oke_kmi_subnet.tf
Ce fichier définit le plan de contrôle et les sous-réseaux de l'équilibreur de charge du plan de contrôle.
Le nom du sous-réseau kmi
doit être exactement 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
]
}