当前位置: 首页 > 知识库问答 >
问题:

库伯内特斯-通过Terraform升级库伯内特斯集群版本

陶锋
2023-03-14

我假设没有愚蠢的问题,所以这里有一个我找不到直接答案的问题。

现在的情况

我目前有一个运行1.15的Kubernetes集群。AKS上的x,通过Terraform部署和管理。AKS最近宣布Azure将在AKS上停用Kubernetes的1.15版本,我需要将集群升级到1.16或更高版本。现在,据我所知,直接在Azure中升级集群不会对集群的内容产生任何影响,即节点、豆荚、秘密和当前在那里的所有其他内容,但我无法找到任何正确的答案,如果我通过Terraform升级集群,会发生什么。

潜在问题

那么会出什么问题呢?在我看来,最坏的结果将是整个集群将被摧毁,并将产生一个新的集群。没有豆荚,没有秘密,什么都没有。由于信息太少,我在这里问,看看是否有人对地形和库伯内特斯有更多的经验,可以帮助我。

要总结:

地形版本

Terraform v0.12.17
+ provider.azuread v0.7.0
+ provider.azurerm v1.37.0
+ provider.random v2.2.1

我在做什么

§ terraform init 

//running terrafrom plan with new Kubernetes version declared for AKS

§ terraform plan 

//Following changes are announced by Terraform:



An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  #module.mycluster.azurerm_kubernetes_cluster.default will be updated in-place...

         ...
         ~ kubernetes_version              = "1.15.5" -> "1.16.13"
         ...


Plan: 0 to add, 1 to change, 0 to destroy.

我想发生什么

Terraform将告诉Azure升级现有的AKS服务,而不是在创建新服务之前销毁。我假设这会发生,因为Terraform宣布它将“就地更新”,而不是添加新集群和/或破坏现有集群。

共有2个答案

通迪
2023-03-14

今天我发现了这个问题,我想我也应该补充一下我的经验。我做了以下修改:

  1. 更改了azurerm_kubernetes_cluster下的kubernetes_version从1.16.15-

一个地形平面图显示它将在适当的位置进行更新。然后我执行了一个terraformapply,成功完成kubectl get nodes显示创建了一个额外的节点,但池中的两个节点仍在旧版本上。在Azure Portal中进行进一步检查后,发现仅升级了k8s群集版本,而没有升级节点池的版本。然后,我一次又一次地执行TerraformPlan,它显示默认节点池下的orchestrator\u版本将被更新到位。然后我执行了terraformapply,然后继续升级节点池的版本。它在池中创建了一个附加节点(使用新版本),并将状态设置为NodeSchedulable,同时将池中的现有节点设置为NodeNotSchedulable。然后将NodeNotSchedulable节点替换为具有新k8s版本的新节点,并最终设置为NodeSchedulable。它对两个节点都这样做。之后,升级了所有节点,没有任何明显的停机。

颛孙越
2023-03-14

我想说这表明Terraform方法是非破坏性的,即使在升级过程中有时会有疏忽(但在这个例子中仍然是非破坏性的):https://github.com/terraform-providers/terraform-provider-azurerm/issues/5541

如果您需要对这种更改有更高的信心,那么您可以考虑使用基于Azure的升级方法,将更改刷新回您的状态,并调整代码直到计划生成不会显示任何无法容忍的情况。处理版本的两个azurerm_kubernetes_集群参数可能就是您需要调整的全部。

 类似资料:
  • 我正在尝试让cadence在kubernetes集群上运行。然而,我注意到Cadence服务器初始化中有一个bug,它阻止Cassandra脚本正确初始化模式。https://github.com/uber/cadence/issues/1713:所以我想我会手动完成这一步。我执行了以下步骤- < li >在docker compose上从https://raw . githubuserconte

  • 我一直在努力让DNS插件在CentOS 7.2集群上工作。我使用以下说明安装了群集:http://severalnines.com/blog/installing-kubernetes-cluster-minions-centos7-manage-pods-services 在此配置中,主服务器正在运行:etcd、库贝-调度器、库贝-apiserver和库贝-控制器-管理器。这些节点正在运行:do

  • 我在Kubernetes是个新手。我想知道在kubernetes环境中最好的生产部署场景是什么。 在过去的学派中,我习惯于将Web服务器(例如Nginx或Apache)放在DMZ层,而将其放在其他层(我们称之为层)。这样,只有web服务器在DMZ上,恶意攻击只能在web服务器VM上进行。 据我所知,K8S部署不再需要这种方法;这是因为K8S自己处理网络、吊舱和流量。所以我在考虑最确定的部署方案。

  • 据我所知,作业对象应该在一定时间后收获豆荚。但是在我的GKE集群(库伯内特斯1.1.8)上,“kubectl get pods-a”似乎可以列出几天前的豆荚。 所有这些都是使用乔布斯API创建的。 我确实注意到在使用 kubectl 删除作业后,pod 也被删除了。 我在这里主要担心的是,我将在批量作业中在集群上运行成千上万个pod,并且不想让内部待办系统过载。

  • 我试图设置Kubernetes入口,将外部http流量路由到前端pod(路径/)和后端pod(路径/rest/*),但我总是得到400错误,而不是主nginx索引。html。 所以我在第https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer页尝试了谷歌库伯内特斯的例子,但我总是得到400个错误。有什么想法吗?