本章目录

 

 

 

 

1. 资源管理方法  1.1 陈述式资源管理方法
  1.2 声明式资源管理方法
2. 基本信息查看
  2.1 查看 master 节点状态
  2.2 查看命令空间
  2.3 查看 default 命名空间的所有资源
  2.4 创建、删除命名空间 app
  2.5 在命名空间创建 deployment
  2.6 描述某个资源的详细信息
  2.7 查看命名空间 kube-public 中的 pod 信息
  2.8 kubectl exec 可以跨主机登录容器
  2.9 删除(重启)pod 资源
  2.10 扩缩容
  2.11 删除副本控制器
3. 项目的生命周期
  3.1 创建 kubectl run 命令
  3.2 发布 kubectl expose 命令
  3.3 更新 kubectl set
  3.4 回滚 kubectl rollout
  3.5 删除 kubectl delete
4. 陈述式管理方法:金丝雀发布(Canary Relase)
5. 声明式管理方法

 

 

 

 

1. 资源管理方法
1.1 陈述式资源管理方法

  • kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口
  • kubectl 是官方的 CLI 命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理k8s各种资源的一种有 效途径
  • kubectl 的命令大全:kubectl --help
  • k8s中文文档:https://docs.kubernetes.org.cn/683.html
  • 对资源的增、删、查操作比较方便,但对改的操作就不容易了:

 

1 //查看k8s版本信息
 2 kubectl version
 3 
 4 //查看资源对象简写
 5 kubectl api-resources
 6 
 7 //查看集群信息
 8 [root@master ~]# kubectl cluster-info
 9 
10 //配置kubectl自动补全
11 source <(kubectl completion bash)
12 
13 //node节点查看日志
14 journalctl -u kubectl -f

 

kubectl 启动mysql 并设置root密码_命名空间

 

kubectl 启动mysql 并设置root密码_nginx_02

 

kubectl 启动mysql 并设置root密码_命名空间_03

 

kubectl 启动mysql 并设置root密码_nginx_04

 

kubectl 启动mysql 并设置root密码_Pod_05

 

1.2 声明式资源管理方法

  • 通过 yaml 资源配置清单文件在实现资源的管理。
例:kubectl create/apply -f *.yaml

 

2. 基本信息查看

1 kubectl get <resource> [-o wide|json|yaml] [-n namespace]

 

1 获取资源的相关信息,-n指定命令空间,-o指定输出格式
2 resource可以是具体资源名称,如pod nginx- xxx;也可以是资源类型,如pod; 或者all (仅展示几种核心资源,并不完整)
3 --all-namespaces 或-A :表示显示所有命令空间,
4 --show-labels :显示所有标签
5 -l app:仅显示标签为app的资源
6 -l app=nginx:仅显示包含app标签,且值为nginx的资源

 

kubectl 启动mysql 并设置root密码_Pod_06

 

2.1 查看 master 节点状态

1 kubectl get componentstatuses 
2 kubectl get cs

 

kubectl 启动mysql 并设置root密码_nginx_07

 

2.2 查看命令空间

  • 命令空间的作用:用于允许不同命令空间的相同类型的资源重名
1 kubectl get namespace 
2 kubectl get ns

 

kubectl 启动mysql 并设置root密码_Pod_08

 

2.3 查看 default 命名空间的所有资源

1 kubectl get all [-n default]

 

kubectl 启动mysql 并设置root密码_nginx_09

 

2.4 创建、删除命名空间 app

1 kubectl create ns app 
2 kubectl get ns
3 
4 //删除命名空间app
5 kubectl delete namespace app
6 kubectl get ns

 

kubectl 启动mysql 并设置root密码_命名空间_10

 

kubectl 启动mysql 并设置root密码_Pod_11

 

2.5 在命名空间创建 deployment

  • 在命名空间 kube-public 创建副本控制器(deployment) 来启动 Pod (pod 名)

 

1 kubectl create deployment nginx-test01 --image=nginx -n kube-public 
2 kubectl get pod -n kube-public

 

kubectl 启动mysql 并设置root密码_Pod_12

 

2.6 描述某个资源的详细信息

1 kubectl describe pod/nginx-test-65c98cd596-mhzrz -n kube-public

 

kubectl 启动mysql 并设置root密码_nginx_13

 

kubectl 启动mysql 并设置root密码_nginx_14

 

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

1 kubectl get pods -n kube-public

 

kubectl 启动mysql 并设置root密码_命名空间_15

 

2.8 kubectl exec 可以跨主机登录容器

1 //kubectl exec 可以跨主机登录容器,docker exec 只能在容器所在主机上登录
2 
3 kubectl exec -it nginx-test-65c98cd596-mhzrz bash -n kube-public

 

 

kubectl 启动mysql 并设置root密码_Pod_16

 

kubectl 启动mysql 并设置root密码_nginx_17

 

2.9 删除(重启)pod 资源

  • 由于存在 deployment/rc 之类的副本控制器,删除 pod 也会重新拉起来。所以直接删除相当于重启,pod 资源无法直接删除。
1 kubectl delete pod nginx-test-65c98cd596-mhzrz -n kube-public

 

kubectl 启动mysql 并设置root密码_Pod_18

 

1 若pod无法删除, 总是处于terminate状态, 则要强行删除pod :
2 kubectl delete pod nginx-test-65c98cd596-qx6hg -n kube-public --force --grace-period=0


3 #grace-period表示过渡存活期,默认30s,在删除pod之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止pod

 

kubectl 启动mysql 并设置root密码_nginx_19

 

2.10 扩缩容

1 kubectl scale deployment -n kube-public nginx-test --replicas=3                #扩容
2 kubectl scale deployment -n kube-public nginx-test --replicas=1             #缩容

 

 

kubectl 启动mysql 并设置root密码_nginx_20

 

kubectl 启动mysql 并设置root密码_nginx_21

 

2.11 删除副本控制器

1 kubectl delete deployment -n kube-public nginx-test
2 kubectl delete deployment/nginx-test01 -n kube-public

 

kubectl 启动mysql 并设置root密码_nginx_22

 

3. 项目的生命周期

    生命周期:创建 —>> 发布 —>> 更新 —>> 回滚 —>> 删除

3.1 创建 kubectl run 命令

  • 创建并运行一个或多个容器镜像
  • 创建一个 deployment 或 job 来管理容器
  • kubectl run --help

 

1 ##启动 nginx 实例,暴露容器端口80,设置副本数 3
2 kubectl run nginx --image=nginx:1.14 --port=80 --replicas=3
3 kubectl get pods
4 kubectl get all

 

kubectl 启动mysql 并设置root密码_命名空间_23

 

kubectl 启动mysql 并设置root密码_命名空间_24

 

3.2 发布 kubectl expose 命令

  • 将资源暴露为新的 Service
  • kubectl expose --help

 

1 // 为 deployment 的 nginx 创建 service,并通过 service 的80端口转发至容器的80端口上,service 的名称为 nginx-service,类型为 NodePort
2 kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodepPort

 

Pod 的 IP 不是固定的(Pod 可能会重建),另一方面则是因为一组 Pod 实例之间总会有负载均衡的需求。
Label Selector
VIP(虚拟 IP)的网桥的方式访问 Service, 再由 Service 重定向到相应的 Pod。

 

    service 的类型:

  • ClusterIP:提供一个集群内部的虚拟 IP 以供 Pod 访问(service 默认类型)
  • NodePort:在每个 Node 上打开一个端口以供外部访问,Kubernetes 将会在每个 Node 上打开一个端口,并且每个 Node 的端口都是一样的。

    通过 NodeIp:NodePort 的方式 Kubernetes 集群外部的程序可以访问 Service;
30000-32767。

  • LoadBalancer:通过外部的负载均衡器来访问,通常在云平台部署 LoadBalancer 还需要额外的费用。

 

kubectl 启动mysql 并设置root密码_Pod_25

 

kubectl 启动mysql 并设置root密码_命名空间_26

 

kubectl 启动mysql 并设置root密码_Pod_27

 

kubectl 启动mysql 并设置root密码_Pod_28

 

3.3 更新 kubectl set

  • 更改现有应用资源一些信息
  • kubectl set --help

 

1 ## 获取修改模板
 2 kubectl set image --help
 3 Examples:
 4   # Set a deployment's nginx container image to 'nginx:1.9.1', and its busybox container image to 'busybox'.
 5   kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
 6 
 7 
 8 ## 查看当前nginx的版本号
 9 curl -I http://192.168.80.30:31268
10 
11 kubectl set image deployment.apps/nginx nginx=nginx:1.15
12 kubectl get pods
13 
14 ## 更新完后再次查看nginx的版本号
15 curl -I http://192.168.80.30:31268

 

kubectl 启动mysql 并设置root密码_Pod_29

 

kubectl 启动mysql 并设置root密码_Pod_30

 

kubectl 启动mysql 并设置root密码_命名空间_31

 

kubectl 启动mysql 并设置root密码_命名空间_32

 

3.4 回滚 kubectl rollout

  • 对资源进行回滚管理
  • kubectl rollout --help
1 ## 查看历史版本
 2 kubectl rollout history deployment/nginx
 3 
 4 ## 执行回滚到上一个版本
 5 kubectl rollout undo deployment/nginx
 6 
 7 ## 执行回滚到指定版本
 8 kubectl rollout undo deployment/nginx --to-revision=1
 9 
10 ## 检查回滚状态
11 kubectl rollout status deployment/nginx

 

kubectl 启动mysql 并设置root密码_nginx_33

 

kubectl 启动mysql 并设置root密码_Pod_34

 

kubectl 启动mysql 并设置root密码_Pod_35

 

3.5 删除 kubectl delete

1 ## 删除副本控制器
2 kubectl delete deployment/nginx
3 
4 ## 删除service
5 kubectl delete service/nginx-svc
6 
7 kubectl get all

 

kubectl 启动mysql 并设置root密码_Pod_36

 

4. 陈述式管理方法:金丝雀发布(Canary Relase)

    Deployment 控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。
    比如等待第一批新的 Pod 资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的 Pod 应用,继续观察能否稳定地按期望的方式运行。
    确定没问题之后再继续完成余下的 Pod 资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。

 

  • 更新 deployment 的版本,并配置暂停 deployment
1 kubectl set image deployment/nginx nginx=nginx:1.16 && kubectl rollout pause deployment/nginx
2  
3 kubectl rollout status deployment/nginx

 

  • 监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源, 就是因为使用了 pause 暂停命令
1 kubectl get pods -w
2  
3 curl [-I] 10.0.0.189
4 curl [-I] 192.168.80.11:44847

 

  • 确保更新的 pod 没问题了,继续更新
1 kubectl rollout resume deployment/nginx

 

  • 查看最后的更新情况
1 kubectl get pods -W
2  
3 curl [-I] 10.0.0.189
4 curl [-I] 192.168.80.11:44847

 

5. 声明式管理方法

  1. 适合于对资源的修改操作
  2. 声明式资源管理方法依赖于资源配置清单文件对资源进行管理
  3. 资源配置清单文件有两种格式:yaml (人性化,易读),json (易于 api 接口解析)
  4. 对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到 k8s 集群里
  5. 语法格式:kubectl create/app1y/delete -f xxxx.yaml
1 kubectl create -f xxx.yaml (不建议使用,无法更新,必须先delete)
2  
3 kubectl apply -f xxx.yaml (创建+更新,可以重复使用)

 

    如果 yaml 文件中的 kind 值为 deployment,那么上面这两个命令都可以创建一个deployment,生成相应数量的 pod。

    区别:

kubectl create:

  • kubectl create 命令,是先删除所有现有的东西,重新根据 yaml 文件生成新的。所以要求 yaml 文件中的配置必须是完整的。
  • kubectl create 命令,用同一个 yaml 文件执行替换replace命令,将会不成功,fail掉。

kubectl apply:

  • kubectl apply 命令,根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性。
1 //查看资源配置清单
2 
3 kubectl get deployment nginx -o yaml

 

1 //解释资源配置清单
2 
3 kubectl explain deployment.metadata
4  
5 kubectl get service nginx -o yaml
6 kubectl explain service.metadata

 

    离线修改:

  • 修改 yaml 文件,并用 kubectl apply -f xxxx.yaml 文件使之生效
  • 注意:当 apply 不生效时, 先使用 delete 清除资源,再 apply 创建资源
1 kubectl get service nginx -o yaml > nginx-svc.yaml
2 vim nginx-svc.yaml
3 #修改port: 8080
4 kubectl delete -f nginx-svc.yaml
5 kubectl apply -f nginx-svc.yaml
6 kubectl get svc

 

    在线修改:

  • 直接使用 kubectl edit service nginx
  • 在线编辑资源配置清单并保存退出即时生效(如 port:888)
  • PS:此修改方式不会对 yaml 文件内容修改

 

    删除资源配置清单:

1 //陈述式删除:
2 
3 kubectl delete service nginx

 

1 //声明式删除:
2 
3 kubectl delete -f nginx-svc.yaml

 

 

 

 

 

 

-