Cluster Controller : kubefedcluster라는 CRD로 클러스터들을 Heath 정보 관리 및 추가 삭제 관리
Federated Type : federated deployment, service 등의 클러스터 단위로 배포할 수 있는 리소스들
Status Controller : 멤버 클러스터들의 리소스 상태를 수집하는 컨트롤러
Sync Controller : 멤버 클러스터들의 federated 리소드들을 동기화 하는 컨트롤러
Scheduling Manager : RSP 타입을 관리하기 위한 매니저
RSP Controller : RSPReplicaSchedulingPreference target의 레플리카를 설정한 범위 내에서 유동적으로 조절하게 하는 컨트롤러, 수정된 정보는 API Server에 적용해 Sync Controller로 각 클러스터의 레플리카를 수정
위 구조는 federation된 클러스터간 app 배포를 표현
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
name: test-deployment
namespace: test-namespace
spec:
template:
metadata:
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
placement:
clusters:
- name: host
- name: jskim
overrides:
- clusterName: host
clusterOverrides:
- path: "/spec/replicas"
value: 5
- path: "/spec/template/spec/containers/0/image"
value: "nginx:1.17.0-alpine"
- path: "/metadata/annotations"
op: "add"
value:
foo: bar
- path: "/metadata/annotations/foo"
op: "remove"
federation type으로 분류된 Template, Placement, Overrides는 각각 app의 기본 정보, 배포될 클러스터 선정, 변수의 재정의를 의미
kubefed에서 지원하는 federated resource type은 다음과 같음
cluster role
cluster role binding
config map
deployment
ingress
job
namespace
secret
service
serviceaccount
해당 파일들의 예제는 다음 URL을 통해 확인할 수 있음
kubefed/example/sample1 at master · kubernetes-sigs/kubefed · GitHub
명령어
기본적으로 control plane에서 동작한다고 가정
만약 아닐 경우 flag로 --host-cluster-context로 호스트 클러스터를 지정
kubefedctl disable [Name] [flag]
K8s의 API 유형 (ex. deployment.app)을 배포하지 않도록 설정하거나 enable 명령어로 추가된 리소스를 삭제
kubefedctl enable [Name or -f filename] [flag]
CRD포함 K8s의 API 유형을 배포
kubefedctl federate [Type name] [Resource name] [flag]
K8s에서 지원하는 기본 리소스를 통해 federated 리소스를 생성
kubefedctl join [Cluster name] --host-cluster-context=[Host cluster context] [flag]
Cluster를 Host cluster에 등록
kubesphere를 통하지 않는다면 join 명령어를 통해 등록해야 하는데 그 과정에서 어떠한 방식으로든 대상 클러스터의 정보를 가지고 있어야 함
config 파일에 cluster context와 인증 데이터를 넣어 등록하거나 혹은 flag 중 secret-name이 존재하는데 해당 클러스터의 인증 정보를 가진 secret을 연결해 사용
대부분의 경우 member의 config 정보를 가져와 host의 config 정보에 삽입하는 방식으로 사용
--secret-name string
Name of the secret where the cluster's credentials will be stored in the host cluster. This name should be a valid RFC 1035 label. If unspecified, defaults to a generated name containing the cluster name.
kubefedctl unjoin [Cluster name] --host-cluster-context=[Host cluster context] [flag]
Cluster를 Host cluster에서 삭제
kubefedctl orphaning-deletion [flag or command]
Resource 삭제 시 정책
command
disable
Resource의 삭제가 실행 되었을 때 관리되는 리소스를 제거
enable
Resource의 삭제가 실행 되었을 때 관리되는 리소스를 보존
status
Federated resource의 상태 정보
version
help
Kubefed를 통한 federation 구현
host cluster에서 진행함이 기본
헬름을 통해 kubefed를 설치
centos# helm repo add kubefed-charts https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts
centos# helm --namespace kube-federation-system upgrade -i kubefed kubefed-charts/kubefed --version=<x.x.x> --create-namespace
<x.x.x>에 버전을 기입하여 설치
글 작성 기준 0.9.1 버전이 가장 최신 버전이므로 --version=0.9.1로 기입
위 방법으로 kubefed는 설치되었지만 제어하기 위한 ctl는 설치되지 않은 상태
centos# wget https://github.com/kubernetes-sigs/kubefed/releases/download/v0.9.1/kubefedctl-0.9.1-linux-amd64.tgz
위에서 설치했던 버전과 동일한 버전의 ctl을 설치
centos# tar -zxvf kubefedctl-0.9.1-linux-amd64.tgz
centos# chmod u+x kubefedctl
centos# mv kubefedctl /usr/local/bin/
권한을 부여하고 해당 경로로 이동
federation할 클러스터를 위해 service account와 cluster role을 정의하고 binding
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
name: ubuntu-jh
name: ubuntu-jh
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
name: ubuntu-jh
name: ubuntu-jh
rules:
- apiGroups: ['*']
resources: ['*']
verbs: ['*']
- nonResourceURLs: ['*']
verbs: ['*']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
name: ubuntu-jh
name: ubuntu-jh
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ubuntu-jh
subjects:
- kind: ServiceAccount
name: ubuntu-jh
namespace: default
member가 될 cluster에서 정보를 가져와 적용
host cluster의 kube config 파일에 새로운 context와 cluster 정보를 기입
clusters:
- cluster:
certificate-authority-data: ...
server: https://192.168.0.97:6443 # 호스트 클러스터의 ip
name: cluster.local
- cluster:
certificate-authority-data: ... # 멤버 클러스터 추가 부분
server: https://192.168.0.15:6443 # 멤버 클러스터의 ip
name: ubuntu-jh
contexts:
- context:
cluster: cluster.local
user: kubernetes-admin
name: kubernetes-admin
- context: # 멤버 클러스터 추가 부분
cluster: ubuntu-jh # 멤버 클러스터 추가 부분
user: ubuntu-jh # 멤버 클러스터 추가 부분
name: ubuntu-jh # 멤버 클러스터 추가 부분
current-context: kubernetes-admin
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: ...
client-key-data: ...
- name: ubuntu-jh # 멤버 클러스터 추가 부분
user: # 멤버 클러스터 추가 부분
client-certificate-data: ... # 멤버 클러스터 추가 부분
client-key-data: ... # 멤버 클러스터 추가 부분
추가 부분들은 member cluster의 kube config을 참고하여 기입
여기까지 진행하였다면 config 관련 명령어를 통해 member cluster에 접근이 가능
kubefedctl join 명령어를 통해 federation을 진행
centos# kubefedctl join kubernetes-admin --host-cluster-context kubernetes-admin --v=2
centos# kubefedctl join ubuntu-jh --host-cluster-context kubernetes-admin --v=2
위 두 명령어를 진행한다면 다음 명령어를 통해 성공적으로 federation 되었는지 확인
centos# kubectl get kubefedcluster -n kube-federation-system
이제 federated 관련 CDR을 사용할 수 있게 되는데 가장 먼저 배포해야 하는것은 federatednamespace로 선행으로 배포하고 배포된 namespace로 배포하지 않으면 사용이 불가능함을 확인
apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
name: test-namespace
namespace: test-namespace
spec:
placement:
clusters:
- name: kubernetes-admin
- name: ubuntu-jh
기초되는 틀은 위와 같으며 위 federatednamespace를 위한 네임 스페이스 역시 필요하니 배포 필요
특이한 타입으로 ReplicaSchedulingPreference이 존재
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: test-deployment
namespace: test-namespace
spec:
targetKind: FederatedDeployment
totalReplicas: 10
clusters:
kubernetes-admin:
weight: 2
maxReplicas: 5
ubuntu-jh:
weight: 3
minReplicas: 0
maxReplicas: 0
위와 같은 방식으로 사용되며 먼저 같은 이름의 targetKind가 존재해야 사용 가능
가중치와 min, max로 total에 해당하는 갯 수만큼의 pod가 배포되며, min, max가 우선 순위를 가짐
'Kubernetes' 카테고리의 다른 글
Kubernetes Federated Prometheus Dashboard (0) | 2024.05.23 |
---|---|
Kubesphere Tower Federation (0) | 2024.05.23 |
Kubernetes EFK (0) | 2024.05.23 |
Kubernetes Prometheus (0) | 2024.05.23 |
Kubesphere Federation (0) | 2024.05.23 |