陈述式资源办理方法:

  1. kubernetes集群办理集群资源的仅有入口是经过相应的方法调用apiserver的接口
  2. kubectl是官方的CLI指令行东西,用于与 apiserver 进行通讯,将用户在指令行输入的指令,组织并转化为 apiserver能识别的信息,然后完成办理 k8s 各种资源的一种有效途径
  3. kubectl 的指令大全
  • kubectl –help
  • k8s中文文档:docs.kubernetes.org.cn/683.html
  1. 对资源的增、删、查操作比较方便,但对改的操作就不容易了

检查版别信息

kubectl vsrsion

云原生kubernetes--kubectl命令(陈述式)

检查资源对象简写

kubectl api-resources

云原生kubernetes--kubectl命令(陈述式)

检查集群信息

kubectl cluster-info

云原生kubernetes--kubectl命令(陈述式)

运用less东西检查较长的文件信息
kubectl cluster-info dump | less

装备kubectl主动补全

vim /etc/bashrc
source <(kubectl completion bash)

云原生kubernetes--kubectl命令(陈述式)

node节点检查日志

journalctl -u kubelet -f

云原生kubernetes--kubectl命令(陈述式)

基本信息检查

kubectl get <resource> [-o wide|json|yaml] [-n namespace]
获取资源的相关信息,-n 指定命名空间 -o指定输出格局
resource可所以详细资源称号,如pod nginx-xxxx 
也可所以资源类型,如pod  或许all(仅展示几种中心资源,并不完好)
--all-namespaces 或-A: 表明显现一切命名空间
--show-labels:显现一切标签
-l app:仅显现标签为app的资源
-l app=nginx:仅显现包含app标签,却值为nginx的资源

检查pod资源

kubectl get pods

云原生kubernetes--kubectl命令(陈述式)

检查kube-system资源

kubectl get pods -n kube-system

云原生kubernetes--kubectl命令(陈述式)

检查一切pod的信息

kubectl get pods -n kube-system -o wide

云原生kubernetes--kubectl命令(陈述式)

检查单个pod的信息

云原生kubernetes--kubectl命令(陈述式)

all 显现中心资源

云原生kubernetes--kubectl命令(陈述式)

检查 master 节点状况

kubectl get componentstatuses
kubectl get cs

云原生kubernetes--kubectl命令(陈述式)

检查命名空间

kubectl get namespaces
kubectl get ns
命名空间的作用:用于答应不同 命名空间 的 不同类型 的资源 重名的

云原生kubernetes--kubectl命令(陈述式)

创立命名空间app

kubectl create ns app

云原生kubernetes--kubectl命令(陈述式)

删去命名空间app

kubectl delete namespaces app

云原生kubernetes--kubectl命令(陈述式)

在命名空间kube-public 创立副本控制器(deployment)来发动pod(Nginx-aa)

kubectl create deployment nginx-aa --image=nginx -n kube-public

云原生kubernetes--kubectl命令(陈述式)

描绘某个资源的详细信息

kubectl describe deployment nginx-aa -n kube-public
假如检查资源为非running状况,能够经过describe去检查相关的事件
kubectl describe pods nginx-aa-c8947f894-fqnkp -n kube-public

云原生kubernetes--kubectl命令(陈述式)

云原生kubernetes--kubectl命令(陈述式)

检查命名空间kube-public中的pod信息

kubectl get pods -n kube-public

云原生kubernetes--kubectl命令(陈述式)

kubectl exec 能够跨主机登录容器,docker exec只能在容器地点的主机上登录

kubectl exec -it nginx-aa-66b8d4497f-fxhpd bash -n kube-public

云原生kubernetes--kubectl命令(陈述式)

删去(重启)pod资源,因为存在deployment/rc之类的副本控制器,删去pod也会从头拉起来

kubectl delete pod nginx-aa-c8947f894-z52fz -n kube-public

