系列文章说明

本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白

管理k8s核心资源的三种基本方法:

目录

  • 系列文章说明
  • 管理k8s核心资源的三种基本方法:
    • 1 方法分类
    • 2 kubectl命令行工具
      • 2.0 增加kubectl自动补全
      • 2.1 get 查
        • 2.1.1 查看名称空间namespace
        • 2.1.2 查看namespace中的资源
        • 2.1.3 -o yaml查看资源配置清单详细信息
      • 2.2 创建删除名称空间
      • 2.3 管理POD控制器和POD
      • 2.4 service资源管理
        • 2.4.1 创建service资源
        • 2.4.2 扩容POD看service怎么调度
      • 2.5 explain查看属性的定义和用法
    • 3 统一资源配置清单
      • 3.1 语法格式
        • 3.1.1 学习方法
      • 3.2 初略用法
        • 3.2.1 查看已有资源的资源配置清单
        • 3.2.2 创建并应用资源配置清单
        • 3.2.3 修改资源配置清单
        • 3.2.4 删除资源配置清单

          1 方法分类

  1. 陈述式—主要依赖命令行工具kubectl进行管理
    • 优点
      可以满足90%以上的使用场景
      对资源的增、删、查操作比较容易
    • 缺点
      命令冗长,复杂,难以记忆
      特定场景下,无法实现管理需求
      对资源的修改麻烦,需要patch来使用json串更改。
  2. 声明式-主要依赖统一资源配置清单进行管理
  3. GUI式-主要依赖图形化操作界面进行管理

    2 kubectl命令行工具

    kubectl中文命令说明

    2.0 增加kubectl自动补全

    二进制安装的k8s,kubectl工具没有自动补全功能(其他方式安装的未验证),可以使用以下方式开启命令自动补全
    1. source <(kubectl completion bash)

    2.1 get 查

    2.1.1 查看名称空间namespace

    1. ~]# kubectl get namespaces
    2. NAME STATUS AGE
    3. default Active 4d11h
    4. kube-node-lease Active 4d11h
    5. kube-public Active 4d11h
    6. kube-system Active 4d11h
    7. # namespaces可以简写为ns
    8. kubectl get ns
    9. # 但不是所有资源都可以简写,所以我还是习惯tab补全名

    2.1.2 查看namespace中的资源

    get all查询所有资源
    1. kubectl get all
    2. # 默认是查询default名称空间的资源,查询其他名称空间,需要加 -n namespaces
    3. kubectl get all -n kube-public
    K8S(02)管理核心资源的三种基本方法 - 图1

    一般要养成习惯,get任何资源的时候,都要加上-n参数指定名称空间

get pods查询所有pod

  1. podsecuritypolicies.extensions
  2. ~]# kubectl get pods -n default
  3. NAME READY STATUS RESTARTS AGE
  4. nginx-ds-p66qh 1/1 Running 0 2d10h

get nodes查询所有node节点

  1. ~]# kubectl get nodes -n default
  2. NAME STATUS ROLES AGE VERSION
  3. hdss7-21.host.com Ready master,node 2d12h v1.15.5
  4. hdss7-22.host.com NotReady <none> 2d12h v1.15.5

2.1.3 -o yaml查看资源配置清单详细信息

-o yaml 可以查看yaml格式的资源配置清单详情

  1. # 查看POD的清单
  2. ~]# kubectl -n kube-public get pod nginx-dp-568f8dc55-jk6nb -o yaml
  3. # 查看deploy的清单
  4. ~]# kubectl -n kube-public get deploy nginx-dp -o yaml
  5. # 查看service的清单
  6. ~]# kubectl -n kube-public get service -o yaml -n kube-public

2.2 创建删除名称空间

create namespace创建名称空间

  1. ~]# kubectl create namespace app
  2. namespace/app created
  3. ~]# kubectl get namespaces
  4. NAME STATUS AGE
  5. app Active 16s
  6. default Active 4d11h
  7. kube-node-lease Active 4d11h
  8. kube-public Active 4d11h
  9. kube-system Active 4d11h

delete namespaces删除名称空间

  1. ~]# kubectl delete namespaces app
  2. namespace "app" deleted
  3. ~]# kubectl get namespaces
  4. NAME STATUS AGE
  5. default Active 4d11h
  6. kube-node-lease Active 4d11h
  7. kube-public Active 4d11h
  8. kube-system Active 4d11h

2.3 管理POD控制器和POD

deployment类型的POD控制为例,关于POD控制器类型,请参考官网
创建POD控制器

  1. kubectl create deployment nginx-dp --image=harbor.zq.com/public/nginx:v1.17.9 -n kube-public
  2. ~]# kubectl get deployments -n kube-public
  3. NAME READY UP-TO-DATE AVAILABLE AGE
  4. nginx-dp 1/1 1 1 18s
  5. ~]# kubectl get pod -n kube-public
  6. NAME READY STATUS RESTARTS AGE
  7. nginx-dp-568f8dc55-9qt4j 1/1 Running 0 7m50s

-o wide查看扩展信息

  1. # 查看POD控制器信息,比基础信息多出了镜像来源,选择器等
  2. kubectl get deployments -o wide -n kube-public
  3. # 查看POD信息,比基础信息多出了POD的IP地址,节点位置等,
  4. kubectl get pod -o wide -n kube-public

K8S(02)管理核心资源的三种基本方法 - 图2
describe查看资源详细信息

  1. # 查看POD控制器详细信息
  2. kubectl describe deployments nginx-dp -n kube-public
  3. # 查看POD详细信息
  4. kubectl describe pod nginx-dp-568f8dc55-9qt4j -n kube-public

exec进入某个POD

  1. kubectl -n kube-public exec -it nginx-dp-568f8dc55-9qt4j bash

用法与docker exec类似

scale 扩容POD

  1. kubectl -n kube-public scale deployments nginx-dp --replicas=2

delete删除POD和POD控制器

  1. ~]# kubectl -n kube-public delete pods nginx-dp-568f8dc55-9qt4j
  2. pod "nginx-dp-568f8dc55-9qt4j" deleted
  3. ~]# kubectl -n kube-public get pods
  4. NAME READY STATUS RESTARTS AGE
  5. nginx-dp-568f8dc55-hnrxr 1/1 Running 0 13s
  6. ~]# kubectl -n kube-public delete deployments nginx-dp
  7. deployment.extensions "nginx-dp" deleted
  8. ~]# kubectl -n kube-public get pods
  9. No resources found.

在POD控制器存在的情况下,删除了POD,会由POD控制器再创建出新的POD 删除POD控制器后,对应的POD也会一并删除

2.4 service资源管理

从上面的POD删除重建的过程可知,虽然POD会被POD控制器拉起,但是存放的NODE或POD的IP都是不确定的,那怎么对外稳定的提供服务呢
这就需要引入service的功能了,它相当于一个反向代理,不管后端POD怎么变化,server提供的服务都不会变化,可以为pod资源提供稳定的接入点

2.4.1 创建service资源

  1. ~]# kubectl -n kube-public create deployment nginx-dp --image=harbor.zq.com/public/nginx:v1.17.9
  2. deployment.apps/nginx-dp created
  3. ~]# kubectl -n kube-public expose deployment nginx-dp --port=80
  4. service/nginx-dp exposed
  5. ~]# kubectl -n kube-public get service
  6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  7. nginx-dp ClusterIP 192.168.94.73 <none> 80/TCP 45s

可以看到创建了一个VIP192.168.94.73,查看LVS信息,可以看到转发条目

  1. [root@hdss7-21 ~]# ipvsadm -Ln
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. ......
  4. TCP 192.168.94.73:80 nq
  5. -> 172.7.21.3:80 Masq 1 0 0

2.4.2 扩容POD看service怎么调度

  1. ~]# kubectl -n kube-public scale deployment nginx-dp --replicas=2
  2. deployment.extensions/nginx-dp scaled
  3. ~]# ipvsadm -Ln
  4. ......
  5. TCP 192.168.94.73:80 nq
  6. -> 172.7.21.3:80 Masq 1 0 0
  7. -> 172.7.22.4:80 Masq 1 0 0

2.5 explain查看属性的定义和用法

查看service资源下metadata的定义及用法

  1. kubectl explain service.metadata

K8S(02)管理核心资源的三种基本方法 - 图3

3 统一资源配置清单

统一资源配置清单,就是一个yaml格式的文件,文件中按指定格式定义了所需内容,然后通过命令行工具kubectl应用即可

3.1 语法格式

  1. kubectl create/apply/delete -f /path_to/xxx.yaml

3.1.1 学习方法

  1. 忌一来就无中生有自己写,容易把自己憋死
  2. 先看官方或别人写的,能读懂即可
  3. 别人的读懂了能改改内容即可
  4. 遇到不懂的用kubectl explain查帮助

    3.2 初略用法

    3.2.1 查看已有资源的资源配置清单

    1. kubuctl get svc nginx-dp -o yaml -n kube-pubic
    K8S(02)管理核心资源的三种基本方法 - 图4

    必须存在的四个部分为: apiVersion kind metadata spec

资源配置清单中有许多项目,如果想查看资源配置清单中某一项的意义或该项下面可以配置的内容,可以使用explain来获取

  1. kubectl explain service.kind

3.2.2 创建并应用资源配置清单

创建yaml配置文件

  1. cat >nginx-ds-svc.yaml <<EOF
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. labels:
  6. app: nginx-ds
  7. name: nginx-ds
  8. namespace: default
  9. spec:
  10. ports:
  11. - port: 80
  12. protocol: TCP
  13. targetPort: 80
  14. selector:
  15. app: nginx-ds
  16. type: ClusterIP
  17. EOF

应用配置创建资源

  1. kubectl create -f nginx-ds-svc.yaml
  2. # 或
  3. kubectl apply -f nginx-ds-svc.yaml
  4. # 查看结果
  5. [root@hdss7-21 ~]# kubectl get -f nginx-ds-svc.yaml
  6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  7. nginx-ds ClusterIP 192.168.48.225 <none> 80/TCP 24s

create和apply的区别
create命令和apply命令都会根据配置文件创建资源,但是:

  1. create命令只会新建,如果资源文件已使用过,则会提示错误
  2. 如果资源不存在,apply命令会新建,如果已存在,则会根据配置修改
  3. 如果是create命令新建的资源,使用apply修改时会提示

    1. [root@hdss7-21 ~]# kubectl apply -f nginx-ds-svc.yaml
    2. Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
  4. 意思是如果要用apply修改,就应该用apply命令创建,或者create创建时加--save-config参数

  5. 所以养成使用apply命令的习惯即可

    3.2.3 修改资源配置清单

    在线修改
    使用edit命令,会打开一个在线的yaml格式文档,直接修改该文档后,修改立即生效
    1. kubectl edit svc nginx-ds -n default
    2. # 查看结果
    3. [root@hdss7-21 ~]# kubectl get service nginx-ds
    4. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    5. nginx-ds ClusterIP 192.168.48.225 <none> 8080/TCP 2m37s
    离线修改
    离线修改就是修改原来的yaml文件,然后使用apply命令重新应用配置即可 ```

    将对外暴露的端口改为881

    sed -i ‘s#port: 80#port: 881#g’ nginx-ds-svc.yaml

    edit修改过资源,再用apply修改,会报错

    [root@hdss7-21 ~]# kubectl apply -f nginx-ds-svc.yaml The Service “nginx-ds” is invalid:
  • spec.ports[0].name: Required value
  • spec.ports[1].name: Required value

    加上—force强制修改选项

    [root@hdss7-21 ~]# kubectl apply -f nginx-ds-svc.yaml —force service/nginx-ds configured

    查看结果

    [root@hdss7-21 ~]# kubectl get service nginx-ds NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ds ClusterIP 192.168.142.98 881/TCP 8s
    1. <a name="BSiwt"></a>
    2. #### 3.2.4 删除资源配置清单
    3. **陈述式删除**<br />即:直接删除创建好的资源
    kubectl delete svc nginx-ds -n default
    1. **声明式删除**<br />即:通过制定配置文件的方式,删除用该配置文件创建出的资源
    kubectl delete -f nginx-ds-svc.yaml ```

转载自cnblog:https://www.cnblogs.com/noah-luo/p/13345173.html