使用terraform部署一个kubernetes1.26.12集群

Terraform

用途: Terraform是一种基础设施即代码(IaC)工具,用于自动化云和本地基础设施的创建、更新和删除。它支持多云平台,如AWS、Azure、Google Cloud等,以及本地虚拟化平台。
工作原理: 用户通过编写HCL(HashiCorp Configuration Language)代码描述所需的基础设施资源,例如虚拟机、存储桶、网络配置等。然后,Terraform根据这些代码执行计划,将实际基础设施配置为代码中所描述的状态。

Kubernetes

用途: Kubernetes是一个开源的容器编排平台,用于自动化、部署、扩展和管理容器化应用程序。它提供了一种容器编排的解决方案,使得应用程序可以在一个集群中灵活运行,并自动处理容器的调度、伸缩和故障恢复。
工作原理: 用户将应用程序容器化,并使用Kubernetes定义应用程序的部署、服务、配置等方面的规范。Kubernetes集群负责管理这些容器,确保它们在可用节点上运行,并提供高度可扩展的、自我修复的应用程序部署。

项目地址

https://github.com/huisebug/terraform-kubernetes.git

项目介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
├── down.sh                            #使用containerd下载kubernetes的客户端,如kubectl、kubelet
├── main.tf #terraform 入口tf
├── modules #terraform modules
│   ├── container #container,主要是安装containerd服务
│   │   ├── dnf.tf
│   │   ├── main.tf
│   │   ├── templates
│   │   │   └── config.toml
│   │   └── variables.tf
│   ├── containerimage-pull #使用把后续所需的容器镜像提前pull
│   │   ├── main.tf
│   │   └── variables.tf
│   ├── coredns
│   │   ├── main.tf
│   │   ├── templates
│   │   │   ├── coredns-configmap.yaml
│   │   │   └── coredns.yaml
│   │   └── variables.tf
│   ├── etcd
│   │   ├── main.tf
│   │   ├── templates
│   │   │   ├── etcd.config.yml
│   │   │   └── etcd.yaml
│   │   └── variables.tf
│   ├── init #对centos 8 系统进行系统初始化配置
│   │   ├── dnf.tf
│   │   ├── files
│   │   │   ├── containerd.conf
│   │   │   ├── ipvs.conf
│   │   │   ├── istio.conf
│   │   │   ├── k8s-sysctl.conf
│   │   │   └── limit.conf
│   │   ├── main.tf
│   │   ├── templates
│   │   │   └── chrony.conf
│   │   └── variables.tf
│   ├── k8s-cni #使用kubernetes cni服务,支持calico和flannel
│   │   ├── calico.tf
│   │   ├── kube-flannel.tf
│   │   ├── main.tf
│   │   ├── templates
│   │   │   ├── calico.yaml
│   │   │   └── kube-flannel.yaml
│   │   └── variables.tf
│   ├── k8s-master
│   │   ├── main.tf
│   │   ├── templates
│   │   │   ├── kube-apiserver.yaml
│   │   │   ├── kube-controller-manager.yaml
│   │   │   └── kube-scheduler.yaml
│   │   └── variables.tf
│   ├── kubeconfig
│   │   ├── main.tf
│   │   └── variables.tf
│   ├── kubelet
│   │   ├── main.tf
│   │   ├── templates
│   │   │   ├── kubelet-conf.yml
│   │   │   └── kubelet.service
│   │   └── variables.tf
│   ├── kubelet-bootstrap
│   │   ├── main.tf
│   │   └── variables.tf
│   ├── kubelet-bootstrap-csr
│   │   ├── files
│   │   │   └── kubelet-bootstrap-csr.yaml
│   │   └── main.tf
│   ├── kube-proxy
│   │   ├── main.tf
│   │   ├── templates
│   │   │   └── kube-proxy.yaml
│   │   └── variables.tf
│   ├── kube-vip #kube-apiserver的负载均衡
│   │   ├── main.tf
│   │   ├── templates
│   │   │   └── kube-vip.yaml
│   │   └── variables.tf
│   ├── ping #测试机器连通性
│   │   ├── main.tf
│   │   └── variables.tf
│   └── tls
│   ├── main.tf
│   ├── templates
│   │   └── openssl.cnf
│   └── variables.tf
├── terraform.tfvars #tf配置,需要修改相关信息
├── tf.sh #执行shell脚本,无需执行其他命令,在这里进行交互执行即可
└── variables.tf #tf变量

配置修改介绍terraform.tfvars

主要修改下面的地方

  • 如果你有3台服务器,希望3台都是master节点(默认会安装node节点),那就按照如下格式进行填写,node变量留空
  • 当master超过2台时,说明集群需要负载均衡,这时候就需要在clusterha处填写预留的vip信息
  • console是为了方便对机器系统初始化后进行重启生效,terraform不允许机器重启,后面会特别说明
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    # 作为terraform管理的节点
    console = "192.168.137.100"

    #作为master的节点
    master = [
    {
    ip = "192.168.137.100"
    hostname = "k8s-m1"
    },
    {
    ip = "192.168.137.101"
    hostname = "k8s-m2"
    },
    ]


    #作为node的节点
    node = [
    {
    ip = "192.168.137.102"
    hostname = "k8s-n1"
    },
    ]

    #作为etcd的节点
    etcd = [
    {
    ip = "192.168.137.100"
    clusterName = "k8s-m1"
    },
    {
    ip = "192.168.137.101"
    clusterName = "k8s-m2"
    },
    {
    ip = "192.168.137.102"
    clusterName = "k8s-m3"
    },
    ]

    clusterha = {
    #k8s集群HA vip IP地址
    vip = "192.168.137.99"
    #k8s集群HA vip IP地址子网掩码,一般是32
    vipSubnet = "24"
    }

执行安装

1)执行脚本,脚本会安装terraform,并且进行terraform init

1
bash tf.sh

2)查看tf.sh效果

1
bash tf.sh

依照上述的module会对应序列号,只需要按照序列号传递即可
例如 1 ,然后回车

3)初始化所有机器

1
bash tf.sh    #输入2


最终会提示机器ssh断开,这是正常的,terraform不允许机器重启,此时已经重启了除开terraform console的所有机器

4)重启当前机器
这时候terraform console机器(也就是本机)需要手动重启reboot 或 init 6

5)部署containerd服务

1
bash tf.sh    #输入3


完成后会执行down.sh下载相关的kubernetes二进制包

6)直接执行安装剩余的过程:install

1
bash tf.sh      #输入install  

7)查看节点状态和pod信息

1
2
kubectl get node  
kubectl get pod -A


注意:我这里是2master 1node的集群