메인 콘텐츠로 이동하기
  1. Posts/

[K3s-01] K3s 설치 및 Terraform 설정 방법

·445 자
K3s

Terraform 예시 #

K3s 공식 요구 사항에 따르면 K3s 노드를 설정하기 위한 몇 가지 전제 조건이 있습니다. 모든 노드에 대해 다음 단계가 필요합니다:

  1. ufw disable
  2. VXLAN 포트 “8472"을 확인

노드의 VXLAN 포트는 전 세계에 노출되어서는 안 되며, 이는 귀하의 클러스터 네트워크가 누구나 접근할 수 있도록 열립니다. 포트 8472에 대한 접근을 비활성화하는 방화벽/보안 그룹 뒤에서 노드를 실행하십시오.

시스템 요구 사항에 따르면 AWS에서 micro 인스턴스 크기가 가능합니다. 그러나 개인적 경험에 따르면 small 인스턴스 크기를 권장합니다.

variable "vpc_id" { default = "vpc-xxx" }
variable "vpc_cidr" { default = "172.31.0.0/16" }
variable "subnet_id" { default = "subnet-xxx" }

resource "aws_instance" "k3s" {
  count = 3
  # ubuntu 22.04
  ami           = "ami-086cae3329a3f7d75"
  instance_type = "t2.small"
  key_name      = aws_key_pair.k3s_key.key_name

  # associate_public_ip_address = false

  network_interface {
    device_index         = 0
    network_interface_id = aws_network_interface.k3s_network_interface[count.index].id
  }

  tags = { Name = "k3s" }
}
resource "aws_network_interface" "k3s_network_interface" {
  count           = 3
  subnet_id       = var.subnet_id
  security_groups = [aws_security_group.k3s_security_group.id]
  tags            = { Name = "k3s-network-interface" }
}
resource "aws_eip" "k3s_static_ip" {
  count             = 3
  instance          = aws_instance.k3s[count.index].id
  network_interface = aws_network_interface.k3s_network_interface[count.index].id
  vpc               = true
}

output "k3s_static_ip" {
  value = aws_eip.k3s_static_ip[*].public_ip
}

# K3s 서버 노드를 위한 인바운드 규칙
# https://docs.k3s.io/kr/installation/requirements#inbound-rules-for-k3s-server-nodes
resource "aws_security_group" "k3s_security_group" {
  name   = "k3s-security-group"
  vpc_id = var.vpc_id

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 2379
    to_port     = 2379
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 2380
    to_port     = 2380
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 6443
    to_port     = 6443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 10250
    to_port     = 10250
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 51820
    to_port     = 51820
    protocol    = "udp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 51821
    to_port     = 51821
    protocol    = "udp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  # VXLAN 포트: 외부에 노출하면 안 됨
  ingress {
    from_port   = 8472
    to_port     = 8472
    protocol    = "udp"
    cidr_blocks = [var.vpc_cidr]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

K3s 설치 #

curl -sfL https://get.k3s.io | sh -
  • Kubectl 설정 파일: /etc/rancher/k3s/k3s.yaml
  • K3S_TOKEN: /var/lib/rancher/k3s/server/node-token
  • kubectl 명령: sudo k3s kubectl ...

Control plane의 URL을 K3S_URL로 제공합니다. 이것은 k3s의 agent 노드로 설정하게 합니다. k3s 에이전트가 추가되는 중에는 kubectl을 실행할 수 없습니다.

curl -sfL https://get.k3s.io | \
K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -

K3s를 설치하는 데는 보다 더 많은 옵션이(매개변수) 존재합니다. 자세한 내용은 https://docs.k3s.io/cli/server 를 참조하십시오. 그러나 이 접근 방식의 단점은 K3s가 실행되는 동안 옵션을 동적으로 구성하기가 쉽지 않다는 것입니다.