文章目录
- 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实战入门