Chạy ứng dụng Windows trên cụm EKS nội bộ

Các ứng dụng cũ trong doanh nghiệp thường được xây dựng để chạy trên hệ điều hành Windows, nhiều khách hàng muốn dịch chuyển các ứng dụng đó lên Kubernetes bên cạnh các ứng dụng Linux để tăng khả năng mở rộng. Bên cạnh đó, một cụm Amazon Elastic Kubernetes Service (Amazon EKS) với điểm kết nối nội bộ (private endpoint) sẽ phù hợp đối với những ứng dụng có tiêu chuẩn về bảo mật cao, .

Bài viết này sẽ hướng dẫn cách triển khai các worker node chạy hệ điều hành Windows vào trong một cụm EKS có sẵn và cách kiểm thử để đảm bảo các container chứa các ứng dụng Windows chạy tốt trên các node này. Chúng ta sẽ tìm hiểu cách triển khai các node này một cách thủ công, từ đó điều chỉnh lại để sử dụng infrastructure as code (IaC). Cụ thể, bài viết sẽ hướng dẫn cách sử dụng Terraform EKS để thêm worker node vào cụm Amazon EKS.

Bên cạnh đó, một phiên bản Terraform để hiện thực hoá một cụm Amazon EKS nội bộ kết hợp các worker node chạy hệ điều hành Windows và Linux cũng được cung cấp tại AWS-Samples repository.

Sau bài viết này, bạn sẽ có thể dịch chuyển các ứng dụng Windows lên một cụm EKS với các node tương tác với control plane thông qua một điểm giao tiếp nội bộ.

Tổng quan về giải pháp

Các bước thực hiện

Trong bài viết này, chúng ta sẽ thực hiện các bước sau: 

  • Bật Windows support trên một cụm EKS.
  • Viết các đoạn EC2 user data script cần thiết cho các Windows worker node.
  • Cấp phép cho các Windows worker node giao tiếp với cụm EKS qua mạng nội bộ. 
  • Chạy các máy ảo Windows với user data script. 
  • Gắn các thẻ (tag) cần thiết cho máy ảo EC2. 
  • Thực hiện kiểm thử với một Windows Pod. 
  • Bật Windows support trên EKS và thêm một Windows node group với Terraform. 

Yêu cầu

Để thực hiện các bước như trong bài viết này, bạn cần tạo sẵn các tài nguyên như sau:

 Bật private endpoint và tắt public endpoint.

o   Tạo sẵn các VPC endpoint cần thiết. (Xem các endpoint cần thiết tại tài liệu Các VPC endpoint cho cụm EKS nội bộ).

o   Cụm EKS đang chạy các phiên bản được hỗ trợ, chi tiết ở tài liệu Cách bật Windows support cho một cụm EKS.

  • Một bastion host có thể được truy cập từ máy trạm của bạn dùng để xử lý sự cố.

o   bastion host phải cài đặt sẵn kubectl với quyền truy cập vài cụm EKS.

  •  Các security group cho phép truy cập giữa bastion host và các worker nodes trong cụm EKS.

 Sử dụng cổng 3389 (RDP) để truy cập vào các Windows worker node.

Thủ thuật: Chúng tôi khuyến nghị tạo và sử dụng một VPC và cụm EKS mới để thực hành theo bài viết này. Một số bước như chỉnh sửa ConfigMap aws-auth có thể ảnh hưởng đến các node, người dùng và ứng dụng khác bên trong cụm. Việc sử dụng VPC và cụm EKS mới giúp giảm thiểu các rủi ro này trong quá trình thực hành.

Bạn có thể triển khai một cụm EKS đảm bảo tất cả các điều kiện trên bằng cách sử dụng mẫu Terraform được cung cấp tại AWS samples repository: private-eks-for-windows-workloads-with-terraform

Bật Windows support trên cụm EKS

Windows support for an existing EKS cluster needs to be enabled by following how to enable Windows support on an EKS cluster. This is mandatory, and the necessary steps are dependent on the platform version of the EKS cluster, which is shown in the documentation. This blog post uses the new Windows support implementation, which is mostly integrated into the Control Plane. It is recommended to use an EKS cluster with at least platform version eks.3 for 1.21.

