• 【解决了一个小问题】terraform创建service后,如何获取VIP的值?


    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


    创建一个pod后,再为这个pod创建一个对应的service,便于公开一个地址给外部访问。
    有时候需要根据service的vip,再进行下一步的配置。
    下面的代码演示如何获取service的vip:

    # 最核心的配置
    terraform {
      required_providers {
        kubernetes = {
          source  = "hashicorp/kubernetes"
          version = ">= 2.0.0"
        }
      }
    
      backend "local" {
    
      }
    }
    
    # TKE群集的IP和KEY
    provider "kubernetes" {
      config_path = "../tencentyun-cls-xxxx-config.yaml"
    }
    
    # 这里省略创建容器的代码
    
    # 创建POD对应的service
    resource "kubernetes_service" "vm-storage-service" {
      metadata {
        name      = "vm-storage-services"
        namespace = "default"
        labels    = {
              "k8s-app"                    = "vm-storage"
              "qcloud-app"                 = "vm-storage"
            }
        annotations = {
          "description"                                                 = "headless service for vm-storage"
          "service.kubernetes.io/qcloud-loadbalancer-clusterid"         = "cls-xxxxxx"
          "service.kubernetes.io/qcloud-loadbalancer-internal-subnetid" = "subnet-xxxxxx"
        }
      }
    
      spec {
        port {
          name        = "8482-80-tcp"
          port        = "80"
          protocol    = "TCP"
          target_port = "8482"
        }
        selector                = {
              "k8s-app"                    = "vm-storage"   # 这里是绑定的POD
              "qcloud-app"                 = "vm-storage"
            }
        session_affinity        = "None"
        type                    = "LoadBalancer"
        external_traffic_policy = "Cluster"
      }
    }
    
    # 可以在执行完成后输出VIP
    output "load_balancer_ip" {
      value = "${kubernetes_service.vm-storage-service.status.0.load_balancer.0.ingress.0.ip}"  # vm-storage-service 是上面创建的 service 的名字
    }
    
    # config-map的建立方法
    # 可以把vip写入配置
    resource "kubernetes_config_map" "ahfu-vm-storage-vip" {
      metadata {
        name      = "ahfu-vm-storage-vip"
        namespace = "default"
      }
      data = {
          "my.yaml" = "${kubernetes_service.vm-storage-service.status.0.load_balancer.0.ingress.0.ip}"
      }
    }
    

    P.S 能够直接引用output的值呢?代码中死活做不到(只有父module引用子module的情况),希望有研究明白的小伙伴给个例子。

    此外,shell中可以这样引用 terraform apply后的output值:

    terraform output   # apply后,查询所有的output变量
    load-balancer-ip-ahfu = "9.xxx.196.21"
    
    terraform output load-balancer-ip-ahfu   # 根据名字获取output的值
    "9.xxx.196.21"
    

    Have fun!

  • 相关阅读:
    HERO 3
    office的一些应用,
    网页之间的参数传弟
    一个好的数码网站
    C++遍历中删除std::hash_map元素问题
    【转】Asio与shared_ptr的一些注意事项
    delphi的字节对齐
    paypal的即时付款通知参数列表(PDT)
    vs2010下libevent的使用
    mysql 数据库 left join,right join, inner join 知识
  • 原文地址:https://www.cnblogs.com/ahfuzhang/p/16386339.html
Copyright © 2020-2023  润新知