2.2 配置Kubernetes集群

2.2 配置Kubernetes集群

现在,应用被打包在一个容器镜像中,并通过Docker Hub给大家使用,可以将它部署到Kubernetes集群中,而不是直接在Docker中运行。但是需要先设置集群。

设置一个完整的、多节点的Kubernetes集群并不是一项简单的工作,特别是如果你不精通Linux和网络管理的话。一个适当的Kubernetes安装需要包含多个物理或虚拟机,并需要正确地设置网络,以便在Kubernetes集群内运行的所有容器都可以在相同的扁平网络环境内相互连通。

安装Kubernetes集群的方法有许多。这些方法在http://kubernetes.io的文档中有详细描述。我们不会在这里列出所有,因为内容在不断变化,但Kubernetes可以在本地的开发机器、自己组织的机器集群或是虚拟机提供商(Google Compute Engine、Amazon EC2、Microsoft Azure等)上运行,或者使用托管的Kubernetes集群,如Google Kubernetes Engine(以前称为Google Container Engine)。

在这一章中,将介绍用两种简单的方法构建可运行的Kubernetes集群,你将会看到如何在本地机器上运行单节点Kubernetes集群,以及如何访问运行在Google Kubernetes Engine(GKE)上的托管集群。

第三个选项是使用 kubeadm 工具安装一个集群,这会在附录B中介绍,这里的说明向你展示了如何使用虚拟机建立一个三节点的Kubernetes集群,但是建议你在阅读本书的前11章之后再尝试。

另一个选择是在亚马逊的AWS(Amazon Web Services)上安装Kubernetes。为此,可以查看 kops 工具,它是在前面一段提到的 kubeadm 基础之上构建的,可以在http://github.com/kubernetes/kops中找到。它帮助你在AWS上部署生产级、高可用的Kubernetes集群,并最终会支持其他平台(Google Kubernetes Engine、VMware、vSphere等)。

2.2.1 用Minikube运行一个本地单节点Kubernetes集群

使用Minikube是运行Kubernetes集群最简单、最快捷的途径。Minikube是一个构建单节点集群的工具,对于测试Kubernetes和本地开发应用都非常有用。

虽然我们不能展示与管理多节点应用相关的一些Kubernetes特性,但是单节点集群足以探索本书中讨论的大多数主题。

安装Minikube

