init
This commit is contained in:
43
.gitignore
vendored
Normal file
43
.gitignore
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/terraform
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=terraform
|
||||||
|
|
||||||
|
### Terraform ###
|
||||||
|
# Local .terraform directories
|
||||||
|
**/.terraform/*
|
||||||
|
|
||||||
|
# .tfstate files
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.*
|
||||||
|
|
||||||
|
# Crash log files
|
||||||
|
crash.log
|
||||||
|
crash.*.log
|
||||||
|
|
||||||
|
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
|
||||||
|
# password, private keys, and other secrets. These should not be part of version
|
||||||
|
# control as they are data points which are potentially sensitive and subject
|
||||||
|
# to change depending on the environment.
|
||||||
|
*.tfvars
|
||||||
|
*.tfvars.json
|
||||||
|
|
||||||
|
# Ignore override files as they are usually used to override resources locally and so
|
||||||
|
# are not checked in
|
||||||
|
override.tf
|
||||||
|
override.tf.json
|
||||||
|
*_override.tf
|
||||||
|
*_override.tf.json
|
||||||
|
|
||||||
|
# Include override files you do wish to add to version control using negated pattern
|
||||||
|
# !example_override.tf
|
||||||
|
|
||||||
|
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
|
||||||
|
# example: *tfplan*
|
||||||
|
|
||||||
|
# Ignore CLI configuration files
|
||||||
|
.terraformrc
|
||||||
|
terraform.rc
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/terraform
|
||||||
|
|
||||||
|
output.json
|
24
.terraform.lock.hcl
generated
Normal file
24
.terraform.lock.hcl
generated
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# This file is maintained automatically by "terraform init".
|
||||||
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
|
provider "registry.terraform.io/hetznercloud/hcloud" {
|
||||||
|
version = "1.31.1"
|
||||||
|
constraints = "~> 1.31.0"
|
||||||
|
hashes = [
|
||||||
|
"h1:CWXFFa9rOMqAKVBDLS1qrf4PILhF20hCG6lrIt26LOs=",
|
||||||
|
"zh:1ac55d8db278a85ee24a9269b0d85ee138242d9f8d9b9ba8b95dc4a02d659137",
|
||||||
|
"zh:4720d6d96f0603c988bd95c963aa014b0e1b07fdc0b2c76fe3cb521a7ba54f1a",
|
||||||
|
"zh:4c69e86d325de13247b887007b53f712ce53528d98c73f06ff0d757d1c6b52ac",
|
||||||
|
"zh:560517e62d6f14feda622268adc9cfc3045440367b58b73fdd954804b72ae4a3",
|
||||||
|
"zh:792e1b647dd583e42a5b65c104ffde7e8b77f173e08e62bf5ca6b4e901c10ff1",
|
||||||
|
"zh:8046990a2d7b5cb304a4d959196a5dc642b81fd158b1da50d1dd72039ba2093d",
|
||||||
|
"zh:885bb88cd934f68cbc2016c812b99a49fc3a358c19c82d14b9f3adde6d2497af",
|
||||||
|
"zh:9f8728f650a30afc5bba6c97d40decdb3fd846db35e68659a7967262427ffa6b",
|
||||||
|
"zh:a78b7369b6a077c8a82266515f1bbdfd1eaa98fc82fa3e34c1aa1bbadf4e5514",
|
||||||
|
"zh:aaf306f40b7c3f48732437f15366f4ce042e3885b914f19f4652ac9b600899b1",
|
||||||
|
"zh:af533eee1f85ce3126931f0c3c1fe455918f3525079e92e9d85ee391e42ff4fc",
|
||||||
|
"zh:b0ce67d5ee900127a14e616c1f7463b211204627742b4051c1b33f464b97679e",
|
||||||
|
"zh:b743cd1355ba7b37b60a66f79b0e779d8d6c8adc7bdec151d2b14994dec7b809",
|
||||||
|
"zh:cdb210a89af1bf1563f0c933acd14b86a6a01e6289231e317cf5704abf54c9e6",
|
||||||
|
]
|
||||||
|
}
|
26
README.md
Normal file
26
README.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Поднимаем кластер k8s в [любом] облаке
|
||||||
|
|
||||||
|
## Утилиты
|
||||||
|
- [terraform](https://www.terraform.io/downloads)
|
||||||
|
- [kubeone](https://github.com/kubermatic/kubeone/releases/)
|
||||||
|
|
||||||
|
## Видео к курсу
|
||||||
|
- [видео]()
|
||||||
|
|
||||||
|
## Ставим
|
||||||
|
|
||||||
|
- export HCLOUD_TOKEN="<YOUR HCLOUD TOKEN>"
|
||||||
|
- terraform init
|
||||||
|
- terraform apply
|
||||||
|
- terraform output -json > output.json
|
||||||
|
- kubeone apply --manifest kubeone.yaml --tfjson
|
||||||
|
|
||||||
|
## Сносим
|
||||||
|
|
||||||
|
- kubeone reset --manifest kubeone.yaml -t output.json
|
||||||
|
- terraform destroy
|
||||||
|
|
||||||
|
##### Автор
|
||||||
|
- **Vassiliy Yegorov** [vasyakrg](https://git.realmanual.ru)
|
||||||
|
- [школа](realmanual.ru)
|
||||||
|
- [youtube](youtube.com/realmanual)
|
23
kubeone.yaml
Normal file
23
kubeone.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
apiVersion: kubeone.k8c.io/v1beta2
|
||||||
|
kind: KubeOneCluster
|
||||||
|
|
||||||
|
versions:
|
||||||
|
kubernetes: '1.21.12'
|
||||||
|
|
||||||
|
cloudProvider:
|
||||||
|
hetzner: {}
|
||||||
|
external: true
|
||||||
|
|
||||||
|
controlPlane:
|
||||||
|
hosts:
|
||||||
|
- sshPort: 22 # can be left out if using the default (22)
|
||||||
|
sshUsername: root
|
||||||
|
# You usually want to configure either a private key OR an
|
||||||
|
# agent socket, but never both. The socket value can be
|
||||||
|
# prefixed with "env:" to refer to an environment variable.
|
||||||
|
sshPrivateKeyFile: '~/.ssh/demo-cluster'
|
||||||
|
|
||||||
|
apiEndpoint:
|
||||||
|
host: ''
|
||||||
|
port: 6443
|
||||||
|
alternativeNames: []
|
161
main.tf
Normal file
161
main.tf
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 The KubeOne Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
resource "hcloud_ssh_key" "kubeone" {
|
||||||
|
name = "kubeone-${var.cluster_name}"
|
||||||
|
public_key = file(var.ssh_public_key_file)
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_network" "net" {
|
||||||
|
name = var.cluster_name
|
||||||
|
ip_range = var.ip_range
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_firewall" "cluster" {
|
||||||
|
name = "${var.cluster_name}-fw"
|
||||||
|
|
||||||
|
labels = {
|
||||||
|
"kubeone_cluster_name" = var.cluster_name
|
||||||
|
}
|
||||||
|
|
||||||
|
apply_to {
|
||||||
|
label_selector = "kubeone_cluster_name=${var.cluster_name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
rule {
|
||||||
|
description = "allow ICMP"
|
||||||
|
direction = "in"
|
||||||
|
protocol = "icmp"
|
||||||
|
source_ips = [
|
||||||
|
"0.0.0.0/0",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
rule {
|
||||||
|
description = "allow all TCP inside cluster"
|
||||||
|
direction = "in"
|
||||||
|
protocol = "tcp"
|
||||||
|
port = "any"
|
||||||
|
source_ips = [
|
||||||
|
var.ip_range,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
rule {
|
||||||
|
description = "allow all UDP inside cluster"
|
||||||
|
direction = "in"
|
||||||
|
protocol = "udp"
|
||||||
|
port = "any"
|
||||||
|
source_ips = [
|
||||||
|
var.ip_range,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
rule {
|
||||||
|
description = "allow SSH from any"
|
||||||
|
direction = "in"
|
||||||
|
protocol = "tcp"
|
||||||
|
port = "22"
|
||||||
|
source_ips = [
|
||||||
|
"0.0.0.0/0",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
rule {
|
||||||
|
description = "allow NodePorts from any"
|
||||||
|
direction = "in"
|
||||||
|
protocol = "tcp"
|
||||||
|
port = "30000-32767"
|
||||||
|
source_ips = [
|
||||||
|
"0.0.0.0/0",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_network_subnet" "kubeone" {
|
||||||
|
network_id = hcloud_network.net.id
|
||||||
|
type = "server"
|
||||||
|
network_zone = var.network_zone
|
||||||
|
ip_range = var.ip_range
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_server_network" "control_plane" {
|
||||||
|
count = var.control_plane_replicas
|
||||||
|
server_id = element(hcloud_server.control_plane.*.id, count.index)
|
||||||
|
subnet_id = hcloud_network_subnet.kubeone.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_placement_group" "control_plane" {
|
||||||
|
name = var.cluster_name
|
||||||
|
type = "spread"
|
||||||
|
|
||||||
|
labels = {
|
||||||
|
"kubeone_cluster_name" = var.cluster_name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_server" "control_plane" {
|
||||||
|
count = var.control_plane_replicas
|
||||||
|
name = "${var.cluster_name}-control-plane-${count.index + 1}"
|
||||||
|
server_type = var.control_plane_type
|
||||||
|
image = var.image
|
||||||
|
location = var.datacenter
|
||||||
|
placement_group_id = hcloud_placement_group.control_plane.id
|
||||||
|
|
||||||
|
ssh_keys = [
|
||||||
|
hcloud_ssh_key.kubeone.id,
|
||||||
|
]
|
||||||
|
|
||||||
|
labels = {
|
||||||
|
"kubeone_cluster_name" = var.cluster_name
|
||||||
|
"role" = "api"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_load_balancer_network" "load_balancer" {
|
||||||
|
load_balancer_id = hcloud_load_balancer.load_balancer.id
|
||||||
|
subnet_id = hcloud_network_subnet.kubeone.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_load_balancer" "load_balancer" {
|
||||||
|
name = "${var.cluster_name}-lb"
|
||||||
|
load_balancer_type = var.lb_type
|
||||||
|
location = var.datacenter
|
||||||
|
|
||||||
|
labels = {
|
||||||
|
"kubeone_cluster_name" = var.cluster_name
|
||||||
|
"role" = "lb"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_load_balancer_target" "load_balancer_target" {
|
||||||
|
count = var.control_plane_replicas
|
||||||
|
type = "server"
|
||||||
|
load_balancer_id = hcloud_load_balancer.load_balancer.id
|
||||||
|
server_id = element(hcloud_server.control_plane.*.id, count.index)
|
||||||
|
use_private_ip = true
|
||||||
|
depends_on = [
|
||||||
|
hcloud_server_network.control_plane,
|
||||||
|
hcloud_load_balancer_network.load_balancer
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_load_balancer_service" "load_balancer_service" {
|
||||||
|
load_balancer_id = hcloud_load_balancer.load_balancer.id
|
||||||
|
protocol = "tcp"
|
||||||
|
listen_port = 6443
|
||||||
|
destination_port = 6443
|
||||||
|
}
|
83
output.tf
Normal file
83
output.tf
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 The KubeOne Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
output "kubeone_api" {
|
||||||
|
description = "kube-apiserver LB endpoint"
|
||||||
|
|
||||||
|
value = {
|
||||||
|
endpoint = hcloud_load_balancer.load_balancer.ipv4
|
||||||
|
apiserver_alternative_names = var.apiserver_alternative_names
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ssh_commands" {
|
||||||
|
value = formatlist("ssh ${var.ssh_username}@%s", hcloud_server.control_plane.*.ipv4_address)
|
||||||
|
}
|
||||||
|
|
||||||
|
output "kubeone_hosts" {
|
||||||
|
description = "Control plane endpoints to SSH to"
|
||||||
|
|
||||||
|
value = {
|
||||||
|
control_plane = {
|
||||||
|
hostnames = hcloud_server.control_plane.*.name
|
||||||
|
cluster_name = var.cluster_name
|
||||||
|
cloud_provider = "hetzner"
|
||||||
|
private_address = hcloud_server_network.control_plane.*.ip
|
||||||
|
public_address = hcloud_server.control_plane.*.ipv4_address
|
||||||
|
network_id = hcloud_network.net.id
|
||||||
|
ssh_agent_socket = var.ssh_agent_socket
|
||||||
|
ssh_port = var.ssh_port
|
||||||
|
ssh_private_key_file = var.ssh_private_key_file
|
||||||
|
ssh_user = var.ssh_username
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output "kubeone_workers" {
|
||||||
|
description = "Workers definitions, that will be transformed into MachineDeployment object"
|
||||||
|
|
||||||
|
value = {
|
||||||
|
# following outputs will be parsed by kubeone and automatically merged into
|
||||||
|
# corresponding (by name) worker definition
|
||||||
|
"${var.cluster_name}-pool1" = {
|
||||||
|
replicas = var.workers_replicas
|
||||||
|
providerSpec = {
|
||||||
|
sshPublicKeys = [file(var.ssh_public_key_file)]
|
||||||
|
operatingSystem = var.worker_os
|
||||||
|
operatingSystemSpec = {
|
||||||
|
distUpgradeOnBoot = false
|
||||||
|
}
|
||||||
|
cloudProviderSpec = {
|
||||||
|
# provider specific fields:
|
||||||
|
# see example under `cloudProviderSpec` section at:
|
||||||
|
# https://github.com/kubermatic/machine-controller/blob/master/examples/hetzner-machinedeployment.yaml
|
||||||
|
serverType = var.worker_type
|
||||||
|
location = var.datacenter
|
||||||
|
image = var.image
|
||||||
|
networks = [
|
||||||
|
hcloud_network.net.id
|
||||||
|
]
|
||||||
|
# Datacenter (optional)
|
||||||
|
# datacenter = ""
|
||||||
|
labels = {
|
||||||
|
"kubeone_cluster_name" = var.cluster_name
|
||||||
|
"${var.cluster_name}-workers" = "pool1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
terraform.tfvars.example
Normal file
3
terraform.tfvars.example
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
cluster_name = "kubeone-cluster"
|
||||||
|
ssh_public_key_file = "~/.ssh/demo-cluster.pub"
|
||||||
|
ssh_private_key_file = "~/.ssh/demo-cluster"
|
120
variables.tf
Normal file
120
variables.tf
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 The KubeOne Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
variable "cluster_name" {
|
||||||
|
description = "prefix for cloud resources"
|
||||||
|
type = string
|
||||||
|
|
||||||
|
validation {
|
||||||
|
condition = can(regex("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$", var.cluster_name))
|
||||||
|
error_message = "Value of cluster_name should be lowercase and can only contain alphanumeric characters and hyphens(-)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "apiserver_alternative_names" {
|
||||||
|
description = "subject alternative names for the API Server signing cert."
|
||||||
|
default = []
|
||||||
|
type = list(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "worker_os" {
|
||||||
|
description = "OS to run on worker machines"
|
||||||
|
|
||||||
|
# valid choices are:
|
||||||
|
# * ubuntu
|
||||||
|
# * centos
|
||||||
|
default = "ubuntu"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_public_key_file" {
|
||||||
|
description = "SSH public key file"
|
||||||
|
default = "~/.ssh/demo-cluster.pub"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_port" {
|
||||||
|
description = "SSH port to be used to provision instances"
|
||||||
|
default = 22
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_username" {
|
||||||
|
description = "SSH user, used only in output"
|
||||||
|
default = "root"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_private_key_file" {
|
||||||
|
description = "SSH private key file used to access instances"
|
||||||
|
default = "~/.ssh/demo-cluster"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_agent_socket" {
|
||||||
|
description = "SSH Agent socket, default to grab from $SSH_AUTH_SOCK"
|
||||||
|
default = "env:SSH_AUTH_SOCK"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
# Provider specific settings
|
||||||
|
|
||||||
|
variable "control_plane_type" {
|
||||||
|
default = "cx21"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "control_plane_replicas" {
|
||||||
|
default = 1
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "worker_type" {
|
||||||
|
default = "cx31"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "workers_replicas" {
|
||||||
|
default = 3
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "lb_type" {
|
||||||
|
default = "lb11"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "datacenter" {
|
||||||
|
default = "nbg1"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "image" {
|
||||||
|
default = "ubuntu-20.04"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ip_range" {
|
||||||
|
default = "192.168.0.0/16"
|
||||||
|
description = "ip range to use for private network"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "network_zone" {
|
||||||
|
default = "eu-central"
|
||||||
|
description = "network zone to use for private network"
|
||||||
|
type = string
|
||||||
|
}
|
9
versions.tf
Normal file
9
versions.tf
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
terraform {
|
||||||
|
required_version = ">= 1.0.0"
|
||||||
|
required_providers {
|
||||||
|
hcloud = {
|
||||||
|
source = "hetznercloud/hcloud"
|
||||||
|
version = "~> 1.31.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user