Tài liệu Cách bật Windows support trên cụm EKS hướng dẫn cách bật Windows support cho một cụm EKS có sẵn, chúng ta cần phải thực hiện tác vụ này trước khi chuyển sang các bước tiếp theo. 

Các bước thực hiện có thể thay đổi tuỳ thuộc vào phiên bản của cụm EKS, và được hướng dẫn cụ thể ở tài liệu trên. Bài viết này sử dụng phiên bản Windows support mới, thường được tích hợp sẵn trong Control Plane. Theo khuyến nghị, ta nên sử dụng cụm EKS với phiên bản tối thiểu là eks.3 với Kubernetes phiên bản 1.21.

Viết các đoạn EC2 user data script cần thiết cho các Windows worker node

Phiên bản Windows AMI được tối ưu cho EKS được cung cấp bởi AWS đã bao gồm sẵn các đoạn script và file thực thi cần thiết để máy ảo có thể tham gia vào cụm EKS.

Bài viết này sẽ sử dụng phiên bản AMI Amazon EKS optimized Windows server core.

PowerShell

C:\Program Files\Amazon\EKS\Start-EKSBootstrap.ps1

C:\Program Files\Kubernetes\kubelet.exe

C:\Program Files\Kubernetes\kube-proxy.exe

File Start-EKSBootstrap.ps1 kích hoạt và cấu hình các cấu phần cần thiết trên máy ảo như là kubelet hay kube-proxy để tham gia vào cụm EKS.

Câu lệnh sau có thể được dùng trên một node để tham gia vào một cụm EKS: 

PowerShell

./Start-EKSBootstrap.ps1 -EKSClusterName "<EKS cluster name>" -APIServerEndpoint "<EKS API endpoint>" -Base64ClusterCA "<Certificate data>"

EKS cluster name: Tên cụm EKS.

EKS API endpoint: địa chỉ điểm kết nối nội bộ của cụm.

Certificate data: Chứng chỉ base64 encoded của cụm.

Đoạn mã khởi tại này sẽ tạo và khởi chạy các dịch vụ kubelet và kubet-proxy trên máy Windows với cấu hình chỉ định.

Lấy EKS API endpoint và certificate data với AWS Console 
  1. Truy cập EKS console. 
  2. Từ menu điều hướng, trong phần Amazon EKS, chọn Clusters
  3. Mở cụm EKS cần thêm các node Windows. 
  4. Ở thanh điều hướng, chọn Configurations. 
  5. Tiếp tục chọn Details.
  6. Ghi chú địa chỉ API server endpoint và certificate authority.
Lấy EKS API endpoint với AWS CLI 

1.      Mở cửa sổ lệnh trên máy trạm của bạn hoặc bastion host có quyền truy cập vào tài khoản AWS chứa cụm EKS. 

2.      Chạy câu lệnh sau: 

aws eks describe-cluster --region <cluster region> --name <EKS cluster name> --query "cluster.endpoint"

3.      Ghi chú lại kết quả trả về.

Lấy EKS certificate data với AWS CLI

1.      Mở cửa sổ lệnh trên máy trạm của bạn hoặc bastion host có quyền truy cập vào tài khoản AWS chứa cụm EKS. 

2.      Chạy câu lệnh sau: 

aws eks describe-cluster --region <cluster region> --name <EKS cluster name> --query "cluster.certificateAuthority"

3.      Kết quả trả về sẽ có dạng như sau:

JSON

{
     "data": "<certificate data>"
}

4.      Ghi chú lại giá trị trong phần <certificate data>.

Đoạn mã user data đầy đủ để khởi tạo máy ảo EC2 sẽ có dạng như sau: 

<powershell> 
cd '\Program Files\Amazon\EKS'
./Start-EKSBootstrap.ps1 -EKSClusterName '<EKS cluster name>' -APIServerEndpoint '<EKS API endpoint>' -Base64ClusterCA '<Certificate data>' 
</powershell>

