이번 포스팅에서는 karmada를 설치하고 Karmada 기능을 사용해 Pod를 배포하는 실습을 다룬다.
실습 구성은 아래와 같다.
실습 과정은 아래와 같다.
1. EC2 Bastion에서 Karmada Control-Plane을 구성한다.
2. Push 방식을 이용하여 EKS Member1 클러스터를 Control-plane클러스터에 조인시킨다.
3. 조인이 완료되면 Control-Plane 클러스터에서 Propagation Policy를 이용해 Member1,2 클러스터에 Pod를 배포해한다.
[Karmada Join Mode]
Push 모드 : Control Plane에서 member 클러스터를 Join 시키는 방식
Pull 모드 : Member 클러스터에서 Control Plane에 join 하는 방식
[실습 환경] AWS
- EC2 Bastion OS : Amazon Linux 2023
- kubectl 버전 : 1.22
- krew 버전 : 0.4.3
- Karmada Control-Plane EKS 버전 : 1.22
- Karmada Member1, 2 EKS 버전 : 1.22, 1.23
- Karmada 버전 : 1.5
실습
모든 구성 과정은 EC2 Bastion에서 실행한다.
kubectl 플러그인 관리자를 설치한다.
$ yum install -y git
$ set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
$ export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
$ kubectl krew version
OPTION VALUE
GitTag v0.4.3
GitCommit dbfefa5
IndexURI https://github.com/kubernetes-sigs/krew-index.git
BasePath /root/.krew
IndexPath /root/.krew/index/default
InstallPath /root/.krew/store
BinPath /root/.krew/bin
DetectedPlatform linux/amd64
kubectl에 karmada 플러그인을 설치한다.
$ curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | sudo bash -s kubectl-karmada
[INFO] Downloading metadata https://api.github.com/repos/karmada-io/karmada/releases/latest
[INFO] Using 1.5.0 as release
[INFO] Downloading hash https://github.com/karmada-io/karmada/releases/download/v1.5.0/kubectl-karmada-linux-amd64.tgz.sha256
[INFO] Downloading binary https://github.com/karmada-io/karmada/releases/download/v1.5.0/kubectl-karmada-linux-amd64.tgz
[INFO] Verifying binary download
which: no shasum in (/sbin:/bin:/usr/sbin:/usr/bin)
[INFO] Installing kubectl-karmada to /usr/local/bin/kubectl-karmada
kubectl 플러그인을 통해 설치한다.
$ kubectl krew install karmada
Updated the local copy of plugin index.
New plugins available:
* kopilot
Installing plugin: karmada
Installed plugin: karmada
\
| Use this plugin:
| kubectl karmada
| Documentation:
| https://github.com/karmada-io/karmada
/
WARNING: You installed plugin "karmada" from the krew-index plugin repository.
These plugins are not audited for security by the Krew maintainers.
Run them at your own risk.
karmada control-plane을 설치한다.
$ kubectl karmada init \
--karmada-apiserver-replicas 3 --etcd-replicas 3 \
--etcd-storage-mode PVC --storage-classes-name gp2 -p 32443
[참고]
만약 AWS EKS환경에서 "error: You must be logged in to the server (Unauthorized)"가 나온다면 bastion EC2에서 member eks에 접근할 수 있는 권한을 설정해야 한다. aws iam user 방식 또는 iam role 방식을 지정할 수 있는데, 각자 aws bastion EC2에서 사용하는 권한을 "$ aws sts get-caller-identity" 명령으로 확인 후 member eks의 aws-auth에 넣어주면 된다.
이는 AWS EKS kubeconfig 파일에서 클러스터에 액세스 하기 위한 AWS IAM 사용자의 인증 정보를 정의하는 부분 때문에 나오는 오류로 위 방식 말고 RBAC 방식으로 ClusterRolebinding을 통해 Serviecaccount에 권한을 주어 사용할 수도 있으니 참고하자.
아래는 Control-Plane에 조인될 member EKS에서 userarn에 aws iam user arn을 입력하여 권한을 준 방식이다.
## member eks
$ kubectl edit cm -n kube-system aws-auth
## 아래 내용 추가
mapUsers: |
- userarn: arn:aws:iam::123456789:user/wlsdn3004
username: testuser
groups:
- system:masters
[참고]
AWS EKS환경에 1.24 버전 이상에서 실행할 때 error: exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1" 와 같은 오류가 나올 수 있다. exec 인증 플러그인의 버전 문제로 kubectl 버전 1.23.6으로 낮춰주면 된다.
karmada control-plane이 잘 설치되었는지 확인할 수 있다.
$ kubectl get po -n karmada-system
NAME READY STATUS RESTARTS AGE
etcd-0 1/1 Running 0 3m4s
etcd-1 1/1 Running 0 2m35s
etcd-2 1/1 Running 0 2m9s
karmada-aggregated-apiserver-75f568bf49-m5wnn 1/1 Running 0 97s
karmada-apiserver-79fb8bd68d-4qrpg 1/1 Running 0 2m8s
karmada-apiserver-79fb8bd68d-kb2r9 1/1 Running 0 2m8s
karmada-apiserver-79fb8bd68d-p7c6c 1/1 Running 0 2m8s
karmada-controller-manager-6dbb5884d7-lqv79 1/1 Running 0 75s
karmada-scheduler-54f9cf99f7-j5qtb 1/1 Running 0 82s
karmada-webhook-7f74f5cf4d-2dnwz 1/1 Running 0 69s
kube-controller-manager-59cc9544f-trdf4 1/1 Running 0 88s
Push 모드로 member1,2 클러스터를 Join 시킨다.
$ kubectl karmada --kubeconfig /etc/karmada/karmada-apiserver.config join member1 --cluster-kubeconfig=./member1_config
cluster(member1) is joined successfully
$ kubectl karmada --kubeconfig /etc/karmada/karmada-apiserver.config join member2 --cluster-kubeconfig=./member2_config
cluster(member2) is joined successfully
- --cluster-kubeconfig : member1,2 클러스터의 kubeconfig 파일을 지정해야 한다.
Join 되었는지 확인해 보자.
$ kubectl get clusters
NAME VERSION MODE READY AGE
member1 v1.23.17-eks-ec5523e Push True 4h52m
member2 v1.22.17-eks-ec5523e Push True 9s
Control Plane에서 member클러스터에게 nginx pod를 배포한다.
$ kubectl --kubeconfig /etc/karmada/karmada-apiserver.config apply -f - <<EOF
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: example-policy
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx-test
placement:
clusterAffinity:
clusterNames:
- member1
- member2
EOF
PropagationPolicy에서 지정한 이름의 nginx deployment를 배포한다.
$ kubectl create deployment nginx-test --image nginx
member1,2 클러스터에서 배포가 되었는지 확인해 보자.
## member1
$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-test-84b478f9c5-nxb6s 1/1 Running 0 9s
## member2
$ kubectl get po -w
NAME READY STATUS RESTARTS AGE
nginx-test-795d659f45-8d7fw 1/1 Running 0 11s
정상으로 두 클러스터에 배포가 된 걸 확인할 수 있다.
resourcebinding에서 맵핑 정보를 확인해 보자.
$ kubectl get resourcebindings.work.karmada.io nginx-test-deployment -oyaml
spec:
clusters:
- name: member1
- name: member2
placement:
clusterAffinity:
clusterNames:
- member1
- member2
clusterTolerations:
- effect: NoExecute
key: cluster.karmada.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: cluster.karmada.io/unreachable
operator: Exists
tolerationSeconds: 300
replicas: 1
resource:
apiVersion: apps/v1
kind: Deployment
name: nginx-test
namespace: default
resourceVersion: "136018"
uid: bbec3396-7ef5-42ad-aaaf-b7c4b10e18e9
schedulerName: default-scheduler
만약 PropagationPolicy설정 없이 deployment를 배포하면, Member 클러스터에 Pod가 배포되지 않다가 PropagationPolicy를 설정하는 순간 resourcebinding을 통해 배포된다.
마치며
이번 포스팅에서는 karmada를 구축하고 pod를 배포해 보는 간단한 실습을 해보았다.
이제 여러 EKS 클러스터에 애플리케이션을 배포하고 중앙 집중식 관리를 할 수 있다. 다음 포스팅에서는 PropagationPolicy와 OverridePolicy를 좀 더 자세하게 다뤄볼 예정이다.
'Orchestration > Karmada' 카테고리의 다른 글
Karmada 란? (0) | 2023.04.21 |
---|
댓글