一、kebuctl简介:
kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径。
对资源的增、删、查操作比较方便,但对改的操作就不容易了。
kubectl的命令大全:kubectl --help
k8s中文文档: http://docs.kubernetes.org.cn/683.html
二、kebuctl的使用:
1.基础用法:
//查看版本信息 kubectl version
//查看资源对象简写 kubectl api-resources
//查看集群信息 kubectl cluster-info
//配置kubectl自动补全 source <(kubectl completion bash)
//node节点查看日志 journalctl -u kubelet -f
2.基本信息查看:
kubectl get <resource> [-o wide|json|yaml] [-n namespace]
获取资源的相关信息,-n 指定命令空间,-o 指定输出格式
获取pod资源:
指定命令空间:
指定输出格式:
resource可以是具体资源名称,如pod nginx-xxx;也可以是资源类型,如pod;或者all(仅展示几种核心资源,并不完整)
--all-namespaces 或 -A :表示显示所有命令空间:
--show-labels :显示所有标签:
-l app :仅显示标签为app的资源:
-l app=nginx :仅显示包含app标签,且值为nginx的资源:
-w:持续跟踪输出:
2.1查看master节点状态:
//查看 master 节点状态
kubectl get componentstatuses
kubectl get cs
2.2查看命名空间:
//查看命令空间
kubectl get namespace
kubectl get ns
//命令空间的作用:用于允许不同 命令空间 的 相同类型 的资源 重名的
2.3查看default命名空间的所有资源:
//查看default命名空间的所有资源
kubectl get all [-n default]
2.4查看服务(Service)资源的状态:
//用于获取服务(Service)资源的状态
kubectl get svc
//简写成svc
2.5创建命名空间app:
//创建命名空间app
kubectl create ns app
//查看命名空间
kubectl get ns
2.6删除命名空间app:
//删除命名空间app
kubectl delete ns app
//查看命名空间
kubectl get ns
3.创建和删除pod:
3.1指定pod控制器和容器镜像创建pod:
- Deployment:无状态应用部署
- Statefulset:有状态应用部署
- Replicaset:副本数量控制器
- Daemonset:确保所有节点运行同一类 Pod
- Cronjob:计划性任务
//在命名空间kube-public 创建副本控制器(deployment)来启动Pod(nginx-wl)
kubectl create deployment nginx-0l --image=nginx -n kube-public
#创建一个名为nginx-01的deployment(无状态应用部署)
#指定为nginx镜像,且指定为kube-public命名空间
#査看kube-pubic命名空间资源#创建成功
//用run直接创建——自主式pod
kubectl run gg --image=nginx -n kube-public
//直接创建删除后不会拉取镜像
//run存储在节点中
3.2描述某个资源的详细信息:
kubectl describe 资源类型
kubectl describe 资源类型/pod名
3.3查看命名空间kube-public 中的pod 信息:
//查看命名空间kube-public 中的pod 信息
kubectl get pods -n kube-public
3.4扩容-缩容:
kubectl scale 资源名 --replicas=n
#n为数字,大于当前副本数则是扩容,小于则是缩容
3.5登录容器 :
kubectl exec -it pod名 -c 容器名 bash/sh
#区别于docker exec只能登入本机的docker
#如果pod中只有一个容器,则无需-c指定
kubectl exec -it pod名 -c 容器名 -- 命令
#可以实现不进入容器执行 -- 后的命令
3.6删除pod资源:
由于存在deployment/rc之类的副本控制器,删除pod也会重新拉起来,需删除其控制器
kubectl delete pods <pod名>
--force --grace-period=0 #添加该选项强制删除(无需等待)
#grace-period表示过渡存活期,默认30s,在删除pod之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止pod
3.7删除副本控制器:
kubectl delete deployment 资源名 -n kube-public
三、项目的生命周期:
创建 --> 发布 --> 更新 --> 回滚 --> 删除
1.创建 kubectl create:
●创建并运行一个或多个容器镜像。
●创建一个deployment 或job 来管理容器。
//启动 nginx 实例,暴露容器端口 80,设置副本数 3
kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3
//为deployment的nginx创建service,并通过Service的80端口转发至容器的80端口上,
Service的名称为nginx-service,类型为NodePort
2.发布 kubectl expose:
●将资源暴露为新的 Service。
暴露默认的 ClusterIP 类型服务
kubectl expose deployment 控制器名称 --name=服务名称 --port=服务端口 --target-port=pod端口
访问ClusterIP测试是否能负载均衡
访问ClusterIP测试是否能负载均衡:
暴露 NodePort 类型服务 :
kubectl expose deployment 控制器名称 --name=服务名称 --port=服务端口 --target-port=pod端口 --type=NodePort
浏览器访问测试:
查看单独容器详细信息
3.更新 kubectl set:
●更改现有应用资源一些信息。
查看版本:
更改版本:
4.回滚 kubectl rollout:
回滚操作的使用方式:
kubectl rollout history pod控制器 控制器名 #查看该资源的更新历史
5.删除 kubectl delete:
删除所有资源代表一个项目的结束
kubectl delete pod控制器 控制器名称 #删除pod控制器
kubectl delete 服务 服务名称 #删除服务
四、金丝雀发布:
Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。
当我们有多个服务需要创建时;我们在创建的过程中,先创建一部分然后暂停(pause);创建的这一部分作为测试;如果测试结果正常,我们再继续(resume)创建。
1.创建:
2.暴露端口:
3.更新并在第一轮完成后暂停:
没更新前的版本:
更新deployment的版本,并配置暂停deployment:
查看:
4.测试无误后继续更新 :
等待全部更新:
总结:
生命周期:
创建 》发布》更新 》回滚 》删除
创建: kubectl create 《资源名称》 --image=《镜像名称》 --port= 端口 --replicas= target port=
发布:
kubectl expose 《资源类型》《资源名称》 --port -targetport= type=clusterIP|Nodeport
更新:
kubectl set image<资源类型><资源名称><容器名>=<镜像名 标签版本>
回滚:
kubectl rollout unde<资源类型><资源名称>默认是回滚到上一个版本状态
--to-revision=回滚的指定版本
kubectl rollout historylstatus <资源类型><资源名称>
删除:kubectl delete <资源类型><资源名称》
蓝绿发布:
两套设备 进行新旧版本的切换
好处:用户无感知,业务稳定
缺点:资源消耗2倍 成本特别高
滚动:
按照他的比例一部分一部分滚动更新,k8s的默认更新机制
无创建一点的比例pod,先创建在删除一定的旧的pod
灰度发布(金丝雀):
先更新一部分pod,然后在暂停更新
安排一小部分的用户流量去访问更新pod来进行测试,当测试没问题后在扩大比例 直到全部更新完成为止
当yaml配置文件发送改动成功后,使用create创建的资源想要更新的时候,需要先delete删除原有资源在去通过yaml文件,创建资源使用apply创建的资源想要更新,可以直接在执行kubectl apply -f 更新