自学内容网 自学内容网

第3章 安装Kubernetes

本章将介绍几种快速安装Kubernetes的方法。

如下是3种典型的获得Kubernetes的途径。

  • 测试用练习环境。
  • 托管的Kubernetes
  • 自定义安装。

3.1 Kubernetes练习环境

测试用的练习环境是最简单的获得Kubernetes的方式,不过并不能用于生产。常见的例子包括Magic SandboxPlay with Kubernetes以及桌面版Docker

对于Magic Sandbox,只需要注册一个账号并登录,即可马上得到一个完整可用的多节点私有集群。其中还有一些内置课程和上手实验。

对于Play with Kubernetes,需要使用一个GitHubDocker Hub账号完成登录,并完成一些简单的操作来搭建一个持续4h的集群。

桌面版Docker是一个来自Docker公司的免费桌面应用。只需要下载并运行安装程序,简单几步单击就可以在计算机上部署一个单节点的环境。

3.2 托管的Kubernetes环境

大多数的主流云平台提供托管的Kubernetes(hosted Kubernetes)服务。采用这种方式,控制平面(control plane,即master)的相关组件是由云平台管理的。例如,云服务供应商会确保控制平面的高可用和高性能,并负责使控制平面保持更新。另外,用户失去对版本的部分控制,定制化的能力也会受到限制。

抛开优缺点不谈,托管的Kubernetes服务是最开箱即用的生产级别的Kubernetes了。事实上,Google Kubernetes引擎(Google Kubernetes Engine, GKE)可以让用户在几个简单的单击之后就能完成生产级别的Kubernetes集群和Istio服务网格(Service Mesh)的部署。其他云厂商也有类似的服务。

  • AWS: Elastic Kubernetes Service(EKS)。
  • Azure: Azure Kubernetes Service(AKS)。
  • DigitalOcean: DigitalOcean Kubernetes。
  • IBM Cloud: IBM Cloud Kubernetes Service。
  • Google Cloud Platform: Google Kubernetes Engine(GKE)。

在考虑选择以上某项服务来搭建自己的Kubernetes集群时,尝试问自己:自行搭建和管理Kubernetes集群能否实现时间和其他资源的最大化利用?如果答案不是“当然是”,那么我强烈建议考虑托管的服务。

3.3 自定义Kubernetes集群

自行安装搭建Kubernetes集群是最难的方式。

是的,自行安装的过程已经比以前容易多了,但是依然比较难。不过,这种方式具有最高的灵活性,而且可以通过配置实现对集群的完全控制——这是一把双刃剑。

3.4 安装Kubernetes

搭建Kubernetes集群的方式可谓五花八门,我无意全部予以介绍(可能有上百种方式)。本书介绍的方式相对简单,我选择它们的原因在于,用这些方式和相关示例部署Kubernetes集群更加简单快速。

后续所有的示例都可以用于Magic SandboxGKE,其中大部分示例亦适用于其他安装方式。

本书将介绍如下方式。

  • Play with Kubernetes(PWK)。
  • 桌面版Docker:计算机上的本地开发集群环境。
  • Google Kubernetes引擎(GKE):生产级别托管集群。

3.5 Play with Kubernetes

[Play with Kubernetes](https://labs.play-with-k8s.com/)(PWK)是一种简单快捷的上手Kubernetes开发环境的方式,只需要一台能够联网的计算机,以及Docker Hub或GitHub的账号即可。

然而它也有些限制。

  • 时间受限——每次最长的使用时间为4h。
  • 缺少与部分外部服务集成的能力,比如基于云的负载均衡、云存储卷。
  • 经常会受到容量限制(它是作为免费服务提供的)。

下面实际操作一下。

  1. 使用浏览器进入官网下载。
  2. 使用GitHubDocker Hub账号登录,并单击Start
  3. 在左侧导航栏中单击+ ADD NEW INSTANCE,网页右侧会出现一个控制台窗口。这是一个Kubernetes节点(node1)。
  4. 执行以下几个命令来查看节点上预装的组件。
$ docker version 
Docker version 19.03.11-ce... 
$ kubectl version --output=yaml 
clientVersion:  
... 
  major: "1" 
  minor: "18"

由输出可见,节点中已经安装了DockerkubectlKubernetes客户端)。其他工具比如kubeadm也已经预装。