云原生kubernetes--kubectl命令(陈述式)

云原生kubernetes--kubectl命令(陈述式)

若pod无法删去,总是处于terminate状况,则要强行删去pod

kubectl delete pod <pod-name> -n <namesoace> --force --grace-period=0

grace-period表明过渡存活期,默认30S,在删去pod之前答应pod渐渐中止其上的容器进程,然后优雅退出,0表明当即中止pod

扩缩容

扩容
kubectl scale deployment nginx-aa --replicas=2 -n kube-public
缩容
kubectl scale deployment nginx-aa --replicas=1 -n kube-public

删去副本控制器

kubectl delete deployment nginx-aa -n kube-public

项目的生命周期

创立-->发布-->更新-->回滚-->删去
  1. 创立kubectl create 指令
  • 创立并运转一个或多个容器镜像
  • 创立一个deployment或job来办理容器

发动Nginx实例,露出容器端口80,设置副本数3

kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3

云原生kubernetes--kubectl命令(陈述式)
2. 发布kubectl expose指令

将资源露出为新的service

kubectl expose --help

为deployment的Nginx创立service,并经过service的80端口转发至容器的80端口上,service的称号为Nginx-service,类型为NodePort

kubectl expose deployment nginx --target-port=80 --name=nginx-service --type=NodePort

kubernetes之所以需求service,一方面是因为pod的IP不是固定的(Pod肯能会重建),另一方面则是因为一组pod实例之间总会有负载均衡的需求,service经过label selector完成的对一组pod的拜访,关于容器运用而言,kubernates供给了基于VIP(虚拟ip)的网桥的方法拜访service,再由service重定向到相应的pod。

service的type类型

  • ClusterIP:供给了集群内部的虚拟IP以供pod拜访(service默认类型)

  • NodePort:在每个Node上翻开一个端口供外部拜访,kubernetes将会在每个node上翻开一个端口而且在每个node的端口上都相同的,经过NodeIP:NodePort的方法kubernates集群外部的程序能够拜访service

每个端口只能是一种服务,端口的规模只能是30000-32767

  • LoadBalancer:经过设置LoaBalancer映射到云服务商供给的LoaBalancer地址,这种方法用于在公有云服务供给商的云平台上设置service的场景。经过外部的负载均衡器来拜访,通常在云平台布置LoaBalancer还需求额外的费用,在service提交后,kubernetes就会调用CloudPorvider在公有云上为你创立一个负载均衡服务,而且把被署理的pod的IP地址装备给负载均衡服务的后端

  • externalName:将service称号映射到一个DNS域名上,相当于DNS服务的CNAME记录,用于让pod去拜访集群外部的资源,它本身没有绑定任何的资源

检查pod网络状况详细信息和service露出的端口

kubectl get pods,svc -o wide

云原生kubernetes--kubectl命令(陈述式)

检查关联后端的节点

kubectl get endpoints

云原生kubernetes--kubectl命令(陈述式)

检查service的描绘信息

kubectl describe svc nginx

云原生kubernetes--kubectl命令(陈述式)

在node01节点上操作,检查负载均衡的端口

yum -y install ipvsadm

云原生kubernetes--kubectl命令(陈述式)

在master操作,检查拜访日志

云原生kubernetes--kubectl命令(陈述式)

  1. 更新kubectl set

更改现有运用资源一些信息

kubectl set --help

获取修改模板

kubectl set image --help

检查当时Nginx的版别号

curl -I 10.96.106.64

云原生kubernetes--kubectl命令(陈述式)

将Nginx版别更新为1.16版别

kubectl set image deployments nginx  nginx=nginx:1.16

云原生kubernetes--kubectl命令(陈述式)

云原生kubernetes--kubectl命令(陈述式)

处于动态监听pod状况,因为运用的是翻滚更新方法,所以先生成一个新的pod,然后删去一个旧的pod,往后依次类推

kubectl get pods -w

