скачать книгу бесплатно
essh@kubernetes-master:~/node-cluster$ sudo ./terraform apply
Теперь передадим данные из инфраструктурного модуля Kubernetes в модуль приложений:
essh@kubernetes-master:~/node-cluster$ cat Kubernetes/outputs.tf
output "endpoint" {
value = google_container_cluster.node-ks.endpoint
sensitive = true
}
output "name" {
value = google_container_cluster.node-ks.name
sensitive = true
}
output "cluster_ca_certificate" {
value = base64decode(google_container_cluster.node-ks.master_auth.0.cluster_ca_certificate)
}
essh@kubernetes-master:~/node-cluster$ cat main.tf
//module "kubernetes" {
// source = "ESSch/kubernetes/google"
// version = "0.0.2"
//
// project_name = "node-cluster-243923"
// region = "europe-west2"
//}
provider "google" {
credentials = file("./kubernetes_key.json")
project = "node-cluster-243923"
region = "europe-west2"
}
module "Kubernetes" {
source = "./Kubernetes"
project_name = "node-cluster-243923"
region = "europe-west2"
}
module "nodejs" {
source = "./nodejs"
endpoint = module.Kubernetes.endpoint
cluster_ca_certificate = module.Kubernetes.cluster_ca_certificate
}
essh@kubernetes-master:~/node-cluster$ cat nodejs/variable.tf
variable "endpoint" {}
variable "cluster_ca_certificate" {}
Для проверки балансировки трафика со всех нод запустим NGINX, заменив стандартную страницу на имя хоста. Заменим мы простым вызовом команды и возобновим работу сервера. Для запуска сервера посмотрим в Dockerfile его вызов: CMD ["Nginx", "-g", "daemon off;"], что равносильно вызову Nginx -g 'daemon off;' в командной строке . Как видим, в Dockerfile не используется BASH в качестве среды для запуска, а запускается непосредственно сам сервер, что позволяет в случае в случае падения процесса оболочка будет жить, не давая контейнеру упасть и создаться заново. Но для наших экспериментов вполне подойдёт BASH:
essh@kubernetes-master:~/node-cluster$ sudo docker run -it Nginx:1.17.0 which Nginx
/usr/sbin/Nginx
sudo docker run -it –rm -p 8333:80 Nginx:1.17.0 /bin/bash -c "echo \$HOSTNAME > /usr/share/Nginx/html/index2.html && /usr/sbin/Nginx -g 'daemon off;'"
Теперь создадим наши POD в трёх экземплярах с NGINX, которые Kubernetes будут стараться распределить на разные сервера по умолчанию. Также добавим сервис в качестве балансировщика:
essh@kubernetes-master:~/node-cluster$ cat nodejs/main.tf
terraform {
required_version = ">= 0.12.0"
}
data "google_client_config" "default" {}
provider "kubernetes" {
host = var.endpoint
token = data.google_client_config.default.access_token
cluster_ca_certificate = var.cluster_ca_certificate
load_config_file = false
}
essh@kubernetes-master:~/node-cluster$ cat nodejs/main.tf
resource "kubernetes_deployment" "nodejs" {
metadata {
name = "terraform-nodejs"
labels = {
app = "NodeJS"
}
}
spec {
replicas = 3
selector {
match_labels = {
app = "NodeJS"
}
}
template {
metadata {
labels = {
app = "NodeJS"
}
}
spec {
container {
image = "Nginx:1.17.0"
name = "node-js"
command = ["/bin/bash"]
args = ["-c", "echo $HOSTNAME > /usr/share/Nginx/html/index.html && /usr/sbin/Nginx -g 'daemon off;'"]
}
}
}
}
}
resource "kubernetes_service" "nodejs" {
metadata {
name = "terraform-nodejs"
}
spec {
selector = {
app = kubernetes_deployment.nodejs.metadata.0.labels.app
}
port {
port = 80
target_port = var.target_port
}