Thay thế <EKS API endpoint> và <Certificate data> tương ứng với các giá trị chúng ta thu thập ở các bước trên. Ghi chú lại phần user data này để sử dụng ở các bước sau. 

Cấp phép cho các Windows worker node giao tiếp với cụm EKS qua mạng nội bộ

Các node, Linux cũng như Windows, cần được cấp quyền truy cập các tài nguyên cần thiết cho kube-proxy. Các máy này phải được gắn cluster role system:node-proxier (chi tiết xem tại Role cho các cấu phần cốt lõi). Vì vậy, mỗi cụm EKS được tạo sẵn một cluster role binding có tên là eks:kube-proxy-windows.

Chạy câu lệnh sau để xem thông tin chi tiết về cluster role binding này: 

kubectl get clusterrolebinding eks:kube-proxy-windows -o yaml

Để cho phép các node Windows truy cập vào các cấu phần mạng cần thiết, thêm đoạn cấu hình sau vào cuối ConfigMap aws-auth, trong phần mapRoles của namespace kube-system: 

YAML

- rolearn: arn:aws:iam::444455556666:role/Admin
  username: system:node:{{EC2PrivateDNSName}}
  groups:
    - system:bootstrappers
    - system:nodes
    - eks:kube-proxy-windows

Thay phần rolearn bằng ARN node role của bạn. Truy cập tài liệu Cấp phép cho IAM user và role truy cập vào cụm EKS để tìm hiểu chi tiết về ConfigMap aws-auth.

Bạn cũng có thể tải về file cấu hình mẫu và chỉnh sửa tương ứng:

curl -o aws-auth-cm-windows.yaml https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-10-29/aws-auth-cm-windows.yaml

Tuy nhiên, file mẫu này không chứa những role và user khác được tạo sẵn khi khởi tạo cluster. 

Chạy các máy ảo Windows với user data script

  1. Mở cửa số Amazon EC2 console. 
  2. Trong phần điều hướng, bên dưới Instances, chọn Instances.
  3. Chọn Launch Instances.
  4. Trong phần Name and tags, chọn Add additional tags.
  5. Chọn Add tag để gắn thẻ.
  6. Ở phần Key, điền kubernetes.io/cluster/<cluster-name>, thay <cluster-name> bằng tên của cụm EKS. 
  7. Ở phần Value, điền owned.
  8. Trong thanh tìm kiếm AMI, gõ Windows_Server-2019-English-Core-EKS_Optimized.
  9. Trong phần điều hướng, chọn Community AMIs.
  10. Chọn AMI tương ứng với phiên bản Kubernetes của bạn. Với Kubernetes 1.21, tìm Windows_Server-2019-English-Core-EKS_Optimized-1.21. 
  11. Chọn instance type mà bạn cần, ví dụ, t3.xlarge. Lưu ý tránh các instance không được hỗ trợ trong tài liệu Windows support.
  12. Trong phần Key pair (login), chọn một key pair có sẵn hoặc tạo một key pair mới.
  13. Trong phần Network settings, chọn VPC mà bạn đặt cụm EKS.
  14. Trong phần Subnet, chọn một private subnet bạn sử dụng cho cụm EKS.
  15. Trong phần Firewall (security groups), chọn Create security group.
  16. Ở phần Security group rule 1, chọn Remove
  17. Chọn Add security group rule.
  18. Chọn Type là rdp, và Source là security group ID của bastion host.
  19. Chọn Add security group rule.
  20. Chọn Type là All traffic, và Source là security group ID của các Linux worker node.
  21. Chọn Add security group rule.
  22. Chọn Type là Custom TCP, Port là 10250, và Source là security group ID của cụm EKS.
  23. Chọn Add security group rule.
  24. Chọn Type là HTTPS, và Source là security group ID của cụm EKS.
  25. Chọn Advanced details.
  26. Trong phần IAM instance profile, chọn instance profile (IAM role) đang dùng cho các Linux worker nodes.
  27. Trong phần User data, điền user data script đã ghi chú lại từ các bước trước. 
  28. Chọn Launch instance.