Minikube是一个需要下载并放到路径中的二进制文件。它适用于OSX、Linux和Windows系统。最好访问GitHub上的Minikube代码仓库(http://github.com/kubernetes/minikube),按照说明来安装它。

例如,在OSX和Linux系统上,可以使用一个命令下载Minikube并进行设置。对于OSX系统,命令是这样的:

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/ v0.23.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube/usr/local/bin/

在Linux系统中,可以下载另一个版本(将URL中的 “darwin” 替换为“linux”)。在Windows系统中,可以手动下载文件,将其重命名为minikube.exe,并把它加到路径中。Minikube在VM中通过VirtualBox或KVM运行Kubernetes,所以在启动Minikube集群之前,还需要安装VM。

使用Minikue启动一个Kubernetes集群

当你在本地安装了Minikube之后,可以立即使用下面的命令启动Kubernetes集群。

代码清单2.10 启动一个Minikube虚拟机

s minikube start starting local Kubernetes cluster… starting vM… SSH-ing files into vM…. … kubectl is now configured to use the cluster.

启动集群需要花费超过一分钟的时间,所以在命令完成之前不要中断它。

安装Kubernetes客户端(kubectl)

要与Kubernetes进行交互,还需要 kubectl CLI客户端。同样,需要做的就是下载它,并放在路径中。例如,OSX系统的最新稳定版本可以通过以下命令下载并安装:

$ curl -Lo https://storage.googleapis.com/kubernetes-release/release /$(curl -s https://storage.googleapis.com/kubernetes-release/release /stable.txt) /bin/darwin/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/

要下载用于Linux或Windows系统的kubectl,用 linux 或 windows 替换URL中的 darwin。

注意 如果你需要使用多个Kubernetes集群(例如,Minikube和GKE),请参考附录A,了解如何在不同的 kubectl 上下文中设置和切换。

使用kubectl查看集群是否正常工作

要验证集群是否正常工作,可以使用以下所示的 kubectl cluster-info命令。

代码清单2.11 展示集群信息

s kubectl cluster-info Kubernetes master is running at https://192.168.99.100:8443 KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/… kubernetes-dashboard is running at https://192.168.99.100:8443/api/v1/…..

这里显示集群已经启动。它显示了各种Kubernetes组件的URL,包括API服务器和Web控制台。

提示 可以运行 minikube ssh 登录到Minikube VM并从内部探索它。例如,可以查看在节点上运行的进程。

2.2.2 使用Google Kubernetes Engine托管Kubernetes集群

如果你想探索一个完善的多节点Kubernetes集群,可以使用托管的Google Kubernetes Engine(GKE)集群。这样,无须手动设置所有的集群节点和网络,因为这对于刚开始使用Kubernetes的人来说太复杂了。使用例如GKE这样的托管解决方案可以确保不会出现配置错误、不工作或部分工作的集群。

配置一个Google Cloud项目并且下载必需的客户端二进制

在设置新的Kubernetes集群之前,需要设置GKE环境。因为这个过程可能会改变,所以不在这里列出具体的说明。阅读https://cloud.google.com/containerengine/docs/before-begin中的说明后就可以开始了。

整个过程大致包括:

注册谷歌账户,如果你还没有注册过。在Google Cloud Platform控制台中创建一个项目。开启账单。这会需要你的信用卡信息,但是谷歌提供了为期12个月的免费试用。而且在免费试用结束后不会自动续费。开启Kubernetes Engine API。下载安装Google Cloud SDK(这包含 gcloud 命令行工具,需要创建一个Kubernetes集群)。使用 gcloud components install kubectl 安装 kubectl 命令行工具。

注意 某些操作(例如步骤2中的操作)可能需要几分钟才能完成,所以在此期间可以喝杯咖啡放松一下。

创建一个三节点Kubernetes集群

完成安装后,可以使用下面代码清单中的命令创建一个包含三个工作节点的Kubernetes集群。

代码清单2.12 在GKE上创建一个三节点集群

$ gcloud container clusters create kubia –num-nodes 3 –machine-tvpe fl-micro Creating cluster kubia… done Created [https://container.googleapis.com/y1/proiects/kubial-1227/zones/europe-west1-d/clusters/kubia] kubeconfig entry generated for kubia. NAME ZONE MST VER MASTER IP TYPE NODE VER NUM NODES STATUSkubia eu-wld 1.5.3 104.155.92.30 fl-micro 1.5.3: RUNNING

现在已经有一个正在运行的Kubernetes集群,包含了三个工作节点,如图 2.4所示。你在使用三个节点来更好地演示适用于多节点的特性,如果需要的话可以使用较少数量的节点。

获取集群概览

图 2.4 能够让你对集群,以及如何与集群交互有一个初步的认识。每个节点运行着Docker、Kubelet和kube-proxy。可以通过 kubectl 命令行客户端向运行在主节点上的Kubernetes API服务器发出REST请求以与集群交互。

图2.4 如何与三节点Kubernetes集群进行交互

通过列出集群节点查看集群是否在运行

现在可以使用kubectl命令列出集群中的所有节点,如下面的代码清单所示。

代码清单2.13 使用kubectl列出集群节点

# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane,master 10h v1.20.2 k8s-node1 NotReady <none> 9h v1.20.2 k8s-node2 NotReady <none> 9h v1.20.2

kubectl get 命令可以列出各种Kubernetes对象。你将会经常使用到它,但它通常只会显示对象最基本的信息。

提示 可以使用 gcloud compute ssh <node-name> 登录到其中一个节点,查看节点上运行了什么。

查看对象的更多信息

要查看关于对象的更详细的信息,可以使用 kubectl describe 命令,它显示了更多信息:

# kubectl describe node k8s-master Name: k8s-master Roles: control-plane,master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=k8s-master kubernetes.io/os=linux node-role.kubernetes.io/control-plane= node-role.kubernetes.io/master= Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock node.alpha.kubernetes.io/ttl: 0 volumes.kubernetes.io/controller-managed-attach-detach: true CreationTimestamp: Fri, 12 Feb 2021 21:32:22 +0800 Taints: node-role.kubernetes.io/master:NoSchedule node.kubernetes.io/not-ready:NoSchedule Unschedulable: false Lease: HolderIdentity: k8s-master AcquireTime: <unset> RenewTime: Sat, 13 Feb 2021 07:41:25 +0800 Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message —- —— —————– —————— —— ——- MemoryPressure False Sat, 13 Feb 2021 07:38:24 +0800 Fri, 12 Feb 2021 21:32:19 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Sat, 13 Feb 2021 07:38:24 +0800 Fri, 12 Feb 2021 21:32:19 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False Sat, 13 Feb 2021 07:38:24 +0800 Fri, 12 Feb 2021 21:32:19 +0800 KubeletHasSufficientPID kubelet has sufficient PID available Ready False Sat, 13 Feb 2021 07:38:24 +0800 Fri, 12 Feb 2021 21:32:19 +0800 KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized Addresses: InternalIP: 192.168.137.100 Hostname: k8s-master Capacity: cpu: 2 ephemeral-storage: 38770180Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 3880576Ki pods: 110 Allocatable: cpu: 2 ephemeral-storage: 35730597829 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 3778176Ki pods: 110 System Info: Machine ID: 4eec0f78eb7f4eb8b33480fe97fca874 System UUID: 5A5A9919-F309-7748-9C28-CB280C32FD39 Boot ID: dc707f60-c19b-4883-889a-81cac673950c Kernel Version: 3.10.0-1160.15.2.el7.x86_64 OS Image: CentOS Linux 7 (Core) Operating System: linux Architecture: amd64 Container Runtime Version: docker://20.10.3 Kubelet Version: v1.20.2 Kube-Proxy Version: v1.20.2 PodCIDR: 10.244.0.0/24 PodCIDRs: 10.244.0.0/24 Non-terminated Pods: (5 in total) Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE ——— —- ———— ———- ————— ————- — kube-system etcd-k8s-master 100m (5%) 0 (0%) 100Mi (2%) 0 (0%) 10h kube-system kube-apiserver-k8s-master 250m (12%) 0 (0%) 0 (0%) 0 (0%) 10h kube-system kube-controller-manager-k8s-master 200m (10%) 0 (0%) 0 (0%) 0 (0%) 10h kube-system kube-proxy-mskzh 0 (0%) 0 (0%) 0 (0%) 0 (0%) 10h kube-system kube-scheduler-k8s-master 100m (5%) 0 (0%) 0 (0%) 0 (0%) 10h Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits ——– ——– —— cpu 650m (32%) 0 (0%) memory 100Mi (2%) 0 (0%) ephemeral-storage 100Mi (0%) 0 (0%) hugepages-1Gi 0 (0%) 0 (0%) hugepages-2Mi 0 (0%) 0 (0%) Events: Type Reason Age From Message —- —— —- —- ——- Normal NodeHasSufficientMemory 10h (x5 over 10h) kubelet Node k8s-master status is now: NodeHasSufficientMemory Normal NodeHasNoDiskPressure 10h (x5 over 10h) kubelet Node k8s-master status is now: NodeHasNoDiskPressure Normal NodeHasSufficientPID 10h (x4 over 10h) kubelet Node k8s-master status is now: NodeHasSufficientPID Normal Starting 10h kubelet Starting kubelet. Normal NodeHasSufficientMemory 10h kubelet Node k8s-master status is now: NodeHasSufficientMemory Normal NodeHasNoDiskPressure 10h kubelet Node k8s-master status is now: NodeHasNoDiskPressure Normal NodeHasSufficientPID 10h kubelet Node k8s-master status is now: NodeHasSufficientPID Normal NodeAllocatableEnforced 10h kubelet Updated Node Allocatable limit across pods Normal Starting 10h kube-proxy Starting kube-proxy. Normal Starting 18m kubelet Starting kubelet. Normal NodeHasSufficientMemory 18m (x8 over 18m) kubelet Node k8s-master status is now: NodeHasSufficientMemory Normal NodeHasNoDiskPressure 18m (x8 over 18m) kubelet Node k8s-master status is now: NodeHasNoDiskPressure Normal NodeHasSufficientPID 18m (x7 over 18m) kubelet Node k8s-master status is now: NodeHasSufficientPID Normal NodeAllocatableEnforced 18m kubelet Updated Node Allocatable limit across pods Normal Starting 18m kube-proxy Starting kube-proxy.

这里省略了 describe 命令的实际输出,因为内容非常多且在书中是完全不可读的。输出显示了节点的状态、CPU和内存数据、系统信息、运行容器的节点等。

在前面的 kubectl describe 示例中,显式地指定了节点的名称,但也可以执行一个简单的 kubectl describe node 命令,而无须指定节点名,它将打印出所有节点的描述信息。

提示 当只有一个给定类型的对象存在时,不指定对象名就运行 description和 get 命令是很提倡的,这样不会浪费时间输入或复制、粘贴对象的名称。

当我们讨论减少输入的时候,开始在Kubernetes运行第一个应用程序之前,先学习如何让 kubectl 命令的使用变得更容易。

2.2.3 为kubectl配置别名和命令行补齐

kubectl 会被经常使用。很快你就会发现每次不得不打全命令是非常痛苦的。在继续之前,花一分钟为kubectl 设置别名和tab命令补全可让使用变得简单。

创建别名

在整本书中,一直会使用 kubectl 可执行文件的全名,但是你可以添加一个较短的别名,如 k,这样就不用每次都输入 kubectl 了。如果还没有设置别名,这里会告诉你如何定义。将下面的代码添加到 ~/.bashrc 或类似的文件中:

alias k=kubectl

注意 如果你已经在用 gcloud 配置集群,就已经有可执行文件 k 了。

为kuebctl配置tab补全

即使使用短别名k,仍然需要输入许多内容。幸运的是,kubectl命令还可以配置bash和zsh shell的代码补全。tab补全不仅可以补全命令名,还能补全对象名。例如,无须在前面的示例中输入整个节点名,只需输入

$ kubectl desc<TAB> no<TAB> gke-ku<TAB>

需要先安装一个叫作 bashcompletion 的包来启用bash中的tab命令补全,然后可以运行接下来的命令(也需要加到 ~/.bashrc 或类似的文件中):

$ source <(kubectl completion bash)

但是需要注意的是,tab命令行补全只在使用完整的 kubectl 命令时会起作用(当使用别名 k 时不会起作用)。需要改变 kubectl completion 的输出来修复:

$ source <(kubectl completion bash | sed s/kubectl/k/g)

注意 不幸的是,在写作本书之时,别名的shell命令补全在MacOS系统上并不起作用。如果需要使用命令行补全,就需要使用完整的 kubectl 命令。

现在你已经准备好无须输入太多就可以与集群进行交互。现在终于可以在Kubernetes上运行第一个应用了。

    THE END
    喜欢就支持一下吧
    点赞5 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容