文章目录
- 1 k8s资源管理介绍
 - 2 YAML语言介绍
 - 3 资源管理方式
 - 3.1 命令式对象管理
 - 3.2 命令式对象配置
 - 3.3 声明式对象配置
 - 3.4 如何编写YAML
 
1 k8s资源管理介绍
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。
当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。

2 YAML语言介绍
关于 YAML 语言的其他知识点就不再一一细说了,都整理在了这张图里,你可以参考YAML 官网。
 
小提示:
1 书写yaml切记: 后面要加一个空格
2 如果需要将多段yaml配置放在一个文件中,中间要使用—分隔
3 下面是一个yaml转json的网站,可以通过它验证yaml是否书写正确
https://www.json2yaml.com/convert-yaml-to-json
3 资源管理方式
命令式对象管理:直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
 
命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
 
声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f nginx-pod.yaml
 

3.1 命令式对象管理
kubectl命令
 kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
 
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
# 查看所有pod
kubectl get pod 
# 查看某个pod
kubectl get pod pod_name
# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml
 
在使用 kubectl 命令的时候,你还可以加上一个参数 --v=9,它会显示出详细的命令执行过程,清楚地看到发出的 HTTP 请求,比如:
kubectl get pod --v=9
 
[root@k8s-master k8s]# kubectl get pod --v=9
I0101 12:23:30.136356   30202 loader.go:375] Config loaded from file:  /root/.kube/config
I0101 12:23:30.146379   30202 round_trippers.go:423] curl -k -v -XGET  -H "Accept: application/json;as=Table;v=v1beta1;g=meta.k8s.io, application/json" -H "User-Agent: kubectl/v1.17.4 (linux/amd64) kubernetes/8d8aa39" 'https://192.168.192.144:6443/api/v1/namespaces/default/pods?limit=500'
I0101 12:23:30.163967   30202 round_trippers.go:443] GET https://192.168.192.144:6443/api/v1/namespaces/default/pods?limit=500 200 OK in 17 milliseconds
 
可以看到,kubectl 客户端等价于调用了 curl,向 8443 端口发送了 HTTP GET 请求,URL 是 /api/v1/namespaces/default/pods。
资源类型
 kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:
kubectl api-resources
 

 操作
 kubernetes允许对资源进行多种操作,可以通过–help查看详细的操作命令
kubectl --help
 
经常使用的操作有下面这些:
 
 下面以一个namespace / pod的创建和删除简单演示下命令的使用:
# 创建一个namespace
[root@k8s-master k8s]# kubectl create namespace dev
namespace/dev created
# 获取namespace
[root@k8s-master k8s]# kubectl get ns
NAME                   STATUS   AGE
default                Active   8d
dev                    Active   31s
kube-flannel           Active   8d
kube-node-lease        Active   8d
kube-public            Active   8d
kube-system            Active   8d
kubernetes-dashboard   Active   6d
# 在此namespace下创建并运行一个nginx的Pod
[root@k8s-master k8s]# kubectl run pod --image=nginx:latest -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/pod created
# 查看新创建的pod
[root@k8s-master k8s]# kubectl get pod -n dev
NAME                   READY   STATUS    RESTARTS   AGE
pod-644584df94-h74sv   1/1     Running   0          2m19s
# 删除指定的pod
[root@k8s-master k8s]# kubectl delete pod  pod-644584df94-h74sv -n dev
pod "pod-644584df94-h74sv" deleted
# 删除指定的namespace
[root@k8s-master k8s]# kubectl delete ns dev
namespace "dev" deleted
 
3.2 命令式对象配置
命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。
1) 创建一个nginxpod.yaml,内容如下:
apiVersion: v1
kind: Namespace
metadata:
  name: dev
---
apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: dev
spec:
  containers:
  - name: nginx-containers
    image: nginx:latest
 
2)执行create命令,创建资源:
[root@k8s-master k8s]# kubectl create -f nginx-pod.yaml 
namespace/dev created
pod/nginxpod created
 
此时发现创建了两个资源对象,分别是namespace和pod
3)执行get命令,查看资源:
[root@k8s-master k8s]# kubectl get -f nginx-pod.yaml 
NAME            STATUS   AGE
namespace/dev   Active   41s
NAME           READY   STATUS    RESTARTS   AGE
pod/nginxpod   1/1     Running   0          40s
 
这样就显示了两个资源对象的信息
4)执行delete命令,删除资源:
[root@k8s-master k8s]# kubectl delete -f nginx-pod.yaml 
namespace "dev" deleted
pod "nginxpod" deleted
 
此时发现两个资源对象被删除了
总结: 命令式对象配置的方式操作资源,可以简单的认为:命令 + yaml配置文件(里面是命令需要的各种参数)
3.3 声明式对象配置
声明式对象配置跟命令式对象配置很相似,但是它只有一个命令apply
# 首先执行一次kubectl apply -f yaml文件,发现创建了资源
[root@master ~]#  kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created
# 再次执行一次kubectl apply -f yaml文件,发现说资源没有变动
[root@master ~]#  kubectl apply -f nginxpod.yaml
namespace/dev unchanged
pod/nginxpod unchanged
 
总结:
其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)
使用apply操作资源:
如果资源不存在,就创建,相当于 kubectl create
如果资源已存在,就更新,相当于 kubectl patch
扩展:在node节点上运行kubectl
kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:
scp -r $HOME/.kube node2:$HOME/
 
使用推荐: 三种方式应该怎么用 ?
创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yaml
删除资源 使用命令式对象配置 kubectl delete -f XXX.yaml
查询资源 使用命令式对象管理 kubectl get(describe) 资源名称
3.4 如何编写YAML
第一个技巧:就是 kubectl api-resources 命令,它会显示出资源对象相应的 API 版本和类型,比如 Pod 的版本是“v1”,Ingress 的版本是“networking.k8s.io/v1”,照着它写绝对不会错。
第二个技巧:是命令 kubectl explain,它相当于是 Kubernetes 自带的 API 文档,会给出对象字段的详细说明,这样我们就不必去网上查找了。比如想要看 Pod 里的字段该怎么写,就可以这样:
kubectl explain pod
kubectl explain pod.metadata
kubectl explain pod.spec
kubectl explain pod.spec.containers
 
第三个技巧:使用kubectl 的两个特殊参数 --dry-run=client 和 -o yaml,前者是空运行,后者是生成 YAML 格式,结合起来使用就会让 kubectl 不会有实际的创建动作,而只生成 YAML 文件。
kube17版本的使用 --dry-run=1
例如,想要生成一个 Pod 的 YAML 样板示例,可以在 kubectl run 后面加上这两个参数:
 就会生成一个绝对正确的 YAML 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    run: ngx
  name: ngx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: ngx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: ngx
    spec:
      containers:
      - image: nginx:alpine
        name: ngx
 
接下来你要做的,就是查阅对象的说明文档,添加或者删除字段来定制这个 YAML 了。这个小技巧还可以再进化一下,把这段参数定义成 Shell 变量(名字任意,比如 d o / do/ do/go,这里用的是$out),用起来会更省事,比如:
export out="--dry-run=client -o yaml"
kubectl run ngx --image=nginx:alpine $out
 
上一篇:二、kubernetes集群环境搭建
 下一篇:四、k8s实战入门


















