kubectl简介
API Server是Kubernetes集群的网关,任何人只能通过API Server接口与集群进行交互。而kubectl是Kubernetes的终端客户端,此前博客里讲解的使用kubeadm初始化Kubernetes集群时,kubeadm init自动生成的/etc/kubernetes/admin.conf是kubectl接入k8s集群时使用的kubeconfig配置文件,它内建了用于访问Kubernetes集群的最高管理权限的用户账号及相关的认证凭据。
kubectl提供了基于命令行访问Kubernetes API的简洁方式,能够满足对Kubernetes的绝大部分的操作需求。
taint:污点。taint是跟高级调度相关的,给节点增加污点以后,能容忍这污点的pod就可以调度到这个节点上,否则就不能调度上来。其实master上就有很多的污点,这就是为什么我们创建pod不会调度到master节点上。因为默认创建的所有pod都无法容忍master的污点。这样确保了master只用于运行apiserver等组件。我们在定义pod时可以定义容忍度(tolerance)。
查看master节点上的污点:
查看node上有没有污点:
查看集群信息和集群组件状态信息:
kubectl增删改查
示例1:创建一个Nginx的Pod
【说明】:
- –dry-run=true:干跑模式,并没有真正运行
- –port=80:不指定这个也会暴露容器中的相应端口
- 默认创建的是其实是Deployment,如果想创建一个Pod,而不是想要创建由Deployment控制器控制的pod,可以在创建命令上加一个–restart=…12# kubectl run nginx --image=nginx:1.14-alpine --port=80 --restart=Neverpod/nginx created
这是Pod的地址,只能在k8s集群内使用。Pod的客户端一般有两类:
- 其他Pod
- 集群外部客户端:怎么访问?
Pod地址可能会变化的,假设我们误删除了pod:
[root@spark32 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-55d8d67cf-bh8z5 1/1 Running 0 9m10s
[root@spark32 ~]# kubectl delete pods nginx-deploy-55d8d67cf-bh8z5
pod "nginx-deploy-55d8d67cf-bh8z5" deleted
[root@spark32 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-55d8d67cf-qrd2s 1/1 Running 0 11s 10.244.1.4 spark17 <none> <none>
删除了pod,控制器Deployment发现副本少了一个,会自动创建一个。但是这个新Pod的IP地址已经变了,跑到另外一个node主机上去了。
在上一篇博文中,提到了需要在Pod前创建一个service,让service关联到Pod上。这样用户在访问时只需要访问service的地址或名称,只要service不被删除,后端的Pod因为各种原因被终止掉或删除掉后重新创建后,哪怕IP地址变了也没什么关系。
示例2:创建service
|
|
【说明】:
- –type=’’:指定service类型。service类型有4种,默认是ClusterIP。
|
|
【说明】:
- svc是service的简称
通过service访问服务:
外部节点,是无法通过service这个地址来访问这个服务的。
更多的时候,这个service地址是被Pod客户端来访问的,而且被访问时是完全可以基于service名称来访问。只不过需要Pod客户端可以解析名称,这就需要用到CoreDNS服务。之前的博文《kubeadm安装kubernetes 1.14.0》里安装集群时已经把CoreDNS这个附件安装好了。
创建个Pod,作为客户端:
【说明】:
- Pod中的默认DNS就是CoreDNS service的地址。
- svc.cluster.local:这是特殊的域名,表示是你的Kubernetes集群的本地Pod资源,特定后缀。
- default:Pod所属于的名称空间的名称。
- ping nginx,解析到的IP地址10.109.152.170是nginx这个service的IP地址,至于为什么ping不通,是因为service的地址仅仅是存在于iptables规则或ipvs规则中。
- 在Pod中可以使用service名称来访问,因为有DNS可以解析service的名称
我们可以在节点上解析这个service名称:
【注意】:在节点级解析service时需要输入service名称的全程,而不能仅仅使用service的简称来解析,因为节点级别的搜索域和Pod内的搜索域是不一样的。
这个service调度给我们之前创建的Pod了,service给有生命周期的Pod提供了固定访问的端点。我们现在人为把nginx Pod搞挂。
接着在Pod客户端再次访问下service:
当一个service生成时,会在每个节点上生成相应的iptables规则或ipvs规则,当客户端访问这个service地址和相应的端口时,就会调度到这个service利用标签选择器关联到的Pod了。
在上面的示例中,会把所有访问10.109.152.170:80这个地址的都调度至这个service用label-selector(标签选择器)关联到的各Pod后端。
当我们修改这个service或者删除这个service再重新建个service,会立刻反应到CoreDNS的解析记录中去。
service对应的IP已经改变了,我们在Pod客户端里再测试下访问这个service,发现仍然可以根据service名称访问:
示例3:副本
|
|
通过Pod IP访问下服务:
为这个deploy创建一个service:
在Pod中访问这个服务:
示例4:扩展和缩减副本
接着上面的示例,我们扩展myapp这个deployment中的副本。
【说明】:
- Terminating:表示正在终止Pod。
示例5:滚动更新程序
除了以上的动态伸缩,还可以做滚动更新。比如将myapp从v1滚动更新到v2。比如现在有3个Pod,它会先替换1个,在替换1个,在替换1个。
查看当前Pod所使用的image镜像版本:
在Pod中访问下服务,已经全部变为v2版本了:
示例6:回滚
如果需要在集群外部访问myapp,需要修改service类型为NodePort。
【注意】:kubectl edit在编辑资源时,有些字段是不能这样修改的,后面在写yaml清单文件会介绍。
打开浏览器,访问集群任何一个Node的30020端口:
但是假如这个Node挂了,对客户端来说就不友好了,它得改地址为其他的Node地址。所以最好手工在集群外做个物理的负载均衡器。
service到底是什么?
service是在集群每个节点上生成的iptables规则或者ipvs规则。