Featured image of post Tips lỏ giúp mình truy cập vào logs của EKS PODS nhanh chóng qua terminal cá nhân

Tips lỏ giúp mình truy cập vào logs của EKS PODS nhanh chóng qua terminal cá nhân

Mình vừa mới đã dùng một tips nhỏ liên quan đến kubectl config để có thể check logs của EKS POD nhanh chóng ngay tại terminal của máy mình. Mình sẽ trình bày trick đó trong bài viết này nhé!

Sprint vừa rồi team mình có deploy một service mới trên EKS, vì mục đích ban đầu là deploy POC và công ty mình đang trong giai đoạn cut off chi phí nên team cũng ko config Cloudwatch, và Splunk thì công ty sắp deprecated để chuyển sang 3rd party mới nên team mình quyết đinh check log "chay" trong EKS POD luôn chứ k export logs đi đâu cả.

Thông thường nếu check logs trong EKD POD có thể dùng nhiều tool như Lens, ELK nhưng vì tính chất công ty của mình làm về domain banking nên việc xài các 3rd party tool mà không nằm trong hệ sinh thái của công ty là một việc rất hạn chế và không khuyến khích.
Vậy nên các dev hay devops sẽ check logs sử dụng một container được tạo từ K9s-cli image build-in của công ty. Tuy nhiên mình lại không có “cảm tình” với GUI màu mè xanh tím vàng của K9s CLI, và việc thao tác trên GUI cũng khiến mình cảm thấy mất nhiều thời gian và bị rối mắt mỗi khi cần check logs vì service của mình chạy rất nhiều cron job nên logs quá trời logs cùng một lúc!

Vì vậy nên mình đã thử xài 1 trick lỏ để có thể sử dụng kubectl - CLI của K8s để có thể check logs dễ dàng và nhanh chóng thông qua các alias mà mình sẽ config phía bên dưới.

Đâu tiên, để truy cập đến các private resource trên AWS các công ty thường sẽ sử dụng một Jumpbox(Bastion host) đóng vai trò như là một turnel giúp các developer có thể truy cập và các private resource cũng như ngăn chặn các truy cập từ các public access bên ngoài, chi tiết làm thế nào để tạo một Jumpbox các bạn xem tại đây nhé:

Bảo mật EC2 instance với Bastion Host Viblo

Creating Bastion Host on AWS EC2 Medium

Mô hình Bastion Host giúp các bastion user có thể truy cập vào private resource Nguồn: Medium

Giả sử team mình đang có một jumpbox ở địa chỉ: nonprod.bastion.testing.aws.com.au

Và server endpoint của EKS Cluster là: B2BB654X8J95V5679B5G9091078JB7C.gr3.ap-southeast-2.eks.amazonaws.com

đầu tiên các bạn cần thiết lập một ssh connection từ port 8443 trên local host forward tới port HTTPS 443 trên EKS API SERVER

1
2
3
4
5
ssh -fNL 8443:$EKS_API_SERVER_ENDPOINT:443 $your_aws_account_iam_user_name@$JUMP_BOX_SERVICE

## ví dụ với case của mình

ssh -fNL 8443:B2BB654X8J95V5679B5G9091078JB7C.gr3.ap-southeast-2.eks.amazonaws.com:443 [email protected]

Sau khi đã thiết lập ssh connection, các bạn cần log in vào AWS console thông qua CLI:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
aws configure

AWS Access Key ID [None]: <Access Key>
AWS Secret Access Key [None]: <Secret Key>
Default region name [None]: <region>  # (e.g., us-east-1)
Default output format [None]: json   # hoặc text, table

## kiem tra dang nhap

aws sts get-caller-identity

sau khi đã đăng nhập vào AWS thành công các bạn chỉ cần run command bên dưới để update kubeconfig trên local để có thể giao tiếp với EKS mà không cần phải verify ssl:

1
2
3
4
aws eks update-kubeconfig --name ${CLUSTER_NAME} --no-verify-ssl

## ví dụ cluster name của bạn là api-cluster-A
aws eks update-kubeconfig --name api-cluster-A --no-verify-ssl

cuối cùng các bạn chỉ cần run kubectl config conmmand để có thể map EKS cluster trên AWS tới local thông qua SSH turnel port 8443:

1
2
3
4
5
6
7
8
kubectl config set-cluster \
  arn:aws:eks:ap-southeast-2:${YOUR_AWS_ACCOUNT_ID}:cluster/${CLUSTER_NAME}\
  --server=https://localhost:${SSH_TURNEL_PORT} --insecure-ski-tks-verify
 ## trong trường này mình sẽ map value của mình vào như sau, giả sử AWS accountID của bạn là 485768791

 kubectl config set-cluster \
  arn:aws:eks:ap-southeast-2:485768791:cluster/api-cluster-A\
  --server=https://localhost:8443 --insecure-ski-tks-verify

DONE! vậy là các bạn đã hoàn thành việc map EKS cluster config tới local thông qua SSH HTTPS PORT rồi đó, bây giờ có thể sử dụng kubectl tẹt ga để thao tác với EKS cluster dưới terminal rồi!!!!

để cho tiện việc truy cập mình sẽ nhét tất cả các command vào một file ví dụ eks-local-config.sh

1
2
3
4
5
6
7
8

ssh -fNL 8443:B2BB654X8J95V5679B5G9091078JB7C.gr3.ap-southeast-2.eks.amazonaws.com:443 [email protected]

aws eks update-kubeconfig --name api-cluster-A --no-verify-ssl

 kubectl config set-cluster \
  arn:aws:eks:ap-southeast-2:485768791:cluster/api-cluster-A\
  --server=https://localhost:8443 --insecure-ski-tks-verify

vì namespace mặc định sẽ là ‘default’ nên mình cần có 1 file để swap namespace cho Cluster nữa, ví dụ eks-swap-namespace.sh

1
2
3
4

K8S_NAMESPACE="$1"

kubectl config set-context --current --namespace=$K8S_NAMESPACE

Tuy nhiên vì muốn nhanh gọn nên mình sẽ config một vài alias cho các command thông dụng, các bạn có thể tham khảo nhé:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

## .zshrc file

alias eks='${YOUR_PATH}/eks-local-config.sh'
alias knsw='${YOUR_PATH}/eks-swap-namespace.sh'


alias kgn='kubectl get namespace --insecure-skip-tks-verify'
alias kgp='kubectl get pods --insecure-skip-tks-verify'
alias klf='kubectl logs -f --insecure-skip-tls-verify'
alias kgs='kubectl get services --insecure-skip-tls-verify'
alias kgh='kubectl get hpa --insecure-skip-tls-verify'

Bây giờ ở terminal cá nhân các bạn chỉ cần gõ vài command là có thể check logs của EKS POD được rồi:

1
2
3
4
5
6
7
8
9
eks

knsw api_namespace
## swap namespace to api_namespace

kgp
##will get list of PODs name inside that namespace

klf ${pod_name}

Okay việc check logs dưới terminal là dễ phải không nào? Tuy nhiên vì đây vẫn là trick lỏ nên mình không khuyến khích các bạn lạm dụng nhé, vì khi mất quyền kiểm soát hoặc port local trên máy bị expost ra bên ngoài rất nguy hiểm cho EKS cluster và các private resource của các bạn. Hackers có thể tận dùng SSH TURNEL PORT để dùng vào các mục đích xấu nên nếu xài xong vui lòng kill port 8443 liền nha.

Cảm ơn mọi người đã đọc và nếu có thắc mắc hoặc góp ý nào vui lòng cho mình biết nhé :D :D :D :D

HAPPY CODING!

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy