본문 바로가기

Cloud/Kubernetes

Minikube로 KubeVirt 시작하기 (3)

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

왜 자꾸 fedora 맛탱이 가는지는 잘 모르겠음;

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 해준다.