云原生kubernetes--kubectl命令(陈述式)

再看更新好后的pod的ip会改动

kubectl get pods -o wide

云原生kubernetes--kubectl命令(陈述式)

再看Nginx的版别号

curl -I 10.244.2.12

云原生kubernetes--kubectl命令(陈述式)

  1. 回滚kubectl rollout

对资源进行回滚办理

kubectl rollout -h

云原生kubernetes--kubectl命令(陈述式)

检查历史版别

kubectl rollout history deployment/nginx

云原生kubernetes--kubectl命令(陈述式)

履行回滚到上一个版别

kubectl rollout undo deployment/nginx

云原生kubernetes--kubectl命令(陈述式)

履行回滚到指定版别

kubectl rollout undo deployment/nginx --to-revision=2

云原生kubernetes--kubectl命令(陈述式)

检查回滚状况

kubectl rollout status deployment/nginx

云原生kubernetes--kubectl命令(陈述式)

  1. 删去kubectl delete

删去副本控制器

kubectl delete deployments/nginx

删去service

kubectl delete svc/nginx-service

三种常用的项目发布方法

常见三种发布方法分别为:蓝绿发布灰度发布翻滚发布

蓝绿发布

概念界说:蓝绿发布是一种以最小的停机时刻做服务晋级的战略。需求保护的两个版别的环境分别称为“蓝环境”和“绿环境”。一般当时出产流量指向环境为绿环境,而在蓝环境上布置新版别,短时刻内作为测试环境。

发布流程:首先将一半的服务流量从负载均衡列表中移除,而且更新服务版别,验证新版别没有问题后,将出产流量指向蓝环境,然后关于老版别的绿环境进行版别晋级,最终将一切服务流量加回负载均衡。

云原生kubernetes--kubectl命令(陈述式)

特色

  • 假如出问题,影响规模较大;
  • 发布战略简略;
  • 用户无感知,滑润过渡;
  • 晋级/回滚速度快。

缺陷

  • 需求准备正常业务运用资源的两倍以上服务器,避免晋级期间单组无法承载业务突发;
  • 短时刻内糟蹋必定资源本钱;
  • 基础设施无改动,增大晋级稳定性。

蓝绿发布在前期物理服务器年代,还是比较贵重的,因为云核算遍及,本钱也大大下降。

灰度发布(金丝雀发布)

概念界说:灰度发布归于增量发布,新老版别一起为用户供给服务。灰度发布的首要目的是确保体系的可用性。每一次的线上改变都无法确保体系100%的无bug,所以改变后要在线上小规模验证,等没问题再全面放开。而金丝雀发布是灰度发布的一种完成。

发布流程:在现有环境中布置少数服务的新版别(金丝雀),布置完成后,对线上流量进行监测,假如没有问题就对老版别服务进行全量晋级。

云原生kubernetes--kubectl命令(陈述式)

特色

  • 确保全体体系稳定性,在初始灰度的时候就能够发现、调整问题,影响规模可控;
  • 新功能逐渐评估功能,稳定性和健康状况,假如出问题影响规模很小,相对用户体验也少;
  • 用户无感知,滑润过渡。

缺陷

  • 主动化要求高

翻滚发布

翻滚发布便是刚刚咱们在k8s中运用的项目服务更新方法。翻滚发布是指每次只晋级一个或多个服务,晋级完成后加入出产环境,不断履行这个进程,直到集群中的全部旧版别晋级新版别。

云原生kubernetes--kubectl命令(陈述式)

特色

  • 用户无感知,滑润过渡;
  • 节省资源。

缺陷

  • 布置时刻慢,取决于每阶段更新时刻;
  • 发布战略较杂乱;
  • 无法确认OK的环境,不易回滚。

三种方法的对比总结

  • 蓝绿发布:两套环境替换晋级,旧版别保存必定时刻便于回滚。
  • 灰度发布:根据比例将老版别晋级,例如80%用户拜访是老版别,20%用户拜访是新版别。
  • 翻滚发布:按批次中止老版别实例,发动新版别实例。

