第3章 Kubernetes命令行工具

Kubernetes提供了许多功能强大的命令行工具。对于系统管理员来说,绝大部分的管理工作都是通过命令行工具来完成的。因此,掌握好命令行工具,对于系统管理员来说非常有必要。本章将介绍Kubernetes提供的主要命令行工具。

本章涉及的知识点有:

3.1 kubectl的使用方法

kubekubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。可以说,kubectl是Kubernetes集群的最重要的工具,是整个集群的大管家。本节将详细介绍kubectl的使用方法,以便于后面章节的学习。

3.1.1 kubectl用法概述

kubectl是一个Kubernetes的客户端工具。在前面介绍Kubernetes的安装方法时,kubectl通常会在Kubernetes的Master节点的安装过程中被安装。实际上,kubectl可以单独安装和运行,它可以安装在任意一台Linux、Windows或者Mac计算机上,只要这台计算机能够连接Master节点,就可以通过它来管理Kubernetes集群。

例如,在Mac OS上面,用户可以通过以下命令下载最新版本的kubectl:


   curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl
-s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/
bin/darwin/amd64/kubectl

如果要下载特定版本的kubectl,则只需要将其中的$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)替换为指定的版本号即可。例如,用户想要下载v1.19.5,可以通过以下链接来下载:

https://storage.googleapis.com/kubernetes-release/release/v1.19.5/bin/darwin/amd64/kubectl

下载后得到的是二进制的kubectl可执行文件,用户需要通过修改其权限,使其可以执行,命令如下:


   chmod +x kubectl

chmod命令用来修改文件的模式位,+x表示增加可执行权限。

除此之外,Mac OS用户还可以使用以下命令安装kubectl:


   sudo port selfupdate
   sudo port install kubectl

如果在Linux上面下载kubectl,同样可以使用curl命令。例如,下面的命令下载v1.19.5版本的kubectl:


   [root@localhost ~]#  curl -LO https://storage.googleapis.com/
kubernetes-release/release/v1.19.5/bin/linux/amd64/kubectl

除了curl命令之外,在Linux系统中,用户还可以通过wget命令下载kubectl,如下所示:


   [root@localhost ~]# wget https://storage.googleapis.com/kubernetes-release/
release/v1.19.5/bin/linux/amd64/kubectl

对于Windows用户来说,Kubernetes也提供了相应的版本。例如,用户可以通过以下网址下载v1.19.5的64位的Windows版本的kubectl:

https://storage.googleapis.com/kubernetes-release/release/v1.19.5/bin/windows/amd64/kubectl.exe

kubectl的基本语法如下:


   kubectl [command] [type] [name] [flags]

其中,command用来指定要对资源执行的操作,例如create、get以及delete等。type用来指定资源类型,资源类型是区分字母大小写的。用户可以以单数、复数以及缩略的形式指定资源类型,例如pod、pods或者po等。name用来指定资源的名称,资源名称也是区分字母大小写的。如果没有指定资源名称,则默认显示所有的资源。flag指定可选的参数。例如,可以使用-s或者-server参数,指定Kubernetes API server的地址和端口。

此外,用户可以通过kubectl help命令查找更多的帮助信息,如下所示:

3.1.2 kubectl的子命令

kubectl作为Kubernetes的命令行工具,主要的职责就是对集群中的资源对象进行操作,这些操作包括对资源对象的创建、删除和查看等。因此,kubectl提供了非常多的子命令。表3-1显示了kubectl支持的所有命令,以及这些命令的语法和描述信息。

表3-1 kubectl的常用子命令

(续表)

(续表)

3.1.3 Kubernetes资源对象类型

在Kubernetes中,提供了很多的资源对象,开发和运维人员可以通过这些对象对容器进行编排。表3-2是kubectl所支持的资源对象类型,以及它们的缩略别名。

表3-2 kubectl所支持的资源对象列表

3.1.4 kubectl输出格式

默认情况下,kubectl命令输出格式为纯文本。但是,用户可以通过-o或者--output选项来指定其他的输出格式。表3-3列出了常见的输出格式及其选项名。

表3-3 kubectl的输出格式

3.1.5 kubectl命令举例

为了使读者能够快速掌握kubectl命令的使用方法,下面对常用的命令进行介绍。

1.kubectl create命令

此命令通过文件或者标准输入创建一个资源对象,支持YAML或者JSON格式的配置文件。例如,如果用户创建了一个Nginx的YAML配置文件,其内容如下:

用户可以使用以下命令创建MySQL的副本控制器:


   [root@localhost ~]# kubectl create -f nginx.yaml
   replicationcontroller "nginx-controller" created
2.kubectl get命令

用户可以通过此命令列出一个或多个资源对象,该命令的参数为资源类型名称。例如,下面的命令列出当前命名空间下的节点:

下面的命令列出所有的服务:

下面的命令以比较详细的方式列出当前命名空间中的Pod:

3.kubectl describe命令

此命令用于显示一个或多个资源对象的详细信息。例如,我们想要获取名为nginx-controller-g5165的Pod的详细信息,可以使用以下命令:

4.kubectl exec命令

此命令用于在Pod中的容器上执行一个命令。例如,下面的命令在名为my-nginx-379829228-8gfbb的容器上执行/bin/bash命令:

执行完以后,可以发现Shell的命令提示符发生了变化,表明已经进入了容器的Shell环境中。

如果想要在容器中执行ls命令,则可以使用以下方式:

在上面的命令中,nginx-controller-g5165为Pod的名称。

5.kubectl run命令

