继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

在你的机器上运行Kubernetes - 快速开始使用k8s的几个主流选项

tonybai
关注TA
已关注
手记 168
粉丝 7768
获赞 488

图片描述

获取一个在线的Kubernetes集群非常容易,因为几乎每个云提供商都提供自己的解决方案(Google GKEAmazon EKSMicrosoft AKSDigitalOcean DOKSCivo 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的示例。

图片描述

默认情况下使用HyperKit在MacOS上运行Minikube

在启动过程中,kubeconfig文件(默认情况下为~/.kube/config)被更新(如果尚未存在,则被创建),并创建一个名为minikube的新上下文(context)。该上下文被设置为默认上下文,这样kubectl可以立即与minikube通信。

图片描述

获取Minikube的节点

图片描述

在MacOS或Windows 10上,我们可以使用Docker Desktop,该工具专注于开发人员的经验来构建和共享容器化的应用程序和微服务。Docker Desktop附带了很多众所周知的工具,例如Docker Compose和Docker Machine。

Docker Desktop的发行版可在https://www.docker.com/products/docker-desktop上获得。安装后,我们可以将其配置为运行单节点Kubernetes的机器。

图片描述

在Docker Desktop(MacOS)上启用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-可用命令

创建单节点集群非常简单,如以下命令所示:

图片描述

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命令中,我们只需要以附加参数的形式提供配置文件即可:

图片描述

使用kind创建多节点集群

创建了上述两个集群后,我们可以看到在本地计算机上运行的相应Docker容器。有7个基于```kindest/node:v1.16.3`` Docker镜像的容器,每个容器都属于一个集群。

图片描述

每个kind的节点都运行到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个工作节点(在主节点的顶部)

图片描述

用k3d创建的k3s集群

我们可以看到创建了3个容器,每个容器用于集群的每个节点。

图片描述

在容器中运行的k3s节点

然后,我们可以将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

k3supAlex 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。这不在本篇文章的范围,这里顺带说一下:)

图片描述

图片描述

  • PWK
    PWK(Play With Kubernetes)是PWD(Play with Docker)的小兄弟。它提供了一个具有5个终端的环境,可用4小时,并指导您使用kubeadm(用于设置生产集群的工具)设置Kubernetes集群。PWK中的终端感觉就像是真实VM中的shell,但它实际上是在Alpine容器中运行的shell,该容器中已经安装了多种工具(docker,kubectl,kubelet等)。

  • katacoda

Katacoda专注于Cloud Native应用程序,其中包括Kubernetes以及许多其他项目和技术。这是学习有关许多主题的交互式教程的好地方,其中包括:

  • Kubernetes和相关技术
  • 无服务器
  • terraform
  • 机器学习
  • 编程语言:Go,Ruby,Node.Js,Python,Kotlin等
  • Linux

katacoda所有可用的学习途径可以查看这里

小结

我们在本文中详细介绍了可用于设置本地Kubernetes集群的所有工具。它们具有不同的功能和选项:快速设置,轻松升级,定期更新,与生态系统的其他项目的简化集成…,我建议您实践其中的一些(全部?:)),然后选择最适合您的需求的一个。同样,如我们在示例中所看到的,Multipass是一个很棒的工具,可简化VM创建过程。


打开App,阅读手记
“小礼物走一走,来慕课关注我”
赞赏支持
Tony Bai 说
去围观
Tony Bai,智能网联汽车独角兽公司先行研发部负责人,Go语言专家,资深架构师,《Go语言精进之路》作者。
发表评论
随时随地看视频慕课网APP