第3章 安装Kubernetes
本章将介绍几种快速安装Kubernetes
的方法。
如下是3种典型的获得Kubernetes的途径。
- 测试用练习环境。
- 托管的
Kubernetes
。 - 自定义安装。
3.1 Kubernetes练习环境
测试用的练习环境是最简单的获得Kubernetes
的方式,不过并不能用于生产。常见的例子包括Magic Sandbox
、Play with Kubernetes
以及桌面版Docker
。
对于Magic Sandbox
,只需要注册一个账号并登录,即可马上得到一个完整可用的多节点私有集群。其中还有一些内置课程和上手实验。
对于Play with Kubernetes
,需要使用一个GitHub
或Docker 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 Sandbox
和GKE
,其中大部分示例亦适用于其他安装方式。
本书将介绍如下方式。
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。
- 缺少与部分外部服务集成的能力,比如基于云的负载均衡、云存储卷。
- 经常会受到容量限制(它是作为免费服务提供的)。
下面实际操作一下。
- 使用浏览器进入官网下载。
- 使用
GitHub
或Docker Hub
账号登录,并单击Start
。 - 在左侧导航栏中单击+
ADD NEW INSTANCE
,网页右侧会出现一个控制台窗口。这是一个Kubernetes
节点(node1)。 - 执行以下几个命令来查看节点上预装的组件。
$ docker version
Docker version 19.03.11-ce...
$ kubectl version --output=yaml
clientVersion:
...
major: "1"
minor: "18"
由输出可见,节点中已经安装了Docker
和kubectl
(Kubernetes
客户端)。其他工具比如kubeadm
也已经预装。
需要指出的是,虽然命令提示符是$,但当前用户是root
,这一点可以通过执行whoami
或id
命令来验证。
- 使用
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
中查看一下。
- 执行如下的
kubectl
命令来查看集群信息。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 NotReady master 1m v1.18.4
输出显示这是一个单节点集群。但是节点的状态是NotReady
,这是因为尚未配置Pod网络。当第一次登录PWK
的节点时,会收到3个用来配置集群的命令。现在刚刚执行了第一条(kubeadm init…
)。
- 初始化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
- 再次查看集群信息,观察node1的状态是否已经更新至
Ready
。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 2m v1.18.4
现在Pod
网络已经初始化,控制层也已经Ready
,那么可以添加一些工作节点(worker node
)了。
- 复制
kubeadm init
命令执行后打印出的kubeadm join
命令。
当使用kubeadm init
命令初始化新集群时,输出的最后会给出用于添加节点的kubeadm join
命令。这条命令包含加入集群所用的join-token
、API Server
所监听的IP socket
,以及添加新节点到集群时所需的其他信息。复制这条命令以便接下来在新节点(node2)的控制台中进行粘贴。
- 单击
PWK
页面左侧的+ADD NEW INSTANCE
按钮。
此时会得到一个名为node2
的新节点。
- 在
node2
的控制台中粘贴kubeadm join
命令。
读者环境中的join-token
和IP
地址会有差异。
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.
- 切换回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
是在读者自己的macOS
或Windows
中部署本地开发环境的最佳方式。只需几个步骤就可以轻松地部署一个用于开发和测试的单节点的Kubernetes集群。
桌面版Docker
通过创建一个虚拟机,然后在虚拟机中启动一个单节点的Kubernetes
集群来实现。同时它还会完成kubectl
客户端的配置,以便连接集群。最后,还有一个简单的图形界面用来执行诸如切换kubectl
context
的基本操作。
注:所谓
kubectl context
,就是用来告诉kubectl
命令“去连接哪个集群”的一系列配置。
- 打开
Docker
主页,选择Products
>桌面版Docker
。 - 单击
macOS
或Windows
对应的下载按钮。
可能需要登录Docker Store
,账号和桌面版Docker
软件一样都是免费的。
- 打开下载的安装程序,并按步骤安装。
安装完成后,会有一个鲸鱼图标出现在Windows
任务栏或macOS
的菜单栏中。
- 单击鲸鱼图标(可能需要右击),进入设置界面,然后在
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的配置。将来可能会有细节上的改动,不过总体流程是相同的。
- 在
Google
云平台的控制台,打开左侧导航栏并选择Kubernetes Engine
>Clusters
。可能需要单击左上角的3条横线的图标来展开导航栏。 - 单击
Create cluster
按钮,进入创建Kubernetes
集群的向导。 - 为集群起个名字,并填写描述。
- 选择读者想要一个
Regional
(跨域)还是Zonal
(域内)的集群。Reginal
较新而且更加有弹性——集群中的节点可以分布在多个Zone
中,但仍然可以通过高可用的单一端点(endpoint
)来访问它们。 - 选择集群的
Region
或Zone
。 - 选择
Master Version
,用于指定在各个节点上运行的Kubernetes的版本。可选的版本受限于下拉菜单,选择一个最新的版本即可。
除了设置Master Version
,还可以选择一个release channe
l,这会影响到集群升级到新版本的方式。
- 这里还可以配置左侧的一些高级选项。比如设置节点是运行在
Docker
还是containerd
上,以及是否需要启用Istio服务网格。读者可以浏览一下这些设置,当然也可以保持默认。 - 完成设置后请单击
Create
。
至此集群就已经创建好了。
此时可以看到Clusters
界面展示的项目中Kubernetes
集群的信息总览。图3.1所示为一个名为gke
的三节点集群。
单击集群名称进入详情。
单击页面上方的> CONNECT
图标(图3.1中没有展示),会给出从自己的计算机上配置本地gcloud和利用kubectl
工具来连接集群的命令,复制该命令到剪切板。
下面的步骤需要下载和安装gcloud
和kubectl
工具。
在安装并配置好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
。
本书的前一版本花费了数十页来介绍这两种方法。然而,其中干货太多,令读者难以按步骤操作。这一版本,建议读者根据kops
或kubeadm
的在线指南来进行部署。
3.9 kubectl
kubectl
是在进行Kubernetes
管理的过程中使用的主要命令行工具。将kubectl
看作Kubernetes
的SSH
有助于理解其作用。kubectl
有Linux
、macOS
和Windows
版本。
作为主要的命令行工具,kubectl
的次版本号与集群的次版本号的数字差距应不大于1。例如,如果集群中运行的是Kubernetes 1.16.x
,那么所使用的kubectl版本应介于1.15.x
和1.17.x
之间。
总体来说,kubectl
的作用是将对用户友好的命令转换成API Server
所能理解的JSON
格式。它基于一个配置文件来决定将其POST
到哪个集群的API Server
。
默认情况下,kubectl
的配置文件位于$HOME/.kube/config
。它包含如下配置信息。
clusters
。contexts
。users
(凭证)。
clusters
部分是kubectl
可以连接的多个集群的列表,当用户需要管理多个集群时会非常有用。每个集群的定义都包含名字、证书信息和API Server端口。
contexts
部分定义的是集群和相关用户的组合,并用易于记忆的名字来代指。例如,配置中有名为deploy-prod
的context
,它将名为deploy
的用户凭证和名为prod
的集群定义组合起来。此时如果基于这个context
使用kubectl
,那么该命令将会以deploy
用户的身份发送至集群prod
的API Server
。
users
部分用于定义不同的用户以及对不同集群的不同级别的权限。例如,配置中可能有dev
用户和ops
用户,它们分别具有不同的权限。每一个用户的定义都有一个易于记忆的名字(name
)、一个账号(username
)和一系列凭证信息。
如下是一个kubectl
的配置文件,其中定义了一个名为minikube
的集群、一个名为minikube
的context
,以及一个名为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
。以下命令将设置当前context
为docker-desktop
,则后续的命令将发送给docker-desktop
这个context
中定义的集群。显然,需要确保名为docker-desktop
的context
在配置文件中确实是有定义的。
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)!