Kubernetes提供了许多功能强大的命令行工具。对于系统管理员来说,绝大部分的管理工作都是通过命令行工具来完成的。因此,掌握好命令行工具,对于系统管理员来说非常有必要。本章将介绍Kubernetes提供的主要命令行工具。
本章涉及的知识点有:
kubekubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。可以说,kubectl是Kubernetes集群的最重要的工具,是整个集群的大管家。本节将详细介绍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命令查找更多的帮助信息,如下所示:

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

(续表)

(续表)

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

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

为了使读者能够快速掌握kubectl命令的使用方法,下面对常用的命令进行介绍。
此命令通过文件或者标准输入创建一个资源对象,支持YAML或者JSON格式的配置文件。例如,如果用户创建了一个Nginx的YAML配置文件,其内容如下:

用户可以使用以下命令创建MySQL的副本控制器:
[root@localhost ~]# kubectl create -f nginx.yaml replicationcontroller "nginx-controller" created
用户可以通过此命令列出一个或多个资源对象,该命令的参数为资源类型名称。例如,下面的命令列出当前命名空间下的节点:

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

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

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

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

执行完以后,可以发现Shell的命令提示符发生了变化,表明已经进入了容器的Shell环境中。
如果想要在容器中执行ls命令,则可以使用以下方式:

在上面的命令中,nginx-controller-g5165为Pod的名称。
该命令用来创建一个应用。与kubectl create命令不同,在该命令中,所有的选项可以通过命令行指定。例如,下面的命令创建一个Nginx应用:
[root@localhost ~]# kubectl run --image=nginx nginx-app --port=8080 deployment "nginx-app" created
执行完之后,通过get命令查看创建进度,如下所示:

从上面的输出结果可知,刚刚创建的Pod已经处于运行状态。
该命令用来删除集群中的资源。例如,下面的命令删除名为nginx-controller-zz0dk的Pod:
[root@localhost ~]# kubectl delete pods/nginx-controller-zz0dk pod "nginx-controller-zz0dk" deleted
除了上面介绍的几个命令之外,kubectl还提供了许多功能强大的命令,读者可以参考其他的技术文档,在此不再详细介绍。
kubeadm是Kubernetes官方主推的用于快速安装Kubernetes集群的命令行工具。伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践进行调整。本节将详细介绍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
kubeadmin的基本语法如下:
kubeadm [command]
其中command为kubeadm提供的子命令,常用的子命令有:
在使用kubeadm命令之前,用户首先需要处理几个先决条件,这是因为kubeadm依赖于Docker和kubelet等组件服务,下面分别进行介绍。
用户需要在节点上面安装Docker,命令如下:
[root@localhost ~]# yum -y install docker
然后通过以下命令启动Docker:
[root@localhost ~]# systemctl enable docker [root@localhost ~]# systemctl start docker
接下来使用以下命令安装kubelet以及其他组件:
[root@localhost ~]# yum install -y kubelet kubeadm kubectl ipvsadm
在节点上启动kubelet服务:
[root@localhost ~]# systemctl enable kubelet [root@localhost ~]# systemctl start kubelet
用户还需要禁用SELinux,命令如下:

用户可以通过以下命令临时禁用交换分区:
[root@localhost ~]# swapoff -a
然后修改/etc/fstab文件,将其中关于交换分区的项目注释掉,防止操作系统重新启动后自动挂载交换分区,如下所示:

Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables的filter表中FOWARD链,这样会引起Kubernetes集群中跨节点的Pod无法通信,所以用户需要修改该规则,命令如下:
[root@localhost ~]# iptables -P FORWARD ACCEPT [root@localhost ~]# iptables-save
创建/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
编辑/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命令并不初始化网络组件,所以对于网络方面的插件,需要用户单独配置。
部署普通的Node节点需要使用join命令,在使用该命令时,需要提供前面初始化Master节点时生成的令牌。命令如下:

在上面的命令中,第1行用来获取令牌,第2行执行初始化并加入集群,--token选项用来指定令牌,后面的IP地址为Master节点的IP地址。
在上面的过程中,kubeadm命令会自动从API服务器上面下载证书,然后创建本地证书,请求签名,最后配置kubelet服务注册到API服务器。
无论是Master节点还是Node节点,如果想要重新部署,都可以使用reset命令,如下所示:
