ssh ubuntu@<MANAGEMENT_CLUSTER_IP> -i <SSH_KEY_NAME>.pem
ubuntu@k8s-master-01:~/yaml$ kubectl get nodes -o wide
| 노드명 | 상태 | 역할 | 버전 | 내부 IP | OS | 컨테이너 런타임 |
|---|---|---|---|---|---|---|
| k8s-master-01.cluster.local | Ready | control-plane | v1.33.2 | 10.0.0.xxx | Ubuntu 22.04.5 LTS | containerd://2.0.5 |
| k8s-master-02.cluster.local | Ready | control-plane | v1.33.2 | 10.0.0.xxx | Ubuntu 22.04.5 LTS | containerd://2.0.5 |
| k8s-master-03.cluster.local | Ready | control-plane | v1.33.2 | 10.0.0.xxx | Ubuntu 22.04.5 LTS | containerd://2.0.5 |
| k8s-worker-01.cluster.local | Ready | worker | v1.33.2 | 10.0.0.xxx | Ubuntu 22.04.5 LTS | containerd://2.0.5 |
| k8s-worker-02.cluster.local | Ready | worker | v1.33.2 | 10.0.0.xxx | Ubuntu 22.04.5 LTS | containerd://2.0.5 |
# Local Path Provisioner 설치
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.31/deploy/local-path-storage.yaml
# Helm repo 추가 및 업데이트
helm repo add jetstack https://charts.jetstack.io
helm repo update
# Cert-Manager 설치
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true
# Kamaji 설치
helm install kamaji clastix/kamaji \
--version 0.0.0+latest \
--namespace kamaji-system \
--create-namespace \
--set image.tag=latest
# clusterctl 다운로드 및 설치
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.10.3/clusterctl-linux-amd64 -o clusterctl
sudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl
kubectl apply -f https://github.com/k-orc/openstack-resource-controller/releases/latest/download/install.yaml
# 초기화 명령어
clusterctl init --infrastructure openstack --control-plane kamaji
설치 결과:
✅ Installing Provider="cluster-api" Version="v1.10.3" TargetNamespace="capi-system"
✅ Installing Provider="bootstrap-kubeadm" Version="v1.10.3" TargetNamespace="capi-kubeadm-bootstrap-system"
✅ Installing Provider="control-plane-kamaji" Version="v0.15.3" TargetNamespace="kamaji-system"
✅ Installing Provider="infrastructure-openstack" Version="v0.12.4" TargetNamespace="capo-system"
🎉 Your management cluster has been initialized successfully!
# CAPO 컨트롤러 확인
kubectl -n capo-system get pod
# NAME READY STATUS RESTARTS AGE
# capo-controller-manager-96b4ddb6d-22kxw 1/1 Running 0 67s
# CAPI 컨트롤러 확인
kubectl -n capi-system get pod
# NAME READY STATUS RESTARTS AGE
# capi-controller-manager-5876c47b76-wvj7n 1/1 Running 0 74s
# Kubeadm Bootstrap 컨트롤러 확인
kubectl -n capi-kubeadm-bootstrap-system get pod
# NAME READY STATUS RESTARTS AGE
# capi-kubeadm-bootstrap-controller-manager-64986ff879-7qh8x 1/1 Running 0 79s
# Kamaji CAPI 컨트롤러 확인
kubectl -n kamaji-system get pod | grep capi
# NAME READY STATUS RESTARTS AGE
# capi-kamaji-controller-manager-69b676c465-8nv8h 1/1 Running 0 11m
wget https://raw.githubusercontent.com/kubernetes-sigs/cluster-api-provider-openstack/master/templates/env.rc -O /tmp/env.rc
mv /tmp/env.rc ./
clouds:
<CLOUD_NAME>:
auth:
auth_url: https://<KEYSTONE_ENDPOINT>/v3
user_id: "<USER_ID>"
password: "<PASSWORD>"
project_name: "<PROJECT_NAME>"
project_domain_id: "default"
verify: true
region_name: "<REGION_NAME>"
interface: "public"
identity_api_version: 3
# SDK 타임아웃 설정
api_timeout: 60
auth_timeout: 30
sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq
sudo chmod +x /usr/local/bin/yq
source env.rc clouds.yaml <CLOUD_NAME>
source openstack-environment.sh
env | grep OPENSTACK
설정된 환경 변수:
OPENSTACK_CLOUD=<CLOUD_NAME>
OPENSTACK_FAILURE_DOMAIN=<AVAILABILITY_ZONE>
OPENSTACK_IMAGE_NAME=<OS_IMAGE_NAME>
OPENSTACK_EXTERNAL_NETWORK_ID=<NETWORK_UUID>
OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR=<FLAVOR_NAME>
OPENSTACK_DNS_NAMESERVERS=<DNS_SERVER_IP>
OPENSTACK_NODE_MACHINE_FLAVOR=<WORKER_FLAVOR_NAME>
OPENSTACK_VOLUME_TYPE=<VOLUME_TYPE>
OPENSTACK_SSH_KEY_NAME=<SSH_KEY_NAME>
OPENSTACK_CLOUD_YAML_B64=<BASE64_ENCODED_CLOUD_CONFIG>
OPENSTACK_CLOUD_CACERT_B64=<BASE64_ENCODED_CA_CERT>
OPENSTACK_CLOUD_PROVIDER_CONF_B64=<BASE64_ENCODED_PROVIDER_CONFIG>
clusterctl generate cluster <CLUSTER_NAME> \
--kubernetes-version v1.33.0 \
--control-plane-machine-count=1 \
--worker-machine-count=1 \
> <CLUSTER_NAME>.yaml
# 기존
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
name: <CLUSTER_NAME>-control-plane
# 변경 후
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KamajiControlPlane
name: <CLUSTER_NAME>
# 기존 KubeadmControlPlane 섹션 삭제하고 아래로 교체
---
kind: KamajiControlPlane
apiVersion: controlplane.cluster.x-k8s.io/v1alpha1
metadata:
name: <CLUSTER_NAME>
namespace: default
spec:
apiServer:
extraArgs:
- --cloud-provider=external
controllerManager:
extraArgs:
- --cloud-provider=external
dataStoreName: default
addons:
coreDNS: {}
kubeProxy: {}
konnectivity: {}
kubelet:
cgroupfs: systemd
preferredAddressTypes:
- InternalIP
network:
serviceType: LoadBalancer
version: v1.33.0
# 기존
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: OpenStackMachineTemplate
metadata:
name: <CLUSTER_NAME>-control-plane
namespace: default
# 변경 후
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: OpenStackMachineTemplate
metadata:
name: <CLUSTER_NAME>
namespace: default
kubectl apply -f <CLUSTER_NAME>.yaml
# Kamaji 클러스터에서 OpenStack API 접근 불가
ubuntu@k8s-master-01:~/yaml$ curl https://<KEYSTONE_ENDPOINT>/v3 -k -vvv
* Trying <OPENSTACK_API_IP>:443...
^C # 연결 실패로 중단
문제점: 방화벽 설정으로 인해 Kamaji 컨테이너에서 OpenStack API 엔드포인트로 접근이 차단됨
# OpenStack API 엔드포인트 접근 테스트
curl -k https://<KEYSTONE_ENDPOINT>/v3
# DNS 해상도 테스트
nslookup <KEYSTONE_ENDPOINT>
# 포트 연결 테스트
telnet <OPENSTACK_API_IP> 443
# Kamaji 컨트롤러 로그
kubectl logs -n kamaji-system -l app.kubernetes.io/name=kamaji
# CAPI Kamaji 컨트롤러 로그
kubectl logs -n kamaji-system -l cluster.x-k8s.io/provider=control-plane-kamaji
# 클러스터 리소스 확인
kubectl get clusters,kamajicontrolplanes,openstackclusters
# 상세 상태 확인
kubectl describe cluster <CLUSTER_NAME>
kubectl describe kamajicontrolplane <CLUSTER_NAME>