需要指出的是,虽然命令提示符是$,但当前用户是root,这一点可以通过执行whoamiid命令来验证。

  1. 使用kubeadm init命令来初始化一个新的集群。

在通过第3步添加一个新实例后,PWK会给出几个用于初始化新Kubernetes集群的命令。其中一条是kubeadm init…,之后的命令会初始化一个新的集群,并使API Server在正确网卡的IP上监听。

还可以通过在命令中添加--kubernetes-version参数来指定要安装的Kubernetes版本。可以在Kubernetes项目的GitHub页面查看最新版本。并非所有的版本都可以在PWK上运行。

$ kubeadm init --apiserver-advertise-address $(hostname -i) --Pod-network-cidr... 
[kubeadm] WARNING: kubeadm is in beta, do not use it for prod...  
[init] Using Kubernetes version: v1.18.8  
[init] Using Authorization modes: [Node RBAC]  
<Snip> 
Your Kubernetes master has initialized successfully! 
<Snip>

恭喜!现在已经启动了一个全新的单节点Kubernetes集群。执行命令所在的节点(node1)已经被初始化为主节点。

kubeadm init命令会给出一系列用户可能要执行的命令。它们用来复制Kubernetes配置文件和设置权限。不过这里可以忽略,因为PWK已经为用户配置好了。不妨到$HOME/.kube中查看一下。

  1. 执行如下的kubectl命令来查看集群信息。
$ kubectl get nodes  
NAME      STATUS       ROLES   AGE     VERSION 
node1     NotReady     master  1m      v1.18.4

输出显示这是一个单节点集群。但是节点的状态是NotReady,这是因为尚未配置Pod网络。当第一次登录PWK的节点时,会收到3个用来配置集群的命令。现在刚刚执行了第一条(kubeadm init…)。

  1. 初始化Pod网络(集群网络)。

复制在最初创建node1时屏幕打印出的3条命令中的第二条(也就是kubectl apply命令),粘贴到控制台中执行。本书所示的命令(为了排版)会分为多行,并用反斜杠(\)来换行。读者应该删掉行尾的反斜杠。

$ kubectl apply -f https://raw.githubusercontent.com... 
configmap/kube-router-cfg created 
daemonset.apps/kube-router created 
Serviceaccount/kube-router created 
clusterrole.rbac.authorization.k8s.io/kube-router created 
clusterrolebinding.rbac.authorization.k8s.io/kube-router created
  1. 再次查看集群信息,观察node1的状态是否已经更新至Ready
 kubectl get nodes  
NAME      STATUS     ROLES    AGE      VERSION
node1     Ready      master   2m       v1.18.4

现在Pod网络已经初始化,控制层也已经Ready,那么可以添加一些工作节点(worker node)了。

  1. 复制kubeadm init命令执行后打印出的kubeadm join命令。

当使用kubeadm init命令初始化新集群时,输出的最后会给出用于添加节点的kubeadm join命令。这条命令包含加入集群所用的join-tokenAPI Server所监听的IP socket,以及添加新节点到集群时所需的其他信息。复制这条命令以便接下来在新节点(node2)的控制台中进行粘贴。

  1. 单击PWK页面左侧的+ ADD NEW INSTANCE按钮。

此时会得到一个名为node2的新节点。

  1. node2的控制台中粘贴kubeadm join命令。

读者环境中的join-tokenIP地址会有差异。

 kubeadm join --token 948f32.79bd6c8e951cf122 10.0.29.3:6443...  
Initializing machine ID from random generator.  
[preflight] Skipping pre-flight checks  
<Snip>  
Node join complete:  
 * Certificate signing request sent to master and response received.
 * Kubelet informed of new secure connection details.
  1. 切换回node1并再次执行kubectl get nodes命令。
ubectl get nodes  
NAME      STATUS     ROLES     AGE     VERSION 
node1     Ready      master    5m      v1.18.4 
node2     Ready      <none>    1m      v1.18.4

现在Kubernetes集群中已经有两个节点了:一个主节点和一个工作节点。

请根据需要自行添加其他节点。

恭喜!现在读者已经有一个可以用来测试的Kubernetes集群了。

需要指出的是,node1被初始化为Kubernetes主节点,并且其他节点会作为工作节点添加进来。PWK通常会在主节点旁放置一个蓝色图标,并在工作节点旁放置一个透明图标,以方便用户进行区分。

PWK的会话只能持续4h,这显然不可用于生产环境。

请上手练习吧!

