k8s安装完后, kubectl这个工具可以很方便地让我们操作k8s。。

但其实一旦用于大规模部署, kubectl 就不那么方便了. 这时我们需要用资源编排文件(Resource Orchestration)来实现组合和批量操作。

在k8s 中, 一般使用yaml格式的资源编排文件来创建我们预期期望的pod



1. 资源编排文件 部分

一般情况下, 我们可以把资源编排文件划分为

  1. 控制器定义
  2. 被控制对象

例子:


---
### 控制器定义
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matcheLables:
      app: nginx

### 被控制对象
template:
  metadata:
    lables:
      app: ngnix
  spec:
    contianers:
      - name: nginx:
        images: nginx: latest
        ports: 8010

---



2. 资源编排文件 常用字段



2.0 字段大纲
Parameter NameDescription
apiVersionapi 版本
kind资源类型
metadata资源元数据
spec资源规格
replicas副本数量
selector标签选择器
templatePod模板
containers容器配置



2.1 必须存在的属性
Parameter NameTypeDescription
versionStringK8S API的版本, 目前基本上是v1, 可以用kubectl api-version来查看
kindString种类, 这里是值 yaml文件定义的资源类型和角色, 比如: pod
可用kubectl api-resources 查看所欲kind类型
metadataObject元数据对象
metadata.nameString元数据对象的名字, 这里由我们编写, 例如命名pod的名字
metadata.namespaceString元数据对象所属的命名空间
specObject详细定义对象
spec.container[]list定义对象的容器列表, 是个列表
spec.container[].nameString定义某个容器的名字



2.2 spec 主要对象
Parameter NameTypeDescription
spec.container[].imageString定义某个容器的所用镜像名称
spec.container[].imagePullPolicyString定义拉取镜像的策略.
1.Always: 每次都尝试从远程仓库拉取。
2. Never: 表示只从本地拉取镜像。
3. ifNotPresent: 如果本地有该镜像就本地拉取镜像, 否则从远程拉取镜像.
默认是Always
spec.container[].command[]List指定容器的启动命令,可以有多个,不指定则使用镜像打包时指定的命令
spec.container[].args[]List指定容器的启动命令参数, 可以有多个
spec.container[].workingDirString指定容器的工作目录
spec.container[].VolumnMounts[]List指定容器的存储卷配置
spec.container[].VolumnMounts[].nameString指定容器的某个存储卷名称
spec.container[].VolumnMounts[].mountPathString指定容器的某个存储卷挂载路径
spec.container[].VolumnMounts[].readOnlyString指定容器的某个存储卷是否是只读, true of false, 默认是true(只读)
spec.container[].ports[]List指定容器要用到的端口列表
spec.container[].ports[].namestring指定容器要端口名字,端口还有名字?
spec.container[].ports[].containerPortstring指定容器用到的端口要监听的容器内部端口(mapping)
spec.container[].ports[].hostPortstring指定容器用到的端口要鉴听的所在主机部端口(mapping),默认与前者相同
spec.container[].ports[].protocolstring指定端口协议, 支持TCP和UDP, 默认TCP
spec.container[].env[]List制定环境变量列表
spec.container[].env[].namestring指定环境变量名称
spec.container[].env[].valuestring指定环境变量的值
spec.container[].resourceObject指定资源限制和资源请求的值
spec.container[].resource.limitsObject指定容器运行时资源运行上限
spec.container[].resource.cpuInteger指定容器运行时能用到的cpu核心个数
spec.container[].resource.memoryString指定容器运行时能用到的内存大小, 单位为MB GB
spec.container[].resource.cpuInteger指定容器运行时能用到的cpu核心个数
spec.container[].resource.requestsObject指定容器启动和调度室的限制设置
spec.container[].resource.requests.cpuInteger容器启动初始化时能用到的cpu core个数
spec.container[].resource.requests.memoryInteger容器启动初始化时能用到的大小



2.3 额外的参数
Parameter NameTypeDescription
spec.restartPolicyString定义Pod的重启策略
1. Always: Pod 一旦终止运行,Kubelet就会重启它
2. OnFailure: 只有POD 以非0代码退出时,Kubelet 才会尝试重启
3. Never 无论POD是如何终止运行, 都不会被尝试重启
spec.nodeSelectorObject定义Node的Label过滤标签, 以key:value 格式指定
spec.imagePullSecretsObject定义pull 镜像是用secret的名称, 以name: secretkey格式指定
spec.hostNetworkboolean是否使用主机网络模式, 默认是false, 设置true表示使用宿主机网络, 不适用docker 网桥, 同时设置了true则无法在同一台宿主机上启动第二个副本



3. 快速编写1个yaml文件

如果从零开始手撕1个yaml文件, 相当困难。



3.1 使用 kubectl create 命令生成yaml文件

例子:

# pod1 是资源名字
kubectl create deployment pod1 --image=nginx -o yaml --dry-run > pod1.yaml

一旦加入 -o yaml 参数, 则kubectl create deployment 命令并不会真正执行, 而是生成1个yaml 文件。让我们可以后续基于这个yaml来创建pod

–dry-run 表示kubectl去尝试去执行这个yaml文件, 但执行完 会清空资源
某个版本后, kubectl建议用–dry-run=client 来代替 --dry-run

在这里插入图片描述
然后我们可以基于这个生成的模板再修改



3.2 使用kubectl get 命令从已部署的资源中导出yaml文件

先用

kubectl get deploy

命令查看当前的集群部署了什么东西

gateman@k8smaster:~/yamls$ kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           13d
gateman@k8smaster:~/yamls$ 

可以见到里面已经有了1个nginx的部署

然后我们用

kubectl get deploy podname -o yaml > podname.yaml

命令来得到yaml文件

gateman@k8smaster:~/yamls$ kubectl get deploy nginx -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2022-10-22T14:03:45Z"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
  resourceVersion: "372980"
  uid: b7a0d2f1-a49f-4681-a85c-10dfa9fed809
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2022-10-22T14:03:45Z"
    lastUpdateTime: "2022-10-22T14:04:03Z"
    message: ReplicaSet "nginx-6799fc88d8" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  - lastTransitionTime: "2022-10-25T12:40:15Z"
    lastUpdateTime: "2022-10-25T12:40:15Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