背景:
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 的两种形式:
- kubeconfig path
- 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 整合之类的?
看了阿里云的也是相似大家都差不多
总结一下
- terraform 能实现很多工作,当初的很多支流的平台都能满足
- terraform 很多时候并不是最优的,不是万能最佳。治理 kubernetes 反正我感觉就没有用 spinnaker 等其余的工具简略
- 只是提前想体验一下 kubernetes 的整合。前面 terraform 还是停留在治理我的基础设施下面.kubernetes 治理我还是不会用 terraform 的