关于kubernetes:Terraform与Kubernetes的体验

92次阅读

共计 5145 个字符,预计需要花费 13 分钟才能阅读完成。

背景:
Terraform 体验了腾讯云的 CVM 的基本操作。失常流程要去体验一下其余根底组件的整合比方数据库 redis 等根底组件,还有现有资源的导入。配置文件的合理配置等等等 …. 先插播一下 kubernetes 的体验吧 …… 毕竟我次要的工作环境是 Kubernetes! 也有 tke。其实也能够体验下 tke 的整合?当初先独自体验下原生的 kubernetes 吧!

Terraform 与 Kubernetes 的体验

1. 对于 Documentation 的疾速导读

扫了一眼官网文档 https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs。第一眼上来我就找到了我的关注点:Guides(指南,应该包含如何连贯 kubernetes 集群),几个罕用的 api: apps/v1,core/v1,networking/v1,rbac/v1!

2.terraform 连贯 kubernetes 集群以及简略操作

1. terraform 连贯 kubernetes 集群初始化相干

1. 指定 required_providers

看一眼 Guides:
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/v2-upgrade-guide#using-required_providers-to-test-the-update
首先是插件版本的指定(截至以后:最新文档是 2.9.0, 然而没有加版本号下载的版本是 2.10.0)

2. terraform 连贯 kubernetes 集群的两种形式

参照官网文档:https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/getting-started#provider-setup,看一眼连贯 terraform kubernetes 的两种形式:

  1. kubeconfig path
  2. host and tls 证书


看集体爱好了。我是抉择了第一种连贯形式!

3. 创立工作目录初始化 terraform 并顺便创立一个 namespace

1. 创立工作目录

[root@k8s-master-01 ~]# mkdir terraform-k8s
[root@k8s-master-01 ~]# cd terraform-k8s/

2. 创立 provider.tf

[root@k8s-master-01 terraform-k8s]# cat provider.tf

terraform {
  required_providers {
    kubernetes = {
      source  = "hashicorp/kubernetes"
      version = ">= 2.10.0"
    }
}  
}
provider "kubernetes" {
  config_path    = "~/.kube/config"
  config_context = "kubernetes-admin@kubernetes"
}

resource "kubernetes_namespace" "zhangpeng" {
  metadata {name = "zhangpeng"}
}

3. terraform init

root@k8s-master-01 terraform-k8s]# terraform init


留神:官网文档貌似当初最新是 2.9.0,然而开始我没有加版本好显示有 2.10.0 就间接写 2.10.0 了

4. terraform plan and terraform apply

[root@k8s-master-01 terraform-k8s]# terraform plan


5. 验证 namespace 的创立

[root@k8s-master-01 terraform-k8s]# kubectl get ns

2. terraform 创立一个 deployments? and 绑定一个 ingress 并打印出相干信息?

看了一眼官网文档有点难过 https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment_v1#import。deployment 有两个相干文档 deployment and deployment_v1。目测了一眼只有 resource 下的区别。当初 deployment 应该都是 v1 吧?就用个 v1 的配置文件吧!

1. 创立一个 nginx 的 deployment 利用

参照官网文档。只减少了 namespace 的限定!
cat nginx.tf

resource "kubernetes_deployment_v1" "example" {
  metadata {
    name = "terraform-example"
    namespace = "zhangpeng"
    labels = {test = "MyExampleApp"}
  }

  spec {
    replicas = 3

    selector {
      match_labels = {test = "MyExampleApp"}
    }

    template {
      metadata {
        labels = {test = "MyExampleApp"}
      }

      spec {
        container {
          image = "nginx:1.21.6"
          name  = "example"

          resources {
            limits = {
              cpu    = "0.5"
              memory = "512Mi"
            }
            requests = {
              cpu    = "250m"
              memory = "50Mi"
            }
          }

          liveness_probe {
            http_get {
              path = "/"
              port = 80

              http_header {
                name  = "X-Custom-Header"
                value = "Awesome"
              }
            }

            initial_delay_seconds = 3
            period_seconds        = 3
          }
        }
      }
    }
  }
}
[root@k8s-master-01 terraform-k8s]# terraform plan

[root@k8s-master-01 terraform-k8s]# terraform apply


enter a value 输出 yes!

