K8S之YAML与常用命令

文章目录

  • 一. 常用命令
  • 二. YAML关键字
  • 三. yaml文件的固定结构
    • 1. Controller定义部分
    • 2. 资源的特点
    • 3. Pod的模板
    • 4. Container的模板
  • 四. 常见问题
  • 参考文章

一. 常用命令

含义命令
部署应用kubectl apply -f app.yaml
查看 podkubectl get pod -o wide
查看 pod 详情kubectl describe pod pod-name
查看 logkubectl logs pod-name
查看deploymentkubectl get deployment
查看servicekubectl 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
删除servicekubectl 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
重新部署deploymentkubectl rollout restart deployment test-k8s
重新部署statefulsetkubectl 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关键字

字段名字段类型说明
versionstringRESTFul API的版本,目前基本上是v1,可以通过kubectl api-versions命令去查询所有的API的version
kindstring定义的资源类型和角色,例如Pod
metadataobject元数据对象,固定值就写metadata
metadata.namestring元数据对象的名字,例如Pod的名字
metadata.namespacestring元数据对象的命名空间,不指定则默认是default空间
specobjec详细定义对象,固定值就写Spec
spec.containers[]list容器列表
spec.containers[].namestring这里定义容器的名字
spec.containers[].imagestring这里定义容器要用到的镜像名称
spec.containers[].imagePullPolicystring镜像拉取策略,有Always/Never/IfNotPresent三个可选,默认是Always
spec.containers[].command[]list指定容器启动命令,不指定则使用镜像打包时的启动命令
spec.containers[].args[]list指定容器启动命令参数,因为是数组所以可以指定多个
spec.containers[].workingDirstring指定容器的工作目录
spec.containers[].volumeMounts[]list存储卷配置
spec.containers[].volumeMounts[].namestring
spec.containers[].volumeMounts[].mountPathstring
spec.containers[].volumeMounts[].readOnlystring
spec.containers[].ports[]list容器需要的端口列表
spec.containers[].ports[].namestring端口名称
spec.containers[].ports[].containerPortstring容器需要监听的端口号
spec.containers[].ports[].hostPortstring主机需要监听的端口号,默认跟上面的containersPort一致,设置了以后不能在同一台宿主机上启动第二个副本
spec.containers[].ports[].protocolstring端口协议,TCP/UDP,默认是TCP
spec.containers[].env[]list环境变量
spec.containers[].env[].namestring环境变量名称
spec.containers[].env[].valuestring环境变量值
spec.containers[].resourcesobject限制资源的使用上限,后面详细讲
spec.restartPolicystringPod的重启策略,可选Always/OnFailure/Never,默认值为Always
spec.nodeSelectorobject定义Node的label过滤标签,键值对格式指定
spec.imagePullSecretsobject定义pull镜像时使用的密钥,键值对格式指定
spec.hostNetworkBoolean定义是否使用主机网络。默认为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

在这里插入图片描述

参考文章

  1. 【Kubernetes 004】用yaml文件创建自己的第一个pod
  2. Kubernetes之yaml文件详解(汇总-详细)
  3. Kubernetes的yaml文件使用语法及简单操作


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部