3.6 桌面版Docker

桌面版Docker是在读者自己的macOSWindows中部署本地开发环境的最佳方式。只需几个步骤就可以轻松地部署一个用于开发和测试的单节点的Kubernetes集群。

桌面版Docker通过创建一个虚拟机,然后在虚拟机中启动一个单节点的Kubernetes集群来实现。同时它还会完成kubectl客户端的配置,以便连接集群。最后,还有一个简单的图形界面用来执行诸如切换kubectl context的基本操作。

注:所谓kubectl context,就是用来告诉kubectl命令“去连接哪个集群”的一系列配置。

  1. 打开Docker主页,选择Products >桌面版Docker
  2. 单击macOSWindows对应的下载按钮。

可能需要登录Docker Store,账号和桌面版Docker软件一样都是免费的。

  1. 打开下载的安装程序,并按步骤安装。

安装完成后,会有一个鲸鱼图标出现在Windows任务栏或macOS的菜单栏中。

  1. 单击鲸鱼图标(可能需要右击),进入设置界面,然后在Kubernetes页签中启用Kubernetes

此时可以打开终端查看集群信息。

kubectl get nodes  
NAME                   STATUS    ROLES      AGE     VERSION
docker-for-desktop     Ready     master     28d     v1.16.6 

恭喜!现在读者已经有一个本地的Kubernetes集群了。

3.7 Google Kubernetes引擎(GKE)

Google Kubernetes引擎(Google Kubernetes Engine, GKE)是运行在Google云平台(Google Cloud Platform, GCP)上的托管Kubernetes服务。类似于其他的托管Kubernetes服务。

  • 提供简单快捷的搭建生产级Kubernetes集群的能力。
  • 提供管理控制面板(用户无须管理主节点)。
  • 按功能项收费。

注:GKE等托管的Kubernetes服务并不是免费的。有些服务可能提供试用版或一定数量的免费试用券。不过总体来说,还是需要花钱使用的。

配置GKE若要使用GKE的话,用户需要事先准备一个配置好付费信息的Google云的账号,以及一个空项目。这些都比较容易,故而不再赘述——本章假设读者已经具备这些条件。

下面将会逐步介绍如何在浏览器中完成GKE的配置。将来可能会有细节上的改动,不过总体流程是相同的。

  1. Google云平台的控制台,打开左侧导航栏并选择Kubernetes Engine>Clusters。可能需要单击左上角的3条横线的图标来展开导航栏。
  2. 单击Create cluster按钮,进入创建Kubernetes集群的向导。
  3. 为集群起个名字,并填写描述。
  4. 选择读者想要一个Regional(跨域)还是Zonal(域内)的集群。Reginal较新而且更加有弹性——集群中的节点可以分布在多个Zone中,但仍然可以通过高可用的单一端点(endpoint)来访问它们。
  5. 选择集群的RegionZone
  6. 选择Master Version,用于指定在各个节点上运行的Kubernetes的版本。可选的版本受限于下拉菜单,选择一个最新的版本即可。

除了设置Master Version,还可以选择一个release channel,这会影响到集群升级到新版本的方式。

  1. 这里还可以配置左侧的一些高级选项。比如设置节点是运行在Docker还是containerd上,以及是否需要启用Istio服务网格。读者可以浏览一下这些设置,当然也可以保持默认。
  2. 完成设置后请单击Create

至此集群就已经创建好了。

此时可以看到Clusters界面展示的项目中Kubernetes集群的信息总览。图3.1所示为一个名为gke的三节点集群。

图3.1

单击集群名称进入详情。

单击页面上方的> CONNECT图标(图3.1中没有展示),会给出从自己的计算机上配置本地gcloud和利用kubectl工具来连接集群的命令,复制该命令到剪切板。

下面的步骤需要下载和安装gcloudkubectl工具。

在安装并配置好gcloud后,可以打开终端,将前面复制的gcloud命令粘贴执行,完成kubectl客户端连接GKE集群的配置。

执行kubectl get nodes命令列出集群中的节点。

$ kubectl get nodes  
NAME             STATUS     AGE     VERSION 
gke-cluster...   Ready      5m      v1.17.9-gke.1503
gke-cluster...   Ready      6m      v1.17.9-gke.1503
gke-cluster...   Ready      6m      v1.17.9-gke.1503 

恭喜!现在读者已经了解了如何用Google Kubernetes引擎(GKE)创建一个生产级的Kubernetes集群,以及如何查看和连接它。