金丝雀发布的完成

Deployment控制器支持自界说控制更新进程中的翻滚节奏,如“暂停(pause)”或“持续(resume)”更新操作。比方等候第一批新的Pod资源创立完成后当即暂停更新进程,此刻,仅存在一部分新版别的运用,主体部分还是旧的版别。然后,再挑选一小部分的用户请求路由到新版别的Pod运用,持续调查能否稳定地按希望的方法运转。确认没问题之后再持续完成余下的Pod资源翻滚更新,否则当即回滚更新操作。这便是所谓的金丝雀发布。

  1. 更新deployment的版别,并装备暂停deployment
kubectl set image deployment/nginx nginx=nginx1.14 && kubectl rollout pause deployment/nginx
kubectl rollout status deployment/nginx #调查更新状况
  1. 监控更新的进程,能够看到已经新增了一个资源,可是并未按照预期的状况去删去一个旧的资源,便是因为运用了pause暂停指令
kubectl get pods -w
curl [-I] 10.244.1.17
  1. 确保更新的pod没问题了,持续更新
kubectl rollout resume deployment/nginx
  1. 检查最终更新的情况
kubectl get pods -w
curl [-I] 10.244.1.17

假如对第2次或许往后的更新仍然保存测试的主意,能够采用再更新一部分暂停的方法: kubectl rollout resume deployment nginx && kubectl rollout pause deployment nginx

总结

陈述式

kubectl create <资源类型> <资源称号> -n <命名空间> [选项...kubectl delete <资源类型> <资源称号> -n <命名空间> [--force --grace-period=0]
kubectl get <资源类型> [资源称号] -n <命名空间> -o wide|yaml|json
            检查一切命名空间     -A | --all-namespaces  --show-labels
                                                                  -l 标签[=值]
                                                     kubectl describe <资源类型> <资源称号> -n <命名空间>   
kubectl exec -it <pod资源称号> -n <命名空间> [-c 容器名] [-- 指令]         
kubectl scale <deployment|statefulset> <资源称号> -n <命名空间> --replicas=N

service类型

  • ClusterIp: 默认的service资源的类型,供给clusterIP 供k8s集群内部拜访
  • NodePort: 在每个Node节点上开启一个端口,k8s集群表里的用户能够经过 Node 节点的IP 和 NodePort 即可拜访到service以及关联的相关pod
  • LoadBalancer: 运用公有云的LB服务和service做映射,使得用户运用公有云的LB服务的IP地址即可拜访到service以及关联的相关pod
  • ExternalName:相当于给一个域名做别名,pod能够经过这个service拜访集群外部的资源

service 和pod 的端口

  • por : service 的ClusterIP 所运用的端口
  • nodePort :NodePort类型的service所界说的 在每个Node节点上开启的端口(默认的端口规模30000-32767)
  • targetPort:以上port或nodeport 所要转发到的后端pod的端口号

pod里边有一个containePort:后端pod的容器所运用的端口号

k8s集群内部 http://ClusterIP:por -> PodIP:containerPort k8s集群外部 http://NodeIP:NodePort -> PodIP:containerPort

kubectl create <pod控制器资源> <资源称号> --image=镜像 --replicas=副本数  port=容器端口
kubectl expose <pod控制器资源> <资源称号> --name=svc资源称号  --port=ClusterIP的端口  --target-port=容器端口  --type=service类型
kubectl set image <资源类型> <资源称号> 容器=镜像名
kubectl rollout undo [--to-revision=N]
kubectl delete <资源类型> <资源称号>
kubectl describe <资源类型> <资源称号>
kubectl logs <资源类型> <资源称号> [-c 容器名]
发布战略:
蓝绿发布   翻滚发布   灰度发布(金丝雀发布)