k8s是一款容器编排平台,实现了容器编排功能。笔者在上一章中创建第一个pod并去尝试解决存在的一些问题,在这章中,笔者将会着重于k8s的入门以及一些基础命令的记录理解学习。
控制平面:
- API Server (即Master节点) (6443 端口) 用户认证:双向认证
- Scheduler
- Controller
API Server
API server核心功能是提供了k8s各类资源对象(Pod,RC,service)的增,删,改,查及HTTP REST接口。server是通过一个名为kube-apiserver的进程提供服务。该进程运行在master节点上,默认情况下,在本机8080端口提供REST服务。
通常我们可以通过命令行工具kubectl来与API server交互。它们之间的接口是REST调用。为了测试和学习API server所提供的接口,也可以使用curl命令行工具进行快速验证。
API server作为集群的核心,负责各个功能模块之间的通信。集群中各个模块通过API server将信息存入etcd,当需要获取和操作这些数据时,则通过API server提供的REST接口来实现,从而实现各模块之间的信息交互。
Scheduler
kubernetes Scheduler 运行在 master 节点,它的核心功能是监听 apiserver 来获取 PodSpec.NodeName 为空的 pod,然后为每个这样的 pod 创建一个 binding 指示 pod 应该调度到哪个节点上。
Controller
Controller Manager作为集群内部的管理控制中心,负责集群内的Node,Pod副本,服务端点(endpoint),命名空间(namespace)等的管理,当某个Node意外宕机,CM会及时发现此故障并执行自动化修复流程,确保集群始终处于预期的工作状态。
k8s常用命令
#kubectl -h
显示子命令,其中包括了查找命令。
Node是集群级别的资源,而整个集群又可以划分为多个名称和空间。
使用如下命令,可以查看node的运行状态以及是否存在
#kubectl get nodes
使用如下命令可查看pods,也就是最小单元,并且可以查看运行状态,在上一章中,笔者在让pods运行上花了很长的时间。要么是出现Error要么是pending状态。
# kubectl get pods
我们也可以用命令查看有几个名称空间,我们在之前的学习中已经了解到,名称空间的英文是namespace,所以在命令中采取它的缩写ns。
# kubectl get ns
我们可以看到,笔者的名称空间内有4个活动的项。每指定一个名称空间时,默认都是default。Kube-public是任何人都能访问的。Kube-system存放系统文件。使用如下命令即可查看里面存放的一些文件。
# kubectl get pods -n kube-public
# kubectl get pods -n kube-system
使用如下命令时显示长格式信息,就像ls -l一样。
# kubectl get pods -n kube-system -o wide
在上一章中,我们已经接触了创建命令也就是create命令。我们可以在之前kubectl -h中找到具体的使用方法。就比如我们现在可以看一下当前系统上支持多少种资源类型。
# kubectl api-resources
同样的,当我们想要知道这个系统上存在多少个deploy控制器时,我们只需要输入以下命令。
# kubectl get deploy
目前在笔者的系统上只有一个deploy那就是nginx-demo。
我们可以创建一个新的名称空间,输入以下命令即可,指定一个名称,比如说develop
# kubectl create namespace develop
可以看到,我们已经成功创建了develop,testing,prod的namespace。并且我们可以使用kubectl get ns来查看namespace。
那么我们怎么删除命名空间呢?
使用以下命令
# kubectl delete namespaces develop
可以看到,已经删除了。当然也可以用ns来代替namespace,并且可以把namespace与ID中间的空格替换为/。同时也可以删除多个资源。
那么怎么查看一个指定的namespace信息呢?
输入以下命令
# kubectl get ns/default
我们可以得到是default的namespace。
我们这时候可以获得一下 yaml 文件中的信息。
在这里我看可以看到,一个yaml文件中有5个主要信息。这是个标准格式。
apiVersion, kind, metadata, spec, status
此时我们使用describe来查看当前的状态信息。
我们现在创建一个nginx的配置,命名为ngx-dep,使用的是nginx:1.14-alpine镜像。使用如下命令:
# kubectl create deploy ngx-dep --image=nginx:1.14-alpine
可以看到,已经创建成功。这时候会存在一个pod,并且这个pod是依靠nginx:1.14来实现的。我们这时候用kubectl get all来获得所有资源。可以看到,笔者现在已经有两个pod了。
我们如果让它只显示pods,我们可以输入get pods。
这时候我们直接去访问根据ip地址。输入以下命令即可实现通信。
# curl IP
如果要删除pod,那么我们只需要输入以下命令。
kubectl delete pods/ID
删除后会生成一个新的pod,并且需要新的ip地址通信。
那么怎么彻底删除一个pod呢?
输入以下命令即可
# kubectl delete deployment ID
那么我们怎么创建一个service呢?
使用如下命令
# kubectl create service clusterip ngx-svc --tcp=80:80
此时我们可以用如下命令查看详细信息
# kubectl get svc/ngx-svc -o yaml
它显示本地80,远程也是80。这个没有指定哪个pod。因此这种写法是有问题的,我们把它删除并重新创建。
此时IP地址已重新分配。我们可以用describe命令去查看。
此时我们去通信这个ip地址。
我们可以得到这个服务。我们将原有的pods删除,然后得到新的pods,用describe命令去查看。
此时这个service有个新的endpoints,这个service会通知到相应的客户端做出改变。