Minikube安装
Minikube(安装)在macOS、Linux和Windows上快速设置本地Kubernetes集群,允许软件开发人员快速开始使用Kubernetes。
minikube Kubernetes环境准备
kubectl客户端是运行Kubernetes集群所必需的。安装与kubectl客户端版本相匹配的kubectl客户端版本是很重要的,以避免与有关的版本冲突问题。
要安装kubectl客户端,请按照您系统的官方文档中的说明进行安装。
Minikube提供了一个与kubernetes版本匹配的kubectl客户端版本,以避免版本冲突问题。要使用minikube自带的客户端,请执行以下操作之一:
所有正常的
kubectl
命令都应该以minikube kubectl
的方式执行。它可以通过运行以下命令添加到别名中:
alias kubectl='minikube kubectl --'
- 可直接安装到主机,安装方法如下:
VERSION=$(minikube kubectl version | head -1 | awk -F', ' {'print $3'} | awk -F':' {'print $2'} | sed s/\"//g)
sudo install ${HOME}/.minikube/cache/linux/${VERSION}/kubectl /usr/local/bin
要安装minikube,请按照您系统的官方文档使用这里的说明。
启动minikube可以像运行以下命令一样简单:
minikube start
# 出现如下错误
...
X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.
# 使用命令
minikube start --force --driver=docker
# 解决错误下载慢问题,使用下列启动命令
minikube start --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --base-image='registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.35'
# 现出如下错误
failed to set bridge addr: could not add IP address to \"cni0\": permission denied"
# 解决办法
sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0
sysctl -w net.ipv6.conf.tun0.disable_ipv6=0
sysctl -p
请参阅minikube手册,了解如何操作MiniKube的高级启动选项和说明。
多节点 Minikube
Minikube支持向集群中添加额外的节点。这对于在minikube上试验KubeVirt很有帮助,因为一些操作(如节点关联或动态迁移)需要多个集群节点来演示。
容器网络接口
默认情况下,minikube使用虚拟机设备或容器设置kubernetes集群。对于单个节点设置,本地网络连接就足够了。在涉及多个节点的情况下,即使使用同一主机上的容器或虚拟机,kubernetes也需要定义一个共享网络,以允许一台主机上的pod与另一台主机上的pod通信。为此,minikube支持许多容器网络接口(CNI)插件,其中最简单的是flannel插件。
更新minikube start命令
要在两个节点上使用flannel
CNI插件启动minikube,修改minikube start命令:
$ minikube start --nodes=2 --cni=flannel --enable-default-cni --network-plugin=cni
或者
$ minikube start --nodes=2 --cni=flannel --enable-default-cni --network-plugin=cni --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --base-image='registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.35' --force --driver=docker
核心DNS竞态条件
据报道,多节点minikube中的coredns pod出现了错误的IP地址。如果发生这种情况,kubevirt将无法正确安装。为了解决这个问题,从kube-system命名空间中删除coredns pod,并在minikube中禁用/启用kubevirt插件。
docker ps
查看minikube 进入容器查看日志
### 由于k8s.gcr.io 需要连外网才可以拉取到,导致 k8s 的基础容器 pause 经常无法获取。k8s docker 可使用代理服拉取,再利用 docker tag 解决问题
$ docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
$ docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6
部署 KubeVirt
以使用KubeVirt操作符来安装KubeVirt,该操作符管理所有KubeVirt核心组件的生命周期。
下面是如何使用最新版本安装KubeVirt的两个示例。
简单方法
安装KubeVirt可以像以下命令一样简单:
$ minikube addons enable kubevirt
! kubevirt is a 3rd party addon and not maintained or verified by minikube maintainers, enable at your own risk.
- Using image docker.io/bitnami/kubectl:1.17
* The 'kubevirt' addon is enabled
深入的方式
- 使用kubectl来部署KubeVirt操作:
$ export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- '-rc' | sort -r | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)
$ echo $VERSION
$ kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml
namespace/kubevirt created
customresourcedefinition.apiextensions.k8s.io/kubevirts.kubevirt.io created
priorityclass.scheduling.k8s.io/kubevirt-cluster-critical created
clusterrole.rbac.authorization.k8s.io/kubevirt.io:operator created
serviceaccount/kubevirt-operator created
role.rbac.authorization.k8s.io/kubevirt-operator created
rolebinding.rbac.authorization.k8s.io/kubevirt-operator-rolebinding created
clusterrole.rbac.authorization.k8s.io/kubevirt-operator created
clusterrolebinding.rbac.authorization.k8s.io/kubevirt-operator created
deployment.apps/virt-operator created
嵌套的虚拟化
如果minikube集群运行在虚拟机上,请考虑启用嵌套虚拟化。按照这里描述的说明操作。如果由于任何原因无法启用嵌套虚拟化,请按以下方法启用KubeVirt模拟:
kubectl -n kubevirt patch kubevirt kubevirt --type=merge --patch '{"spec":{"configuration":{"developerConfiguration":{"useEmulation":true}}}}'
- 再次使用kubectl来部署KubeVirt自定义资源定义:
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml
验证组件
默认情况下,KubeVirt将部署7个pod, 3个服务,1个daemonset, 3个部署应用程序,3个副本集。
- 验证deployment:
$ kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.phase}"
Deployed
- 验证components:
$ kubectl get all -n kubevirt
NAME READY STATUS RESTARTS AGE
pod/virt-api-554c867d7c-8tc4n 1/1 Running 0 112m
pod/virt-controller-6778df95f8-tlm5z 1/1 Running 0 111m
pod/virt-controller-6778df95f8-xxmwj 1/1 Running 0 111m
pod/virt-handler-pwcrr 1/1 Running 0 111m
pod/virt-operator-64675bb658-7lnws 1/1 Running 0 114m
pod/virt-operator-64675bb658-qcs6g 1/1 Running 0 114m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubevirt-operator-webhook ClusterIP 10.111.100.97 <none> 443/TCP 112m
service/kubevirt-prometheus-metrics ClusterIP 10.96.123.77 <none> 443/TCP 112m
service/virt-api ClusterIP 10.109.116.15 <none> 443/TCP 112m
service/virt-exportproxy ClusterIP 10.109.216.206 <none> 443/TCP 112m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/virt-handler 1 1 1 1 1 kubernetes.io/os=linux 111m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/virt-api 1/1 1 1 112m
deployment.apps/virt-controller 2/2 2 2 111m
deployment.apps/virt-operator 2/2 2 2 114m
NAME DESIRED CURRENT READY AGE
replicaset.apps/virt-api-554c867d7c 1 1 1 112m
replicaset.apps/virt-controller-6778df95f8 2 2 2 111m
replicaset.apps/virt-operator-64675bb658 2 2 2 114m
NAME AGE PHASE
kubevirt.kubevirt.io/kubevirt 114m Deployed
- 当使用KubeVirt -install-manager的minikube KubeVirt插件检查日志时:
$ kubectl logs pod/kubevirt-install-manager -n kube-system
Installing KubeVirt version: v0.57.1
namespace/kubevirt created
customresourcedefinition.apiextensions.k8s.io/kubevirts.kubevirt.io created
priorityclass.scheduling.k8s.io/kubevirt-cluster-critical created
clusterrole.rbac.authorization.k8s.io/kubevirt.io:operator created
serviceaccount/kubevirt-operator created
role.rbac.authorization.k8s.io/kubevirt-operator created
rolebinding.rbac.authorization.k8s.io/kubevirt-operator-rolebinding created
clusterrole.rbac.authorization.k8s.io/kubevirt-operator created
clusterrolebinding.rbac.authorization.k8s.io/kubevirt-operator created
deployment.apps/virt-operator created
Using software emulation
kubevirt.kubevirt.io/kubevirt created
Virtctl客户端
KubeVirt提供了一个附加的二进制文件,称为virtctl,用于快速访问VM的串行端口和图形端口,并处理启动/停止操作。
安装
virtctl
can be retrieved from the release page of the KubeVirt github page.
- 运行以下:
VERSION=$(kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.observedKubeVirtVersion}")
ARCH=$(uname -s | tr A-Z a-z)-$(uname -m | sed 's/x86_64/amd64/') || windows-amd64.exe
echo ${ARCH}
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-${ARCH}
chmod +x virtctl
sudo install virtctl /usr/local/bin
安装为Krew插件
Virtctl可以通过krew插件管理器作为插件安装。virtctl <命令>…可以理解为kubectl virt
- 运行以下命令进行安装:
$ kubectl krew install virt
接下来什么?
在部署了KubeVirt之后,您可以通过实验室来帮助您熟悉KubeVirt,以及如何使用它创建和部署具有Kubernetes的vm。
第一个实验室是“使用KubeVirt”。本实验室介绍了在Kubernetes上创建虚拟机实例(VMI),以及如何使用virtctl与它的控制台交互。
第二个实验室是“CDI实验”。本实验演示了如何使用容器数据导入器(CDI)将VM映像导入到持久卷索赔(PVC)中,然后如何将PVC作为块设备附加到VM上。
第三个实验室是“KubeVirt升级”。这个实验展示了升级KubeVirt安装是多么容易和安全,并且没有停机时间。