获取一个在线的Kubernetes集群非常容易,因为几乎每个云提供商都提供自己的解决方案(Google GKE,Amazon EKS,Microsoft AKS,DigitalOcean DOKS,Civo Kubernetes等)。有时我们只想在本地运行一个k8s集群,所以这篇文章列出了可以达成这个目标的一些主流选项。
快速笔记
要从本地计算机访问Kubernetes集群,我们首先需要安装和配置kubectl,该命令行工具用于将请求发送到集群的API服务器。kubectl的安装非常简单(下载二进制文件并在$PATH添加安装路径),我们将在例子中看到如何配置kubectl来操作特定k8s集群。
还有几种在虚拟机中运行集群的方案。在下面的几个示例中,我们将使用Multipass,它是一个很棒的工具,可以在Mac,Linux或Windows工作站上启动Ubuntu VM。根据您的操作系统,它会在本使用Hyper-V,HyperKit,KVM或VirtualBox来获得最快的启动时间。
Minikube可能是最著名的解决方案,它启动虚拟机并在其中运行所有Kubernetes的进程。Minikube默认情况下与VirtualBox一起运行,但是现在它可以选择系统上可用的最佳驱动程序。
我们首先需要下载最新的稳定版,然后运行minikube start
,我们可以开始了。以下是在MacOS上启动Minikube的示例。
在启动过程中,kubeconfig文件(默认情况下为~/.kube/config)被更新(如果尚未存在,则被创建),并创建一个名为minikube的新上下文(context)。该上下文被设置为默认上下文,这样kubectl可以立即与minikube通信。
在MacOS或Windows 10上,我们可以使用Docker Desktop,该工具专注于开发人员的经验来构建和共享容器化的应用程序和微服务。Docker Desktop附带了很多众所周知的工具,例如Docker Compose和Docker Machine。
Docker Desktop的发行版可在https://www.docker.com/products/docker-desktop上获得。安装后,我们可以将其配置为运行单节点Kubernetes的机器。
这将创建一个名为docker-desktop
的新上下文。我们只需要将此上下文设置为当前上下文,就可以开始使用了。
$ kubectl config use-context docker-desktop
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
docker-desktop Ready master 22d v1.15.5
Kind代表在Docker中的Kubernetes,因为每个集群的节点都在Docker容器中运行。
要使用它,我们需要Docker(已安装在Docker Desktop或通过快捷方式curl https://get.docker.com | sh
安装)和最新的Kind版本。以下屏幕快照显示了可用于管理集群生命周期的命令。
创建单节点集群非常简单,如以下命令所示:
Kind还允许创建多节点群集,为此我们需要一个配置文件。例如,以下文件定义了6个节点的集群:3个主节点和3个工作节点。
# HA-config.yaml
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker
在creation命令中,我们只需要以附加参数的形式提供配置文件即可:
创建了上述两个集群后,我们可以看到在本地计算机上运行的相应Docker容器。有7个基于```kindest/node:v1.16.3`` Docker镜像的容器,每个容器都属于一个集群。
对于前面的示例,Kind使用新的上下文更新kubeconfig文件(默认情况下为~/.kube/config)。在下面的列表中,我们可以看到到目前为止创建的不同上下文:
$ kubectl config get-contexts
docker-desktop docker-desktop docker-desktop
kind-k8s kind-k8s kind-k8s
* kind-k8s-HA kind-k8s-HA kind-k8s-HA
minikube minikube minikube
我们看到:当前上下文指向我们创建的最后一个集群k8s-HA
。如果我们列出该集群节点,则将获得集群的3个主节点和3个工作节点:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-ha-control-plane Ready master 4m8s v1.16.3
k8s-ha-control-plane2 Ready master 3m24s v1.16.3
k8s-ha-control-plane3 Ready master 2m24s v1.16.3
k8s-ha-worker Ready <none> 107s v1.16.3
k8s-ha-worker2 Ready <none> 106s v1.16.3
k8s-ha-worker3 Ready <none> 106s v1.16.3
MicroK8s是专注于简单性和开发人员体验的工具。它非常适合IoT、Edge并可以在Linux机器上运行。它非常轻巧,但是提供了许多预先打包好的“附加组件”,为Kubernetes提供了一些额外的功能:从简单的DNS管理到使用Kubeflow的机器学习。
请参阅Kelsey Hightower的有关MicroK8的推文:)
在Windows,MacOS或Linux上,通过multipass工具,MicroK8s可以很容易地安装在一个Ubuntu的虚拟机中。
# Create a new Ubuntu VM
$ multipass launch --name microk8s --mem 4G
# Install microk8s in the VM through snap
$ multipass exec microk8s -- sudo snap install microk8s --classic
然后,我们将集群配置复制到本地文件中:
$ multipass exec microk8s -- sudo microk8s.config > microk8s.yaml
注意:MicroK8带有几个二进制文件,其中:
- microk8s.config:提供kubectl配置以供外部使用
- microk8s.kubectl:microk8s自己的kubectl
最后,我们设置KUBECONFIG环境变量来定义本地kubectl使用的上下文:
$ export KUBECONFIG=$PWD/microk8s.yaml
我们准备好使用您的新MicroK8s单节点集群:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
microk8s Ready <none> 4m48s v1.16.3
K3s是轻量级的Kubernetes(比k8s少了5个s:))。这是经过认证的Kubernetes发行版,专用于物联网,边缘计算,CI等…
在Windows,MacOS的或Linux上,通过multipass,K3s可以很容易地安装在Ubuntu的虚拟机中,正如microk8s那样。
# Create a new Ubuntu VM
$ multipass launch --name k3s
# Get the VM's IP address (we will need it later on)
$ IP=$(multipass info k3s | grep IP | awk '{print $2}')
# Run a shell in the VM
$ multipass exec k3s -- \
bash -c "curl -sfL https://get.k3s.io | sh -"
安装完成后,我们在本地计算机上复制在VM 中生成的kubeconfig文件:/etc/rancher/k3s/k3s.yaml
。
$ multipass exec k3s sudo cat /etc/rancher/k3s/k3s.yaml > k3s.yaml
在此文件中,我们需要更改服务器密钥,以便它引用VM的外部IP而不是环回ip(127.0.0.1)。
$ sed -i '' "s/127.0.0.1/$IP/" k3s.yaml
然后,我们设置KUBECONFIG环境变量来设置kubectl使用的上下文:
$ export KUBECONFIG=$PWD/k3s.yaml
然后我们就可以开始使用K3s了!
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s Ready master 2m40s v1.16.3-k3s.2
注意:如果您使用的是Linux,则可以使用以下命令直接安装k3s
$ curl -sfL https://get.k3s.io | sh -
在上一篇文章中,您将找到设置K3s多节点群集的其他详细信息。
k3d
k3d是Rancher实验室的另一种工具,它在容器中部署了k3s集群(感谢Michael Martinez讨论了这一点)。它只需要一台运行Docker的机器。
安装k3d非常简单,可以使用以下命令完成:
$ curl -s https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash
创建集群需要带有一些可选参数的k3d create命令
,例如:
- 集群的名称
- 在本地计算机上发布api服务器的端口(默认为6443)
- 向外界发布服务的港口
- 多节点集群的工作节点数量
在下面的屏幕截图中,我们创建了一个名为k3s的群集,其中包含2个工作节点(在主节点的顶部)
我们可以看到创建了3个容器,每个容器用于集群的每个节点。
然后,我们可以将KUBECONFIG环境变量设置为使用为集群创建的kubeconfig:
$ export KUBECONFIG="$(k3d get-kubeconfig --name='k3s')"
并开始使用我们的新集群:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3d-k3s-server Ready master 4m45s v1.16.2-k3s.1
k3d-k3s-worker-1 Ready <none> 4m45s v1.16.2-k3s.1
k3d-k3s-worker-0 Ready <none> 4m44s v1.16.2-k3s.1
注意:为了向外部公开服务,需要使用–publish标志创建集群,文档中对几个配置选项有详细说明。
k3sup
k3sup是Alex Ellis的一个很棒的工具,用于设置k3s集群(以及更多),它只需要通过ssh访问先前设置的VM。让我们看看它如何与使用Multipass创建的VM一起工作。
Multipass使用自己的密钥通过ssh连接它创建的VM,此密钥的位置取决于操作系统(例如,在MacOS上,其位于/var/root/Library/Application Support/multipassd/ssh-keys/id_rsa中)。通常建议使用cloud-init文件启动一个Multipass VM,该文件定义了ssh授权密钥。
假设我们的公钥在~/.ssh/id_rsa.pub(默认位置)中,则可以使用以下命令创建一个简单的cloud-init文件:
$ cat<<EOF > cloud.init
ssh_authorized_keys:
— $(cat ~/.ssh/id_rsa.pub)
EOF
使用此文件,我们创建一个VM并获取其IP地址。
# Create a new Ubuntu VM
$ multipass launch --name k3s --cloud-init cloud.init
# Get the VM's IP address
$ export IP=$(multipass info k3s | grep IP | awk '{print $2}')
然后我们使用以下命令用k3sup设置一个k3s集群
$ k3sup install --ip $IP --user multipass
k3s已准备就绪,可以使用在当前目录中创建的kubeconfig文件进行访问。
$ export KUBECONFIG=$PWD/kubeconfig
$ kubectl get node
NAME STATUS ROLES AGE VERSION
k3s Ready master 105s v1.16.3-k3s.2
kubectx和kube-ps1
如果您在阅读本文的同时测试了上述几种工具,那么您现在将拥有多个本地kubectl可以使用的上下文,以定位一个或另一个集群。例如:可用的上下文示例:
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
docker-desktop docker-desktop docker-desktop
kind-k8s kind-k8s kind-k8s
* kind-k8s-HA kind-k8s-HA kind-k8s-HA
minikube minikube minikube
为了更轻松地在这些上下文之间切换,建议您尝试使用kubectx。它的安装非常简单,因为它只是一个添加到PATH变量中的shell脚本。
另外,要避免“对错误的集群运行命令”,kube-ps1是必须具备的。该工具通过当前的群集和名称空间提供了出色的PS1/PROMPT。只需检查一下:
# Shell without kube-ps1
luc@saturn:~$
# Shell with kube-ps1
[luc@saturn ~ (⎈ |kind-k8s:default)]$
在线试验场
其他解决方案可以在线使用Kubernetes。这不在本篇文章的范围,这里顺带说一下:)
Katacoda专注于Cloud Native应用程序,其中包括Kubernetes以及许多其他项目和技术。这是学习有关许多主题的交互式教程的好地方,其中包括:
- Kubernetes和相关技术
- 无服务器
- terraform
- 机器学习
- 编程语言:Go,Ruby,Node.Js,Python,Kotlin等
- Linux
- …
katacoda所有可用的学习途径可以查看这里!
小结
我们在本文中详细介绍了可用于设置本地Kubernetes集群的所有工具。它们具有不同的功能和选项:快速设置,轻松升级,定期更新,与生态系统的其他项目的简化集成…,我建议您实践其中的一些(全部?:)),然后选择最适合您的需求的一个。同样,如我们在示例中所看到的,Multipass是一个很棒的工具,可简化VM创建过程。
讲师主页:tonybai_cn
讲师博客: Tony Bai
实战课:《Kubernetes实战:高可用集群搭建,配置,运维与应用》
免费课:《Kubernetes基础:开启云原生之门》