K8S之YAML与常用命令
文章目录
- 一. 常用命令
- 二. YAML关键字
- 三. yaml文件的固定结构
- 1. Controller定义部分
- 2. 资源的特点
- 3. Pod的模板
- 4. Container的模板
- 四. 常见问题
- 参考文章
一. 常用命令
| 含义 | 命令 |
|---|---|
| 部署应用 | kubectl apply -f app.yaml |
| 查看 pod | kubectl get pod -o wide |
| 查看 pod 详情 | kubectl describe pod pod-name |
| 查看 log | kubectl logs pod-name |
查看deployment | kubectl get deployment |
查看service | kubectl get svc |
| 查看service详情 | kubectl describe svc test-k8s |
| 获取service的endpoints的信息 | kubectl get endpoints |
| 获取service的endpoints的详细信息 | kubectl get endpoints service-name -o yaml |
查看statefulset的状态 | kubectl get statefulsets |
删除全部资源 | kubectl delete all --all |
| 删除部署 | kubectl delete deployment test-k8s |
| 删除service | kubectl delete svc test-k8s |
| 进入 Pod 容器终端, -c container-name 可以指定进入哪个容器。 | kubectl exec -it pod-name – bash |
| 伸缩扩展副本 | kubectl scale deployment test-k8s --replicas=5 |
| 把集群内端口映射到节点 | kubectl port-forward pod-name 8090:8080 |
其他命令
| 含义 | 命令 |
|---|---|
查看全部 | kubectl get all |
| 重新部署deployment | kubectl rollout restart deployment test-k8s |
| 重新部署statefulset | kubectl rollout restart statefulset test-k8s |
| 命令修改镜像,–record 表示把这个命令记录到操作历史中 | kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record |
| 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置 | kubectl rollout pause deployment test-k8s |
| 恢复 | kubectl rollout resume deployment test-k8s |
| 输出到文件 | kubectl get deployment test-k8s -o yaml >> app2.yaml |
| 查看历史 | kubectl rollout history deployment test-k8s |
| 回到上个版本 | kubectl rollout undo deployment test-k8s |
| 回到指定版本 | kubectl rollout undo deployment test-k8s --to-revision=2 |
二. YAML关键字
| 字段名 | 字段类型 | 说明 |
|---|---|---|
| version | string | RESTFul API的版本,目前基本上是v1,可以通过kubectl api-versions命令去查询所有的API的version |
| kind | string | 定义的资源类型和角色,例如Pod |
| metadata | object | 元数据对象,固定值就写metadata |
| metadata.name | string | 元数据对象的名字,例如Pod的名字 |
| metadata.namespace | string | 元数据对象的命名空间,不指定则默认是default空间 |
| spec | objec | 详细定义对象,固定值就写Spec |
| spec.containers[] | list容器列表 | |
| spec.containers[].name | string | 这里定义容器的名字 |
| spec.containers[].image | string | 这里定义容器要用到的镜像名称 |
| spec.containers[].imagePullPolicy | string | 镜像拉取策略,有Always/Never/IfNotPresent三个可选,默认是Always |
| spec.containers[].command[] | list | 指定容器启动命令,不指定则使用镜像打包时的启动命令 |
| spec.containers[].args[] | list | 指定容器启动命令参数,因为是数组所以可以指定多个 |
| spec.containers[].workingDir | string | 指定容器的工作目录 |
| spec.containers[].volumeMounts[] | list | 存储卷配置 |
| spec.containers[].volumeMounts[].name | string | |
| spec.containers[].volumeMounts[].mountPath | string | |
| spec.containers[].volumeMounts[].readOnly | string | |
| spec.containers[].ports[] | list | 容器需要的端口列表 |
| spec.containers[].ports[].name | string | 端口名称 |
| spec.containers[].ports[].containerPort | string | 容器需要监听的端口号 |
| spec.containers[].ports[].hostPort | string | 主机需要监听的端口号,默认跟上面的containersPort一致,设置了以后不能在同一台宿主机上启动第二个副本 |
| spec.containers[].ports[].protocol | string | 端口协议,TCP/UDP,默认是TCP |
| spec.containers[].env[] | list | 环境变量 |
| spec.containers[].env[].name | string | 环境变量名称 |
| spec.containers[].env[].value | string | 环境变量值 |
| spec.containers[].resources | object | 限制资源的使用上限,后面详细讲 |
| spec.restartPolicy | string | Pod的重启策略,可选Always/OnFailure/Never,默认值为Always |
| spec.nodeSelector | object | 定义Node的label过滤标签,键值对格式指定 |
| spec.imagePullSecrets | object | 定义pull镜像时使用的密钥,键值对格式指定 |
| spec.hostNetwork | Boolean | 定义是否使用主机网络。默认为false表示不使用宿主机网络,只用docker网桥。设置了true将无法在同一台宿主机上启动第二个副本 |
举例:
三. yaml文件的固定结构
COPY每个文件必须的结构如下:
apiVersion: apps/v1 # api版本
kind: xxxx # 要创建的资源类型,如Deployment/Pod/ReplicaSet/StatefulSet/DaemonSet/Job/Cronjob/Service/Ingress...
metadata: # 元数据对象,该资源的基本属性和信息name: xxx # 定义该资源的名称namespace: xxx # 命名空间,默认放到default空间lables: # 标签,在下一行定义键值对,可以是多对键值对xxx: xxxxxxx: xxxxannotations # 资源注解xxx: xxxx
spec: # 定义期望状态,详细的创建信息containers: # 容器列表- name: xxx # 容器名image: xxxx # 容器镜像
status: # 当前状态,由k8s集群维护,不可以自定义
1. Controller定义部分
COPY必须定义名字
------------------------------------------
apiVersion: apps/v1 # api版本(必须的)
kind: Deployment # 表示要创建的Controller资源类型
metadata: # 元数据对象,该资源的基本属性和信息(必须的)name: nginx-deployment # 定义该资源的名称(必须的),同一命名空间内,必须唯一namespace: xxxx # 命名空间,默认放到default空间(可选)labels: # 标签,用来定位一个或多个资源,键值对方式进行定义,下方使用的selector会与这里的键值对对应,作为selector的挑选条件app: nginx # 设置key为app,value为nginx
------------------------------------------
2. 资源的特点
也就是kind所创建的资源的信息
COPY------------------------------------------
spec: # 描述该资源的创建信息,对应kind资源类型的信息revisionHistoryLimit: 10 # 回滚时会用到,用来保留最近10的版本replicas: 2 # 创建2个应用实例selector: # 标签选择器,与上面的标签共用,这个部分是17版本开始加的,必须与上面的labels对应matchLabels: # 选择包含标签app:nginx的资源# 正确的Deployment,让matchLabels 和template.metadata.lables完全匹配才能不报错# 直接不写spec.mathlabels创建直接报错缺少缺少必要字段selector# 当把matchLables匹配的和下面pod模板不相对应,也会直接报错:选择的标签和模板标签不匹配# matchLabel是pod的标签选择器。 由此选择其pod的现有ReplicaSet(副本集)将受此部署影响的副本。app: nginx
------------------------------------------
matchLabels总结
1、在Deployment中必须写matchLabels
2、在定义模板的时候必须定义labels,因为Deployment.spec.selector是必须字段,而又必须和template.labels对应
3、templdate里面定义的内容会应用到下面所有的副本集里面,在template.spec.containers里面不能定义labels标签
3. Pod的模板
COPY必须定义labels
------------------------------------------template: # 选择或创建的Pod模板metadata: # Pod的元数据,Pod的信息labels: # Pod标签app: nginx
------------------------------------------
4. Container的模板
COPY------------------------------------------spec: # 期望Pod实现的功能(在Pod中部署什么)strategy: # 在滚动更新Pod时的启动Pod数量比值rollingUpdate:maxSurge: 35%maxUnavailable: 35%nodeSelector: # 指定pod运行在哪个集群节点restartPolicy: # 容器重启策略(Never/Always/OnFailure)hostNetwork: true # 表示直接使用节点中的主机网络,相当于docker的host网络containers: # 在Pod中生成容器,容器列表,可写入多个镜像的实例- name: xxxx # 定义容器名image: xxxx # 容器使用的镜像- name: xxxximage: xxxximagePullPolicy: # 镜像下载策略(IfNotPresent/Never/Always)# 分别代表,没有镜像时下载,从不下载,总是下载command: # 运行程序==dockerfile中的ENTRYPOINT,或者docker run时最后跟的/bin/bash等命令,会替代dockerfile中cmd和ENTRYPOINT执行的命令- echo- 'hello world'args: # 向docker镜像中传递命令,通常用来给command传参,也可以单独使用,与dockerfile中的CMD作用一样,如果yml中只写了args,将会给dockerfile中的ENTRYPOINT传参,dockerfile中的CMD会失效。- xxx- xxx ports: # 用来暴露端口,并不是端口映射,仅仅为了可以看到容器中使用了哪两个端口- name: xxxcontainerPort: 80 # 容器中提供服务的端口protocol: TCP/UDP # 默认是tcp- name: xxxcontainerPort: 443volumeMounts: # 用来指定容器内的路径- name: nginxconfmountPath: /usr/local/nginx/conf- name: nginxhtmlmountPath: /usr/local/nginx/htmlreadOnly: True # 设置容器内只读,默认是读写volumes: # 指定对应name的物理机路径,缩进与上方的containers对齐- name: nginxconfhostPath: path: /nginx/conf- name: nginxhtmlhostPath: path: /nginx/html- name: xxxemptyDir: {}- name: xxx persistentVolumeClaim: # 使用PVC存储资源claimName: xxxxx-xxxLivenessProbe: # 存活检测,判断文件是否存在,检测失败重启容器exec:command:- cat- /tmp/healthyreadinessProbe: # 读取检测,判断文件是否存在,检测失败,标记为不可用,将不会被Service所负载exec:command:- cat- /tmp/healthy
------------------------------------------
四. 常见问题
如果你运行 kubectl describe pod/pod-name 发现 Events 中有下面这个错误
networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory
在每个节点创建文件 /run/flannel/subnet.env 写入以下内容,配置后等待一会就好了
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

参考文章
- 【Kubernetes 004】用yaml文件创建自己的第一个pod
- Kubernetes之yaml文件详解(汇总-详细)
- Kubernetes的yaml文件使用语法及简单操作
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