Cần đảm bảo security group gắn với các máy ảo Windows và Linux cho phép all traffic phục vụ cho việc giao tiếp giữa các node trong cụm EKS. Cùng với đó, đảm bảo rằng security group của cụm EKS cho phép kết nối HTTPS từ security group của các node Windows. Chi tiết xem tại Những vấn đề cần xem xét về security group của Amazon EKS.

Thẻ (tag) là cấu phần cần thiết dùng để cung cấp thông tin cho đoạn mã khởi tạo thông qua EC2 instance metadata.

Sau vài phút, máy ảo sẽ được khởi tạo và xuất hiện trong eks cluster:

kubectl get nodes

Kiểm thử với một ứng dụng Windows mẫu 

Tham khảo tài liệu Triển khai ứng dụng mẫu để triển khai ứng dụng Windows.

Chỉnh sửa ứng dụng Windows để chạy trên môi trường EKS nội bộ
  1. Tải về file eks-sample-deployment, được chuẩn bị sẵn để thực thi trên môi trường EKS nội bộ. 
  2. Triển khai ứng dụng Windows mẫu.
  3. Triển khai service cho ứng dụng mẫu theo hướng dẫn trong tài liệu Triển khai ứng dụng mẫu.

Các bước trên tại ra một máy chủ web độc lập không phục thuộc vào một cấu phần công khai nào khác và được trích ra từ  Webserver.yaml.

Container image sử dụng trong ứng dụng mẫu ở trên tương ứng với AMI Windows_Server-2019-English-Core-EKS_Optimized-*. Nếu bạn sử dụng một phiên bản Windows khác, hãy thay thế phần “image” trong file .yaml bằng tag và phiên bản kernel tương ứng. 

Sau khi ứng dụng và service được triển khai, chạy các câu lệnh sau để kiểm thử.

Kiểm thử máy chủ web nội bộ từ bên trong Windows Pod:

1.      Mở cửa sổ lệnh từ bastion host.

2.      Chạy câu lệnh sau từ bastion host. 

kubectl exec -it -n eks-sample-app <windows-pod> powershell

3.      Chạy câu lệnh sau từ cửa sổ PowerShell của Windows Pod vừa được mở ra. 

curl eks-sample-windows-service -UseBasicParsing

Nếu ứng dụng hoạt động tốt, chúng ta sẽ nhận được phản hồi từ máy chủ web. Trong lần truy cập đầu tiên, máy chủ web có thể cần vài giây để phản hồi. 

Việc kiểm thử trên giúp chúng ta xác nhận một số điểm như sau:

  • DNS hoạt động tốt bên trong Windows Pod.
  • Cấu hình mạng giữa các subnet và pod hoạt động tốt. 
  • Ứng dụng được triển khai trên đúng node. 

Bật Windows support trên EKS và thêm một Windows node group với Terraform

Đoạn mã sau sử dụng Terraform eks module phiên bản 18.6.0 để tự động hoá các bước chúng ta đã thực hiện trong bài viết này. Để xem ví dụ hoàn chỉnh của ví dụ này, truy cập aws-samples repository.

Bật Windows support cho cụm EKS

Đoạn mã này cho phép cụm EKS chạy các ứng dụng Windows bằng cách sử dụng các file additional_roles_aws_auth.yamlvpc-resource-controller-configmap.yaml:

### Prerequisites for Windows worker node enablement
data "aws_eks_cluster_auth" "this" {
  name = module.eks.cluster_id
}

