虽然我一直在学习Kubernetes和Terraform,但我一直在构建Node.js微服务示例。
到目前为止一切进展顺利,我可以通过一些命令配置Kubernetes集群并为其部署一些Node.js微服务。
完整的例子可以在GitHub上找到:https://github.com/ashleydavis/nodejs-microservices-example
您可以在此文件中查看群集和pod的完整设置:https://github.com/ashleydavis/nodejs-microservices-example/blob/master/scripts/infrastructure/kubernetes/kubernetes.tf
例如,其中一个pod定义如下:
resource "kubernetes_pod" "web" {
metadata {
name = "nodejs-micro-example-web"
labels {
name = "nodejs-micro-example-web"
}
}
spec {
container {
image = "${var.docker_registry_name}.azurecr.io/web:${var.version}"
name = "nodejs-micro-example-web"
}
}
}
这一切都适用于初始推出,但是当我更改代码并构建新版本的Docker镜像时,我无法让系统更新。
当我这样做时,我更新了您在之前的代码片段中可以看到的变量“version”。
当我随后运行terraform apply
时,它给出了以下错误,说明该pod已经存在:
kubernetes_pod.web: pods "nodejs-micro-example-web" already exists
所以我的问题是如何使用Kubernetes和Terraform推出代码更新(即更新的Docker镜像)并将新的pod部署到群集中? (同时清理旧的豆荚)。
这是以下不正确的行:
name = "nodejs-micro-example-web"
因为Pod的名称在其名称空间内是唯一的。
您几乎从不想部署独立的Pod,因为kubernetes认为这些是短暂的。这通常不是问题,因为Pods是在Deployment
或ReplicationController
(或其他一些人,但你希望得到这个想法)的监督下创建的。在你的情况下,如果^ H ^ H当那个Pod倒下时,kubernetes将不会重新启动它然后它是一个相当不错的赌注,结果将否定kubernetes带来的大量价值。
要回答我自己的问题......我现在在Terraform脚本中使用Kubernetes部署来配置pod,这很有效。
Full code example is on Github。
这是配置:
resource "kubernetes_deployment" "web" {
metadata {
name = "web"
labels {
test = "web"
}
}
spec {
replicas = 1
selector {
match_labels {
test = "web"
}
}
template {
metadata {
labels {
test = "web"
}
}
spec {
container {
image = "${var.docker_registry_name}.azurecr.io/web:${var.version}"
name = "web"
port {
container_port = 80
}
}
}
}
}
}