文章目录
1. 资源管理方式:
1>. 命令式对象管理∶直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
2>. 命令式对象配置∶通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
3>. 声明式对象配置∶通过apply命令和配置文件去操作kubemetes资源
kubectl apply -f nginx-pod.yaml
1.1. 命令式对象管理:
kubectl命令:kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下∶
kubectl [command] [type] [name] [flags]
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
## 查看所有pod:
[root@master ~]# kubectl get pod
## 查看某个pod:
[root@master ~]# kubectl get pod podname
## 查看莫格pod,以yaml格式展示结果:
[root@master ~]# kubectl get pod podname -o yaml
## 查看资源类型:
[root@master ~]# kubectl api-resources
## 查看集群信息:
[root@master ~]# kubectl cluster-info
我们以一个namespace / pod的创建和删除演示kubectl命令的使用:
## 创建一个名为dev的namespace:
[root@master ~]# kubectl create namespace/ns dev
## 获取namespace:
[root@master ~]# kubectl get ns
## 在此namespace下创建并运行一个nginx的pod:
[root@master ~]# kubectl run nginxpod(podname) --image nginx(镜像名) -n dev(namespace)
## 查看在dev命名空间创建的pod:
[root@master ~]# kubectl get pod -n dev
[root@master ~]# kubectl get pod -n dev -o wide
## 查看资源在dev命名空间的运行过程:
[root@master ~]# kubectl describe pod podname -n dev
## 删除指定的pod:
[root@master ~]# kubectl delete pod nginxpod -n dev
## 删除指定的namespace
[root@master ~]# kubectl delete ns dev
1.2 命令式对象配置:命令式对象配置就是使用命令配合文件一起来操作kubernetes资源
1>. 创建一个nginxpod.yml,内容如下:
apiVersion: v1
kind: Namespace
metadata:
name: dev
--- ## 表示如果需要将多段yaml配置放在一个文件中,中间需要使用"---"分隔
apiVersion: v1
kind: Pod
metadata:
name: nginxpod
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx:1.14-alpine
注意:如果yaml文件中要操作namspace就可以使用以下命令来查看帮助:
[root@master ~]# kubectl explain ns ## 查看namespace的帮助
[root@master ~]# kubectl explain ns.apiVersion ## 查看namespace版本的帮助
[root@master ~]# kubectl explain ns.kind ## 查看namespace类型的帮助
[root@master ~]# kubectl explain ns.metadata ## 查看namespace元数据的帮助
注意:如果yaml文件中要操作pod就可以使用以下命令来查看帮助:
[root@master ~]# kubectl explain pod ## 查看操作pod的帮助
[root@master ~]# kubectl explain pod.apiVersion ## 查看pod版本的帮助
[root@master ~]# kubectl explain pod.kind ## 查看pod类型的帮助
[root@master ~]# kubectl explain pod.metadata ## 查看pod元数据的帮助
[root@master ~]# kubectl explain pod.spec ## 查看pod中的设置参数的帮助
[root@master ~]# kubectl explain pod.spec.containers ## 查看pod中容器的帮助
2>. 指定create命令,创建资源:
[root@master ~]# kubectl create -f nginxpod.yml
## 查看namespace:
[root@master ~]# kubectl get ns
## 查看dev中的pod:
[root@master ~]# kubectl get pod -n dev
## 查看nginxpod.yml文件中配置的资源信息:
[root@master ~]# kubectl get -f nginxpod.yml
## 删除资源:
[root@master ~]# kubectl delete -f nginxpod.yml
总结:命令式对象配置的方式造作资源,可以简单地认为:命令+yaml配置文件(配置文件中是命令需要的各种参数)。
1.3 声明式对象配置 apply
声明式对象配置跟命令式对象配置很相似,但是他只有一个命令叫apply 。
1.3.1 单个配置件
## 执行kubect1 apply -f yaml来创建资源
[root@master ~]# kubectl apply -f nginxpod.yml
## 再次执行后会发现资源没有发生改变
总结:声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)使用apply操作资源
-
如果资源不存在,就
创建
,相当于kubectl create -
如果资源已存在,就
更新
,相当于kubectl patch
1.3.2 多个配置文件或目录
如果我们想应用某个目录下的所有配置文件,可以使用kubectl apply命令并指定该目录的路径。以下是一个应用目录的示例:
$ kubectl apply -f ./configurations/
1.3.3 kubectl apply的优势
1.3.3.1 通过diff方式进行更新
使用kubectl apply命令更新现有资源对象时,它会对新的配置文件和现有的资源对象进行比较,并根据差异更新资源对象。这意味着kubectl apply可以实现部分更新,并且只会更新需要更新的字段,而不会重置资源对象的其他配置。
如果kubectl create
命令 创建的pod已存在,则报错:
Error from server (AlreadyExists): error when creating "kubia-manual.yaml": pods "kubia-manual" already exists
此外,支持部分修改,是相对于 kubectl replace
来说的,kubectl replace
不支持部分修改,参见 【k8s】kubectl replace命令。
1.3.3.2支持批量操作
使用kubectl apply
命令可以同时应用多个配置文件,并创建多个资源对象。这使得kubectl apply非常适合批量操作资源对象。
kubectl create
命令也允许目录形式,即同时应用多个文件!
1.3.3.3 支持灰度发布
kubectl apply
命令可以部分更新资源对象的配置,这意味着它非常适合进行灰度发布。例如,我们可以通过部分更新一个Deployment
对象的配置来实现灰度发布,这样我们就可以逐步将新版本的应用程序推向生产环境。
如果create命令 带入2个文件作为入参,则报错:
$ kubectl create -f kubia-manual.yaml kubia-manual2.yaml
error: Unexpected args: [kubia-manual2.yaml]
5. 三种方式的适用场景:
-
创建/更新资源:使用声明式对象配置 kubectl apply -f xxx.yaml。
-
删除资源:使用命令式对象配置 kubectl delete -f xxx.yaml。
-
查询资源:使用命令式对象管理 kubectl get(describe) 资源名称