locals {
  kubeconfig = yamlencode({
    apiVersion      = "v1"
    kind            = "Config"
    current-context = "terraform"
    clusters = [{
      name = module.eks.cluster_id
      cluster = {
        certificate-authority-data = module.eks.cluster_certificate_authority_data
        server                     = module.eks.cluster_endpoint
      }
    }]
    contexts = [{
      name = "terraform"
      context = {
        cluster = module.eks.cluster_id
        user    = "terraform"
      }
    }]
    users = [{
      name = "terraform"
      user = {
        token = data.aws_eks_cluster_auth.this.token
      }
    }]
  })
}
### Apply changes to aws_auth
### Windows worker node cluster enablement:  https://docs.aws.amazon.com/eks/latest/userguide/windows-support.html
resource "null_resource" "apply" {
  triggers = {
    kubeconfig = base64encode(local.kubeconfig)
    cmd_patch  = <<-EOT
      kubectl create configmap aws-auth -n kube-system --kubeconfig <(echo $KUBECONFIG | base64 --decode)
      kubectl patch configmap/aws-auth --patch "${module.eks.aws_auth_configmap_yaml}" -n kube-system --kubeconfig <(echo $KUBECONFIG | base64 --decode)
      kubectl get cm aws-auth -n kube-system -o json --kubeconfig <(echo $KUBECONFIG | base64 --decode) | jq --arg add "`cat yaml-templates/additional_roles_aws_auth.yaml`" '.data.mapRoles += $add' | kubectl apply --kubeconfig <(echo $KUBECONFIG | base64 --decode) -f -
      kubectl apply --kubeconfig <(echo $KUBECONFIG | base64 --decode) -f yaml-templates/vpc-resource-controller-configmap.yaml
    EOT
  }
    provisioner "local-exec" {
    interpreter = ["/bin/bash", "-c"]
    environment = {
      KUBECONFIG = self.triggers.kubeconfig
    }
    command = self.triggers.cmd_patch
  }
}
Tự động lựa chọn Windows AMI ID

Amazon EKS optimized Windows AMIs được cập nhật thường xuyên với các bản vá bảo mật mới nhất. Đoạn mã sau cho phép chúng ta chọn phiên bản Windows AMI mới nhất khi khởi chạy: 

data "aws_ami" "win_ami" {
    most_recent = true
    owners = ["amazon"]
    filter {
        name = "name"
        values = ["Windows_Server-2019-English-Core-EKS_Optimized-${var.eks_cluster_version}-*"]
    }
}
Tạo self-managed Windows node group bên trong EKS

Đoạn mã sau là ví dụ về cách thêm một Windows self_managed_node_group vào EKS module có sẵn.

module "eks" {
  source       = "terraform-aws-modules/eks/aws"
  version = "18.6.0"
  ...
self_managed_node_groups = {
    windows = {
      platform = "windows"
      name = "windows"
      public_ip    = false
      instance_type = var.instance_type_win
      key_name = "<available-key-in-region>"
      desired_size = var.desired_size_win
      max_size = var.max_size_win
      min_size = var.min_size_win
      ami_id = data.aws_ami.win_ami.id
    }
}
}

Terraform eks module sử dụng một template bao gồm các đoạn mã khởi tạo tương tự như phiên bản sử dụng trong bài viết này. Xem chi tiết tại windows_user_data.tpl.

Dọn dẹp

Để tránh phát sinh các khoản phí trong tương lai, bạn cần xoá các tài nguyên được tạo ra khi thực hành theo bài viết này. Nếu bạn tạo các máy ảo EC2 thủ công như mô tả trong bài viết, bạn đơn giản chỉ cần xoá các máy ảo này đi. Nếu bạn tạo ra cụm EKS với mã Terraform được cung cấp, bạn cần chạy câu lệnh sau để xoá các tài nguyên được quản trị bởi Terraform:

terraform destroy -var-file main-input.tfvars

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu cách chạy các worker node Windows trên một cụm EKS nội bộ. Chúng ta đã tạo ra các Windows worker node với các đoạn mã EC2 user data cần thiết. Sau đó, chúng ta cũng kiểm thử ứng dụng Windows trên cụm EKS để đảm bảo việc cấu hình hoàn tất và cụm EKS có thể sử dụng cho ứng dụng thực tế. 

Cuối cùng, chúng ta cũng đã tìm hiểu cách sử dụng Terraform để bật Windows support và tạo một Windows node group. Phiên bản Terraform hoàn thiện để hiện thực hoá một cụm EKS nội bộ để bắt đầu sử dụng với các ứng dụng Windows cũng được cung cấp tại private-eks-for-windows-workloads-with-terraform.


Bài được dịch từ bài viết trên AWS Blogs, bạn có thể xem bài viết gốc tại đây.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: