kubernetes——yaml文件的编写
yaml文件的结尾后缀名.yaml或者.yml都能够识别。
yaml文件就像脚本一样,可以放在任意的位置。
编写yaml文件需要用到的帮助手册的查看:
 kubectl explain deploy    #使用explain进行查看
 kubectl explain deploy.spec.template   #可以一级一级查下去中间用.连接即可。
 
需要提前知道的:
 imagePullPolicy有三种模式
    Nerver:不拉取镜像,如果本地没有镜像,那么容器起不来。
    Always:默认选项,再使用yaml文件部署pod的时候,无论本地是否有镜像,都尝试拉取dockerhub上的镜像。
    IfNotPresent:如果本地没有再去dockerhub上拉取。
yaml文件编写:
 #vim nginx.yaml
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
  name: nginx1
 spec:
  replicas: 2
  template:
   metadata:
    labels:
     run: nginx
   spec:
    containers:
    - name: nginx
      image: nginx
      imagePullPolicy: IfNotPresent
 
 kubectl apply -f nginx.yaml
 kubectl delete -f nginx.yaml
 #也可以通过kubectl delete deploy nginx1
 #yaml文件一定要严格按照格式编写,该对齐的一定要严格对齐。
 # vim nginx-pod.yml
 apiVersion: v1
 kind: Pod
 metadata:
  name: nginx
 spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
   
 kubectl apply -f nginx-pod.yml
 #单独的pod没有deploy来管控它,这种不受管控的pod可以直接通过 kubectl delete pod nginx 来删除。
 kubectl delete -f nginx-pod.yml
 kubectl get po
 kubectl api-resources   #查看各资源的缩写
 
标签Labels
labels是service(svc)找到pod的途径
相当于是对pod打标签
kubectl get po --show-labels    #可以查看到pod的标签
给资源打标签:
kubectl label no node3 disktype=ssd    #node3打上disktype=ssd的标签
kubectl get no --show-labels
给node打上标签之后,使用yaml文件来进行标签选择:
kubectl explain deploy.spec.template.spec  |  grep -C 5 -i selector 可以查看选择器nodeSelector
 
#vim select.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: nginx2
spec:
 replicas: 5
 template:
  labels:
   run: nginx
 spec:
  nodeSelector:
   disktype: ssd
  container:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
kubectl apply -f select.yaml 
kubectl get po -o wide -w    #会发现5个都运行在了标签为disktype=ssd的node3上。
kubectl get no --show-labels
 
k8s——集群健壮性测试
如果你在一个yaml文件中定义一个deploy运行5个pod,这5个pod在集群的node中均有分布。
如果其中的一个node节点因为某种原因宕机了,那么还会有5个pod在运行吗?
答案是会的,因为你的deploy的预期是5个,如果你的节点down掉了,他会在其他的节点上去启动相应的pod来满足5个pod的要求。
使用kubectl get po -o wide 查看,会发现running状态的pod还是5个,他会在好的节点上去启动副本来满足预期。
kubectl get deploy
kubectl get no -w   #可以监控node的状态-w watch
当你的节点通过你的维护又跑起来了之后,通过kubectl get pod -o wide 查看发现:这个pod并不会再回到ken3,
因为pod一旦分布到node上部署,直到生命周期完结都不会离开相应的node
 
k8s控制器
deploy  job(相当于at,一次性) cj —— 相当于crond job
deploy daemon —— 持久运行
控制器job
编写job的yaml文件:
kubectl explain job
#vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
 name: my_job
spec:
 template:
  spec:
   restartPolicy: Nerver   #Always是默认选项,总是重启,Job不能使用Always
   containers:
   - name: busybox
     image: busybox
     imagePullPolicy: IfNotPresent
     args:
     - /bin/sh
     - -c
     - echo "test";sleep 3
kubectl apply -f job.yaml
kubectl get job
kubectl get po     #状态是complete,完成job后退出了
kubectl logs my_job-s2grt   #返回了test,说明echo "test"已经执行成功了。
restartPolicy:
  Never:不重启
  Always:总是重启,默认选项
  OnFailure:只有pod异常退出时,返回码非0就会重启
kubectl delete -f  job.yaml
然后将执行的echo “test” 命令改错,然后再启动
kubectl apply -f job.yaml
kubectl get job
kubectl get po -w  #状态complete之后
kubectl logs my_job-s2grt  #返回的是/bin/sh找不到这条命令
如果将echo改错,然后取消sleep 3
kubectl get po -w   #会发现一直在生成pod,但是状态是Error
kubectl logs my_job-swe2sd   #返回的是/bin/sh找不到这条命令
kubectl get po    #一直在出现创建pod的情况
在job失败的时候会出现大量的pod,为什么会发生这样的情况呢?
因为job的期望完成值是1,但是由于job的内部错误,导致永远无法完成该job任务,且由于重启的策略是Never,所以job会不断生成新的pod
去努力试图完成这个job任务。
要删除直接使用kubectl delete -f job.yaml
当你的重启策略为OnFailure的时候,这个时候job会不断重启一个pod来满足自己的期望完成值。
如果你再查看的pod的状态:kubectl get po ,它的restarts会一直不断增加。
job不能使用Always,如果将重启策略设为always,kubectl apply -f job.yaml 会报出不支持的错误。
parallelism:运行pod的时候,最大的期望pod运行数,只有再剩下的pod数小于最大期望运行数量的时候才会运行少于最大值,其他均以最大值去运行。
vim job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
 name:my-job
spec:
 parallelism: 2
 template:
  spec:
   restartPolicy: Nerver
   containers:
   - name: busybox
     image: busybox
     imagePullPolicy: IfNotPresent
     args:
     - /bin/sh
     - -c
     - echo "test"
kubectl apply -f job1.yaml
kubectl get po
还可以指定pod的运行数量:
apiVersion:batch/v1
kind: Job
metadata:
 name: my-job
spec:
 completions: 6
 parallelism: 2
 template:
  spec:
   restartPolicy: Nerver
   containers:
   - name: busybox
     image: busybox
     imagePullPolicy: IfNotPresent
     args:
     - /bin/sh
     - -c
     - echo "test"
   
kubectl apply -f job.yaml
kubectl get po    #发现同一时间是运行2个pod,一共完成6个。
 
yaml文件的自动生成
生成job的yaml文件:
kubectl create job job1 --image=busybox --dry-run -o yaml
kubectl create job job1 --image=busybox --dry-run -o yaml > job1.yaml
然后编辑这个文件做一些简单的修改即可。这是编写yaml文件的简单方法。
生成deploy的yaml文件:
kubectl create deploy deploy1 --image=busybox --dry-run -o yaml > deploy1.yaml
然后修改即可
kubectl get po -o yaml     #生成极为详细的yaml文件,在github上很多长的yaml文件就是这样生成修改的。
yaml文件的组成: apiVersion kind metadata spec
kubectl api-resources   #查看api的缩写
控制器daemonset
kubectl explain ds
vim ds.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
 name: myds
spec:
 template:
  metadata:
   labels:
    run: nginx
  spec:
   container:
   - name: nginx
     image: nginx
     imagePullPolicy: IfNotPresent
kubectl apply -f ds.yaml
kubectl get po -o wide     #daemonset 每个节点都运行了一个
控制器CJ
kubectl explain cj
vim cj.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
 name: mycj
spec:
 schedule: '* * * * *'
 jobTemplate:
  spec:
   template:
    spec:
     restartPolicy: OnFailure
     containers:
     - name: busybox
       image: busybox
       iamgePullPolicy: IfNotPresent
       args:
       - /bin/sh
       - -c
       - echo "test"
kubectl apply -f cj.yaml
kubectl get cj
kubectl get po -o wide  #相应的pod每分钟启动一次
kubectl logs mycj-215123546-wert12    #返回test
 
svc外网访问pod
外网访问pod实际上是通过service,外网通过service的ip,service通过标签选择器来找到其对用的pod,报文的转发是通过kube-proxy
要运行svc首先要运行deploy
vim svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: deploy1
spec:
 replicas: 2
 selector:
  matchLabels:
   name: ken
 template:
  metadata:
   labels:
    name:ken
  spec:
   containers:
   - image: nginx
     name: nginx
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 80   #加上这条信息相当于Expose
    
kubectl get po -o wide   #这个时候能够看到pod的ip,但是只能集群内部访问
kubectl get ns     #查看namespace
kubectl explain svc
 
apiVersion: apps/v1
kind: Deployment
metadata:
 name: deploy1
spec:
 replicas: 2
 selector:
  matchLabels:
   name: ken
 template:
  metadata:
   labels:
    name:ken
  spec:
   containers:
   - image: nginx
     name: nginx
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
 name: mysvc
spec:
 selector:
  name: ken
 ports:
 - port: 80    #svc的端口
   targetPort: 80  #pod的端口
  
kubectl apply -f svc.yaml
kubectl get po -o wide
kubectl get svc    #可以查看到svc的ip以及映射到的host主机的端口在30000以上
kubectl describe svc mysvc   #可以查看到svc自己的ip,以及pod的endpoints(ip+port)
现在访问host的ip+映射的端口即可访问pod
也可以自己定义映射的端口,但是要在30000以上:
---
apiVersion: v1
kind: Service
metadata:
 name: mysvc
spec:
 type: NodePort
 selector:
  name: ken
 ports:
 - port: 80
   targetPort: 80
   nodePort: 30002
  
kubectl apply -f svc.yaml
kubectl get svc    #发现host的端口映射已经被更改为30002
 

Kubernetes——YAML文件的更多相关文章

  1. Kubernetes YAML 文件全字段详解

    Kubernetes YAML 文件全字段详解 Deployment yaml 其中主要参数都在podTemplate 中,DaemonSet StatefulSet 中的pod部分一样. apiVe ...

  2. [Kubernetes]yaml文件详解

    应前一段时间夸下的海口:[Kubernetes]如何使用yaml文件使得可以向外暴露服务,说过要写一篇关于yaml文件详解的文章出来的,今天来总结一下.yaml文件用在很多地方,但是这里以介绍在Kub ...

  3. 入门Kubernetes - YAML文件

    前言 前篇文章中简单了解到如何把.Net Core 程序部署到k8s中,过程中使用了多个*.yaml文件,那么这些文件的格式及含义.语法是如何的呢? 接下来,进一步了解学习 一.YAML介绍: 1.简 ...

  4. Docker Kubernetes YAML文件常用指令

    YAML文件常用指令 配置文件说明: 定义配置时,指定最新稳定版API(当前为v1). 配置文件应该存储在集群之外的版本控制仓库中.如果需要,可以快速回滚配置.重新创建和恢复. 应该使用YAML格式编 ...

  5. Kubernetes (yaml 文件详解)

    # yaml格式的pod定义文件完整内容:apiVersion: v1       #必选,版本号,例如v1kind: Pod       #必选,Podmetadata:       #必选,元数据 ...

  6. kubernetes yaml格式的Pod配置文件

    kubernetes yaml文件解析 # yaml格式的pod定义文件完整内容: apiVersion: v1 #必选,版本号,例如v1 kind: Pod #必选,Pod metadata: #必 ...

  7. 验证Kubernetes YAML的最佳实践和策略

    本文来自Rancher Labs Kubernetes工作负载最常见的定义是YAML格式的文件.使用YAML所面临的挑战之一是,它相当难以表达manifest文件之间的约束或关系. 如果你想检查所有部 ...

  8. Kubernetes YAML最佳实践和策略

    Kubernetes工作负载最常用YAML格式的文件来定义. YAML的问题之一就是很难描述清单文件之间的约束或关系. 如果你希望检查是否已从受信任的注册表中提取部署到群集中的所有映像,该怎么办? 如 ...

  9. [Kubernetes]如何使用yaml文件使得可以向外暴露服务

    最近因为项目需要上线,所以这段时间都扑到了Kubernetes上面. 昨天老大交代了一个任务,大概就是这样的: 看起来挺简单的,因为相关文件都给我了,我以为直接把文件拖上去,然后在访问ip:port方 ...

随机推荐

  1. centos 6.5 编译安装glibc 2.14(附带中文乱码修正方案)

    重要说明:glibc 是linux底层的c库,对系统而言是相当重要的,大部分软件的运行都会调用这个库.    ====   所以没有特殊需求不建议升级 升级后,此前通过源代码编译的软件运行可能出各种错 ...

  2. Django框架之模板路径及静态文件路径配置

    内容: (1)模板文件路径的配置 (2)静态文件路径的配置 一.模板文件路径的配置 模板文件主要通过jinja2模板进行渲染html页面,实现动态页面. 步骤一:创建一个template的文件夹,用于 ...

  3. ASA防火墙忘记密码之后的恢复步骤

    ASA的密码恢复方法与路由器相似,修改配置寄存器的值,启动时绕过startup-config配置文件,重新配置密码. 密码恢复的步骤如下: (1)重新插拔电源线,重启ASA (2)按ESC键或Ctrl ...

  4. 洛谷P1164小A点菜(01背包)

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  5. Jedis实现频道的订阅,取消订阅

     第一步:创建一个发布者 package work; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; i ...

  6. Android读取权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <use ...

  7. nyoj 34

    题目:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=34 思路:第一种方法是枚举10~100进行计算判断,第二种方法是孙子定理,最近正好学了一 ...

  8. MATLAB的安装与入门

    最近安装了MATLAB来用,过程遇到很多问题,担心自己改天如果换电脑了就忘记一些安装问题,所以记录一个. 首先是资源问题,我在贴吧找到了好心人分享的破解资源(非常感谢好心人的资源(ง •_•)ง),然 ...

  9. python开发接口

    享一段代码,开发了3个接口:            1.上传文件            2.查看所有文件            3.下载文件 使用python开发,需要安装flask模块,使用pip ...

  10. Re库的基本使用

    # Re库的主要功能函数 """ re.search() 在一个字符串中搜索匹配正则表达式的第一个位置, 返回match对象 re.match() 在一个字符串的开始位置 ...