51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

使用Terraform部署Azure Kubernetes和Container Regsitry

基础设施即代码(Infrastructure as Code,简称 IaC)是一种通过代码管理和自动化部署基础设施的方法。随着云计算的发展,手动配置和管理资源的复杂性与日俱增,IaC 通过将基础设施的配置与应用代码一样进行版本控制和自动化部署,大大提高了部署效率、可靠性和可重复性。

Terraform是目前最流行的 IaC 工具之一,它能通过定义"计划文件"来描述云资源,用户可以用它来管理各种基础设施,包括虚拟机、网络、存储、容器服务等。它的优势在于对多种云平台的支持,无论是 AWS、Azure、Google Cloud,还是本地的私有云,Terraform 都能够帮助用户自动化部署复杂的云环境。

本文将讨论如何使用 Terraform 在 Azure 平台上自动化部署 Kubernetes 集群和镜像存储库(如 Azure Container Registry)。通过将 Terraform 与 Azure 云平台结合,可以轻松实现 Kubernetes 集群的自动化管理、镜像的集中存储与管理,以及其他 Azure 资源的可重复创建和管理。

编写Terraform脚本 {#%E7%BC%96%E5%86%99terraform%E8%84%9A%E6%9C%AC}

定义Provider {#%E5%AE%9A%E4%B9%89provider}

Provider 是 Terraform 连接并操作各种基础设施平台(如云服务、SaaS 应用程序或自定义 API)的组件。它提供了 Terraform 访问这些平台的资源接口,从而允许用户通过 Terraform 配置和管理这些资源。每个 provider 都支持多个具体资源(resource),比如虚拟机、存储桶、数据库等。

                  
                    terraform { # Terraform全局配置
    required_providers {
        azurerm = {
            source = "hashicorp/azurerm" # Provider来源地址
            version = "~> 3.71.0" # Provider的版本要求,~> 表示兼容性符号,即允许使用 3.71.x 系列的任何版本
        }
    }
    required_version = ">= 1.5.6" # Terraform CLI 的最低版本要求
}

provider "azurerm" {
# features:允许开启或关闭某些 Azure Provider 的功能或特性,此字段是必需的,即使不进行任何配置
features {}
}


                  </code>
                </pre>



 
### 创建资源组 {#%E5%88%9B%E5%BB%BA%E8%B5%84%E6%BA%90%E7%BB%84}


 
``````````hcl
                  
                    resource "azurerm_resource_group" "deakinuni" {
  name = var.resource_group_name
  location = var.location
}

                  </code>
                </pre>



 
name是资源组名称,location是资源组实例的物理节点位置,他们的值会在后面的 ` variables.tf ` 配置文件中设置

 
### 创建Container Registry {#%E5%88%9B%E5%BB%BAcontainer-registry}


 
`````````hcl
                  
                    resource "azurerm_container_registry" "container_registry" {
  name = var.app_name
  resource_group_name = var.resource_group_name
  location = var.location
  admin_enabled = true # 启用管理员权限
  sku = "Basic" # 服务定价层级(Stock Keeping Unit),目前使用的是最便宜的Basic级
}

                  </code>
                </pre>



 
### 创建Kubernetes Cluster {#%E5%88%9B%E5%BB%BAkubernetes-cluster}


 
````````hcl
                  
                    resource "azurerm_kubernetes_cluster" "kubernetes_cluster" {
  name = var.app_name
  location = var.location
  resource_group_name = var.resource_group_name
  dns_prefix = var.app_name
  kubernetes_version = var.kubernetes_version

default_node_pool { # 该配置声明节点池的节点数量和节点配置
name = "default"
node_count = 1
vm_size = "standard_B2s"
}


identity { # 使用托管身份,由系统自动分配,这样不需要显式地管理凭据。
type = "SystemAssigned"
}
}


定义Azure角色分配,用于将Azure Container Registry的AcrPull权限分配给Kubernetes集群中的kubelet身份,以便Kubernetes节点能够从容器注册表拉取镜像
======================================================================================================



resource "azurerm_role_assignment" "role_assignment" {


主体ID,在这里是Kubernetes集群中的kubelet组件
================================



principal_id = azurerm_kubernetes_cluster.kubernetes_cluster.kubelet_identity\[0\].object_id


表示角色分配的作用域,即该角色可以访问的资源,在这里是指的是Azure容器注册表的资源ID,即Kubernetes集群的kubelet身份可以访问该容器注册表
===============================================================================



scope = azurerm_container_registry.container_registry.id


分配的权限:AcrPull是一个Azure内置的角色,允许主体从Azure Container Registry中拉取镜像
=============================================================



role_definition_name = "AcrPull"


跳过Azure Active Directory (AAD) 检查,可以加速角色分配过程
============================================



skip_service_principal_aad_check = true
}


                  </code>
                </pre>



 
### 创建变量配置文件variables.tf {#%E5%88%9B%E5%BB%BA%E5%8F%98%E9%87%8F%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6variablestf}


 
```````hcl
                  
                    variable "resource_group_name" {
  default = "deakinuni"
}

variable "location" {
default = "australiaeast"
}


variable "app_name" {
default = "task92c"
}


variable "kubernetes_version" {
default = "1.30.3"
}


                  </code>
                </pre>



 
应用Terraform脚本 {#%E5%BA%94%E7%94%A8terraform%E8%84%9A%E6%9C%AC}
--------------------------------------------------------------


 
### 初始化工作目录 {#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95}


 
在terraform脚本的目录中执行命令

 
``````bash
                  
                    terraform init

                  </code>
                </pre>



 
这条命令会根据脚本配置下载必要的Provider插件,如果配置中使用了外部模块也会下载对应的内容。

 
### 生成并显示基础设施变更计划 {#%E7%94%9F%E6%88%90%E5%B9%B6%E6%98%BE%E7%A4%BA%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E5%8F%98%E6%9B%B4%E8%AE%A1%E5%88%92}


 
`````bash
                  
                    terraform plan

                  </code>
                </pre>



 
该命令帮助用户在应用更改之前,预览 Terraform 配置文件的更改对现有基础设施的影响;此命令不会对基础设置产生实际影响。

 
### 应用配置 {#%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE}


 
````bash
                  
                    terraform apply

                  </code>
                </pre>



 
该命令切实地将terraform配置通过Provider应用到对应的云平台,在不存在语法错误或余额不足等情况下,该命令应该会执行成功。

 
### 撤销部署 {#%E6%92%A4%E9%94%80%E9%83%A8%E7%BD%B2}


 
```bash
                  
                    terraform destroy

                  </code>
                </pre>



 
该命令会根据脚本文件删除全部的基础设施。


```


````


`````


``````


```````


````````


`````````


``````````

赞(0)
未经允许不得转载:工具盒子 » 使用Terraform部署Azure Kubernetes和Container Regsitry