CID(Containerized Data Importer) 실험
- CID는 KuberVirt와 함께 사용되어 가상머신 이미지를 가져오는 유틸리티
- PVC를 생성하고, disk.img라는 원시 이미지를 PVC에 작성
1. Install the CDI
wget https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/storage-setup.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostpath-provisioner
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
k8s-app: hostpath-provisioner
template:
metadata:
labels:
k8s-app: hostpath-provisioner
spec:
containers:
- name: hostpath-provisioner
image: mazdermind/hostpath-provisioner:latest
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: PV_DIR
value: /var/lib/minikube
volumeMounts:
- name: pv-volume
mountPath: /var/lib/minikube
volumes:
- name: pv-volume
hostPath:
path: /var/lib/minikube
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: hostpath-provisioner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: hostpath-provisioner
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: hostpath-provisioner
subjects:
- kind: ServiceAccount
name: default
namespace: kube-system
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: hostpath
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: hostpath
이제 storage-setup을 실행해본다.
kubectl create -f storage-setup.yml
export VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v[0-9]\.[0-9]*\.[0-9]*")
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml
`kubectl get all -n kube-system` 을 통해 생성된 storage-setup 오브젝트들을 볼 수 있다.
마찬가지로 kbuectl get all -n cdi를 통해 cdi 오브젝트들도 조회할 수 있다. (근데 에러났네 - 기다리면 제대로 뜬다)
2. CDI 사용
Fedora30 Cloud Image를 PVC로 가져와서 이를 이용한 가상 머신을 생성해본다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: "fedora"
labels:
app: containerized-data-importer
annotations:
cdi.kubevirt.io/storage.import.endpoint: "https://download.fedoraproject.org/pub/fedora/linux/releases/30/Cloud/x86_64/images/Fedora-Cloud-Base-30-1.2.x86_64.raw.xz"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
storageClassName: hostpath
이런 yaml 파일을 가져오면 된다.
kubectl create -f https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/pvc_fedora.yml
pvc가 생성되며 storageclass가 hostpath인 것을 볼 수 있다. pvc image로 생성된 vm을 확인해본다.
kubectl get pods
상세 내역을 보면 PVC가 fedora로 되어 있는 것을 볼 수 있다.
띄워진 포드를 이용해서 fedora 이미지를 가진 VM을 만들어 본다.
wget https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/vm1_pvc.yml
cat vm1_pvc.yml
vm1_pvc 내용은 아래와 같다.
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
creationTimestamp: 2018-07-04T15:03:08Z
generation: 1
labels:
kubevirt.io/os: linux
name: vm1
spec:
running: true
template:
metadata:
creationTimestamp: null
labels:
kubevirt.io/domain: vm1
spec:
domain:
cpu:
cores: 2
devices:
disks:
- disk:
bus: virtio
name: disk0
- cdrom:
bus: sata
readonly: true
name: cloudinitdisk
machine:
type: q35
resources:
requests:
memory: 1024M
volumes:
- name: disk0
persistentVolumeClaim:
claimName: fedora
- cloudInitNoCloud:
userData: |
#cloud-config
hostname: vm1
ssh_pwauth: True
disable_root: false
ssh_authorized_keys:
- ssh-rsa YOUR_SSH_PUB_KEY_HERE
name: cloudinitdisk
만들어진 vm에 ssh 접속을 위해 로컬에 ssh-key를 만들어 준다.
ssh-keygen
만들어진 공개키를 vm1.pvc 어쩌고에 옮겨준다.
PUBKEY=`cat ~/.ssh/id_rsa.pub`
sed -i "s%ssh-rsa.*%$PUBKEY%" vm1_pvc.yml
변경된 내용을 확인할 수 있다. 이후 create 해준다.
kubectl create -f vm1_pvc.yaml
kubectl get vms
vm이 생성된 것을 볼 수 있다. 가상머신이 실행중인지 확인하기 위해 virt-launcher-vm1-XXXX 포드를 찾아 IP를 매달고 있는지 본다.
kubectl get pod -o wide
virtctl console vm1
console로 들어가서 부팅이 되었는지 확인한다. (신기하다)
ssh로 접속해보기 위해 minikube ssh로 먼저 들어간다.
minikube ssh
ssh fedora@IP
VM을 외부에서도 접근할 수 있게 NodePort로 SSH를 달아준다.
virtctl expose vmi vm1 --name=vm1-ssh --port=20222 --target-port=22 --type=NodePort
kubectl get svc
외부에서 접속해본다.
ssh -i ~/.ssh/id_rsa.pub fedora@IP -p 32495
minikube status 확인
- 그냥 하면 안나오고 뒤에 p(프로필)를 넣어줘야 한다. 안되는건지 알고 minikube 계속 다시 만들어서 진행해본 나는 3류..ㅎㅎ..
minikube status - apiserver Stopped
- 몇 번 해봤는데 죽을 때가 있고 아닐 때가 있는거 보면 리소스 문제인거 같다
잘 돌아가다가도 디질때가 있고... 제발 되주세요 해도 죽고..ㅎ... VM위에 K8S를 올리고 그 위에 또 VM을 까는 컴퓨터에게 오랑캐같은 행동을 해서 그럴수도 있다..(뭐)
qemu-system-x86_64: error: failed to set MSR 0x38d to 0x0
- minikube 생성시 이런 에러가 뜰 수도 있다. 당황하지말고 Setting에서 이 기능 체크해준다.
KVM 라이브러리 없다고 징징댈 때 / Permission 달라고 땡깡부릴 때
sudo apt install qemu-kvm libvirt-bin bridge-utils ubuntu-vm-builder
sudo adduser $USER libvirt
sudo adduser $USER kvm
다운 받아주고 adduser 해준다.
'Cloud > Kubernetes' 카테고리의 다른 글
Persistent Volume과 Persistent Volume Claim (0) | 2019.12.19 |
---|---|
Kubernetes의 Virtualisation Operator인 KubeVirt 소개 (따단) (0) | 2019.11.21 |
Minikube로 KubeVirt 시작하기 (2) (0) | 2019.11.20 |
Kubernetes - KubeVirt (0) | 2019.11.19 |
Minikube로 KubeVirt 시작하기 (1) (0) | 2019.11.19 |