该命令用来创建一个应用。与kubectl create命令不同,在该命令中,所有的选项可以通过命令行指定。例如,下面的命令创建一个Nginx应用:


   [root@localhost ~]# kubectl run --image=nginx nginx-app --port=8080
   deployment "nginx-app" created

执行完之后,通过get命令查看创建进度,如下所示:

从上面的输出结果可知,刚刚创建的Pod已经处于运行状态。

6.kubectl delete命令

该命令用来删除集群中的资源。例如,下面的命令删除名为nginx-controller-zz0dk的Pod:


   [root@localhost ~]# kubectl delete pods/nginx-controller-zz0dk
   pod "nginx-controller-zz0dk" deleted

除了上面介绍的几个命令之外,kubectl还提供了许多功能强大的命令,读者可以参考其他的技术文档,在此不再详细介绍。

3.2 kubeadm的使用方法

kubeadm是Kubernetes官方主推的用于快速安装Kubernetes集群的命令行工具。伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践进行调整。本节将详细介绍kubeadm的使用方法。

3.2.1 kubeadm安装方法

默认情况下,kubeadm不会被自动安装。如果用户想要使用kubeadm工具,则可以下载Kubernetes的二进制文件包,当然也可以通过源代码自己编译生成。如果已经下载了Kubernetes的二进制文件,则kubeadm命令位于server/bin目录中。从下面的列表可以发现,该目录中包含了多个Kubernetes的可执行文件,例如kube-apiserver、kubectl以及kubelet等。

除此之外,如果是在CentOS中安装kubeadm,用户还可以通过软件包管理工具来安装。

先添加Kubernetes的软件仓库(或称为软件存储库),创建/etc/yum.repos.d/kubernetes.repo文件,其内容如下:

上面的代码将阿里云的Kubernetes镜像站点添加到当前系统中。然后通过以下命令安装:


   [root@localhost ~]# yum install -y kubeadm

3.2.2 kubeadm基本语法

kubeadmin的基本语法如下:


   kubeadm [command]

其中command为kubeadm提供的子命令,常用的子命令有:

3.2.3 部署Master节点

在使用kubeadm命令之前,用户首先需要处理几个先决条件,这是因为kubeadm依赖于Docker和kubelet等组件服务,下面分别进行介绍。

1.安装Docker

用户需要在节点上面安装Docker,命令如下:


   [root@localhost ~]# yum -y install docker

然后通过以下命令启动Docker:


   [root@localhost ~]# systemctl enable docker
   [root@localhost ~]# systemctl start docker
2.安装kubelet

接下来使用以下命令安装kubelet以及其他组件:


   [root@localhost ~]# yum install -y kubelet kubeadm kubectl ipvsadm

在节点上启动kubelet服务:


   [root@localhost ~]# systemctl enable kubelet
   [root@localhost ~]# systemctl start kubelet
3.禁用SELinux

用户还需要禁用SELinux,命令如下:

4.禁用交换分区

用户可以通过以下命令临时禁用交换分区:


   [root@localhost ~]# swapoff -a

然后修改/etc/fstab文件,将其中关于交换分区的项目注释掉,防止操作系统重新启动后自动挂载交换分区,如下所示:

5.修改防火墙规则

Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables的filter表中FOWARD链,这样会引起Kubernetes集群中跨节点的Pod无法通信,所以用户需要修改该规则,命令如下:


   [root@localhost ~]# iptables -P FORWARD ACCEPT
   [root@localhost ~]# iptables-save
6.配置转发

创建/etc/sysctl.d/k8s.conf文件,其内容如下:


   net.bridge.bridge-nf-call-ip6tables = 1
   net.bridge.bridge-nf-call-iptables = 1
   vm.swappiness=0

调用以下命令使配置生效:


   [root@localhost ~]# sysctl --system
7.修改kubelet配置文件

编辑/etc/sysconfig/kubelet文件,在KUBELET_EXTRA_ARGS配置项中增加以下代码:


   --cgroup-driver=systemd
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containe
rs/pause-amd64:3.1

上述代码的作用是使Kubernetes中的Pause容器使用国内的镜像。

重新启动kubelet:


   [root@localhost ~]# systemctl daemon-reload
   [root@localhost ~]# systemctl enable kubelet && systemctl restart kubelet

注意

上面的操作需要在所有的节点上执行。

处理好所有的先决条件之后,就可以部署Master节点了,命令如下:

接下来就是等待过程,在这个过程中,kubeadm会完成以下几个主要步骤:

(1)检查初始化节点所需要的先决条件,如果不满足,则给出错误提示。

(2)生成Kubernetes集群的令牌。

(3)生成自签名的CA和客户端证书。

(4)自动创建kubeconfig配置文件,该文件是提供给kubelet连接API Server时使用的。

(5)配置基于角色的访问控制,并且设置Maser节点只允许控制组件服务。

(6)创建其他的相关服务,例如kube-proxy和kube-dns等。

但是kubeadm命令并不初始化网络组件,所以对于网络方面的插件,需要用户单独配置。

3.2.4 部署Node节点

部署普通的Node节点需要使用join命令,在使用该命令时,需要提供前面初始化Master节点时生成的令牌。命令如下:

在上面的命令中,第1行用来获取令牌,第2行执行初始化并加入集群,--token选项用来指定令牌,后面的IP地址为Master节点的IP地址。

在上面的过程中,kubeadm命令会自动从API服务器上面下载证书,然后创建本地证书,请求签名,最后配置kubelet服务注册到API服务器。

3.2.5 重置节点

无论是Master节点还是Node节点,如果想要重新部署,都可以使用reset命令,如下所示: