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

2022/04/15 k8s,docker

1 方法分类

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

2 kubectl 命令行工具

kubectl中文命令说明

2.0 增加 kubectl 自动补全

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

source <(kubectl completion bash)

2.1 get 查

2.1.1 查看名称空间 namespace

~]# kubectl get namespaces
NAME              STATUS   AGE
default           Active   4d11h
kube-node-lease   Active   4d11h
kube-public       Active   4d11h
kube-system       Active   4d11h

# namespaces 可以简写为 ns
kubectl get ns
# 但不是所有资源都可以简写,所以我还是习惯 tab 补全名

2.1.2 查看 namespace 中的资源

get all 查询所有资源

kubectl get all
# 默认是查询 default 名称空间的资源,查询其他名称空间,需要加 -n namespaces
kubectl get all -n kube-public

mark

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

get pods 查询所有 pod

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

get nodes 查询所有 node 节点

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

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

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

# 查看 Pod 的清单
~]# kubectl -n kube-public get pod nginx-dp-568f8dc55-jk6nb  -o yaml
# 查看 deploy 的清单
~]# kubectl -n kube-public get deploy nginx-dp -o yaml
# 查看 service 的清单
~]# kubectl -n kube-public get service -o yaml -n kube-public

2.2 创建删除名称空间

create namespace 创建名称空间

~]# kubectl create namespace app
namespace/app created
~]# kubectl get namespaces 
NAME              STATUS   AGE
app               Active   16s
default           Active   4d11h
kube-node-lease   Active   4d11h
kube-public       Active   4d11h
kube-system       Active   4d11h

delete namespaces 删除名称空间

~]# kubectl delete namespaces app
namespace "app" deleted
~]# kubectl get namespaces 
NAME              STATUS   AGE
default           Active   4d11h
kube-node-lease   Active   4d11h
kube-public       Active   4d11h
kube-system       Active   4d11h

2.3 管理 Pod 控制器和 Pod

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

创建 Pod 控制器

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

-o wide 查看扩展信息

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

mark

describe 查看资源详细信息

# 查看 Pod 控制器详细信息
kubectl describe deployments nginx-dp -n kube-public
# 查看 Pod 详细信息
kubectl describe pod nginx-dp-568f8dc55-9qt4j -n kube-public

exec进入某个 Pod

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

用法与 docker exec 类似

scale 扩容 Pod

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

delete删除 Pod 和 Pod 控制器

~]# kubectl -n kube-public delete pods nginx-dp-568f8dc55-9qt4j 
pod "nginx-dp-568f8dc55-9qt4j" deleted
~]# kubectl -n kube-public get pods
NAME                       READY   STATUS    RESTARTS   AGE
nginx-dp-568f8dc55-hnrxr   1/1     Running   0          13s
~]# kubectl -n kube-public delete deployments nginx-dp 
deployment.extensions "nginx-dp" deleted
~]# kubectl -n kube-public get pods
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 资源

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

可以看到创建了一个 VIP 192.168.94.73,查看 LVS 信息,可以看到转发条目

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

2.4.2 扩容 Pod 看 service 怎么调度

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

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

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

kubectl explain service.metadata

mark

3 统一资源配置清单

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

3.1 语法格式

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

3.1.1 学习方法

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

3.2 初略用法

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

kubuctl get svc nginx-dp -o yaml -n kube-pubic

mark

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

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

kubectl explain service.kind

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

创建 yaml 配置文件

cat >nginx-ds-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-ds
  name: nginx-ds
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-ds
  type: ClusterIP
EOF

应用配置创建资源

kubectl create -f nginx-ds-svc.yaml

# 或
kubectl apply -f nginx-ds-svc.yaml

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

create 和 apply 的区别

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

  1. create 命令只会新建,如果资源文件已使用过,则会提示错误

  2. 如果资源不存在,apply 命令会新建,如果已存在,则会根据配置修改

  3. 如果是 create 命令新建的资源,使用 apply 修改时会提示

    [root@hdss7-21 ~]# kubectl apply -f nginx-ds-svc.yaml 
    Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
    

    意思是如果要用 apply 修改,就应该用 apply 命令创建,或者 create 创建时加 --save-config 参数

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

3.2.3 修改资源配置清单

在线修改 使用 edit 命令,会打开一个在线的 yaml 格式文档,直接修改该文档后,修改立即生效

kubectl edit svc nginx-ds -n default

# 查看结果
[root@hdss7-21 ~]# kubectl get service nginx-ds 
NAME       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
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   <none>        881/TCP   8s

3.2.4 删除资源配置清单

陈述式删除 即:直接删除创建好的资源

kubectl delete svc nginx-ds -n default

声明式删除 即:通过制定配置文件的方式,删除用该配置文件创建出的资源

kubectl delete -f nginx-ds-svc.yaml

原文链接:https://www.cnblogs.com/noah-luo/p/13345173.html

Search

    Table of Contents