读者可以用这个集群来练习本书后面的例子,不过记得在使用完GKE集群后删除它即使不再需要它,GKE等托管的K8s平台也可能会继续计费。

3.8 其他安装方法

如前所述,安装Kubernetes有许多种方法,其中包括以下两种。

  • kops
  • kubeadm

kops是用于在AWS上安装Kubernetes的一个“武断”(opinionated)的工具,所谓“武断”,是说在用它安装的时候没有太多可定制的空间。如果需要一个高度可定制化的集群,建议使用kubeadm

本书的前一版本花费了数十页来介绍这两种方法。然而,其中干货太多,令读者难以按步骤操作。这一版本,建议读者根据kopskubeadm的在线指南来进行部署。

3.9 kubectl

kubectl是在进行Kubernetes管理的过程中使用的主要命令行工具。将kubectl看作KubernetesSSH有助于理解其作用。kubectlLinuxmacOSWindows版本。

作为主要的命令行工具,kubectl的次版本号与集群的次版本号的数字差距应不大于1。例如,如果集群中运行的是Kubernetes 1.16.x,那么所使用的kubectl版本应介于1.15.x1.17.x之间。

总体来说,kubectl的作用是将对用户友好的命令转换成API Server所能理解的JSON格式。它基于一个配置文件来决定将其POST到哪个集群的API Server

默认情况下,kubectl的配置文件位于$HOME/.kube/config。它包含如下配置信息。

  • clusters
  • contexts
  • users(凭证)。

clusters部分是kubectl可以连接的多个集群的列表,当用户需要管理多个集群时会非常有用。每个集群的定义都包含名字、证书信息和API Server端口。

contexts部分定义的是集群和相关用户的组合,并用易于记忆的名字来代指。例如,配置中有名为deploy-prodcontext,它将名为deploy的用户凭证和名为prod的集群定义组合起来。此时如果基于这个context使用kubectl,那么该命令将会以deploy用户的身份发送至集群prodAPI Server

users部分用于定义不同的用户以及对不同集群的不同级别的权限。例如,配置中可能有dev用户和ops用户,它们分别具有不同的权限。每一个用户的定义都有一个易于记忆的名字(name)、一个账号(username)和一系列凭证信息。

如下是一个kubectl的配置文件,其中定义了一个名为minikube的集群、一个名为minikubecontext,以及一个名为minikube的用户。该context是用户minikube和集群minikube的组合,并被设置为默认的context

apiVersion: v1  
clusters:  
- cluster: 
    certificate-authority: C:\Users\nigel\.minikube\ca.crt 
    server: https://192.168.1.77:8443 
  name: minikube  
contexts:  
- context:  
    cluster: minikube  
    user: minikube 
  name: minikube  
current-context: minikube  
kind: Config  
preferences: {} 
users:  
- name: minikube  
  user: 
    client-certificate: C:\Users\nigel\.minikube\client.crt
    client-key: C:\Users\nigel\.minikube\client.key

执行kubectl config view命令可以查看kubectl配置,敏感数据会在输出中被抹掉。

执行kubectl config current-context命令可以查看当前使用的context。如下示例的输出表示kubectl命令会发送给$HOME/.kube/config中定义的名为eks-K8sbook的集群。

$ kubectl config current-context
eks_k8sbook 

用户可以使用kubectl config use-context来改变当前的context。以下命令将设置当前contextdocker-desktop,则后续的命令将发送给docker-desktop这个context中定义的集群。显然,需要确保名为docker-desktopcontext在配置文件中确实是有定义的。

kubectl config use-context docker-desktop  
Switched to context "docker-desktop". 
 
$ kubectl config current-context  
docker-desktop 

3.10 总结

本章介绍了在不同的平台安装Kubernetes的几种不同的方法。

首先介绍了如何简单快速地在Play with Kubernetes(PWK)上搭建一套Kubernetes集群。这种方式无须在自己的计算机或云上安装任何东西,即可得到一个可使用4h的练习环境。

然后介绍了如何使用桌面版Docker在计算机上部署开发环境。

还介绍了如何使用Google Kubernetes Engine(GKE)Google云上部署一套托管的Kubernetes集群。

最后是对kubectl这一Kubernetes命令行工具的概述。


原文地址:https://blog.csdn.net/sinat_28521487/article/details/143729918

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!