[root@k8s-master-01 terraform-k8s]# kubectl get pods -n zhangpeng

恩这一步等了良久 差不多两分钟具体起因查看 livenessProbe initialDelaySeconds periodSeconds 相干设置!

[root@k8s-master-01 terraform-k8s]# kubectl get all -n zhangpeng
NAME                                     READY   STATUS    RESTARTS   AGE
pod/terraform-example-78ff4f86d7-bxfwj   1/1     Running   0          6m26s
pod/terraform-example-78ff4f86d7-vb2p7   1/1     Running   0          6m26s
pod/terraform-example-78ff4f86d7-vqm6b   1/1     Running   0          6m26s

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/terraform-example   3/3     3            3           6m26s

NAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/terraform-example-78ff4f86d7   3         3         3       6m26s

2. 创立 sevice 相干配置绑定 deployment

service 相干文档应该是在 core/v1 吧?查看一下, 搜寻栏还是很有用的

cat service.tf

resource "kubernetes_service" "terraform-example-service" {
  metadata {
    name      = "terraform-example-service"
    namespace = kubernetes_namespace.zhangpeng.metadata.0.name
  }
  spec {
    selector = {test = kubernetes_deployment_v1.example.spec.0.template.0.metadata.0.labels.test}
    session_affinity = "ClientIP"
    port {
      port        = 80
      target_port = 80
    }
   type = "ClusterIP"
  }
}

留神:标签的匹配:selector 的标签,namespace deployment 的版本是否带 v1。session_affinity 还有 type 都是 kubernetes 的根底自行脑补!type 的三种形式依照本人环境需要自行设置。
terraform plan and terraform apply

[root@k8s-master-01 terraform-k8s]# terraform plan
[root@k8s-master-01 terraform-k8s]# terraform apply

[root@k8s-master-01 terraform-k8s]# kubectl get svc -n zhangpeng
NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
terraform-example-service   ClusterIP   172.19.253.9   <none>        80/TCP    30s

3. 创立 ingress 绑定 clusterip

对应官网文档:
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/ingress_v1

自己 kuberntes 环境 v1.21.3.ingress 应用的 traefik 代理形式能够应用 networking/v1 的 ingress 还有 traefik 的 ingressroute 还有gateway api? 这里懒得去看 traefik 相干了(traefik 貌似也没有官网的。搜到一个 1.17 版本的非官方的) 间接依照 networking/v1 的 ingress networking/v1 的模板去写 tf 配置文件了:
cat ingress.tf

resource "kubernetes_ingress_v1" "nginx_ingress_test" {
  metadata {
    name = "nginx-ingress-test"
    namespace = kubernetes_namespace.zhangpeng.metadata.0.name
  annotations = {
    "kubernetes.io/ingress.class" = "traefik"
    "traefik.ingress.kubernetes.io/router.entrypoints" = "web"

  }
}

  spec {
    rule {
      host =  "nginx-ingress-test.xxxx.com"
      http {
        path {
          path =  "/"
          backend {
            service {
              name = "terraform-example-service"
              port {number = 80}
            }
          }
        }
      }
    }

  }
}

强调一下:这里原本想设置 pathType,然而设置了就有报错。我想看一下默认的是什么!
terraform plan and terraform apply

[root@k8s-master-01 terraform-k8s]# terraform plan
[root@k8s-master-01 terraform-k8s]# terraform apply


pathType: ImplementationSpecific!抽时间看一下这个 ImplementationSpecific



web 拜访测试一下:


对于我的 ingress traefik 清参照:Kubernetes 1.20.5 装置 traefik 在腾讯云下的实际
storage 这里看了下不太适合去做。rbac 也不想太多的演示了!

3. 顺便看一下腾讯云的 tke 的文档

看了一眼 tke 相干文档也没有什么太深刻想看的,比方 cbs 快存储 clb 整合之类的?

看了阿里云的也是相似大家都差不多

总结一下

  1. terraform 能实现很多工作,当初的很多支流的平台都能满足
  2. terraform 很多时候并不是最优的,不是万能最佳。治理 kubernetes 反正我感觉就没有用 spinnaker 等其余的工具简略
  3. 只是提前想体验一下 kubernetes 的整合。前面 terraform 还是停留在治理我的基础设施下面.kubernetes 治理我还是不会用 terraform 的

正文完
 0