K8s创建资源的两种方法实例

目录
  • 前言
  • kubectl run
  • kubectl kubectl create/apply
  • kubectl create 与 kubectl apply
    • create
    • apply
  • 总结

前言

在 K8s 中,创建资源有两种方式:

  • 直接使用 kubectl run 命令创建
  • 使用 kubectl create/apply 命令从 YAML 文件创建

在本文中,我将通过示例解释这两种方法,以及它们分别应该在何时使用。

kubectl run

kubectl run 命令在 pod 中创建并运行特定的镜像。例如:

$ kubectl run nginx --image=nginx --port 80
pod/nginx created
$ kubectl get po nginx
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          25s

如果您对这个新 pod 执行 kubectl describe 命令,您将看到:

$ kubectl describe po nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         ip-10-0-0-146.ec2.internal/10.0.0.146
Start Time:   Sat, 09 Apr 2022 16:56:29 -0400
Labels:       run=nginx
Annotations:  kubernetes.io/psp: eks.privileged
Status:       Running
IP:           10.0.0.69
IPs:
  IP:  10.0.0.69

请注意,Labels 是 run=nginx。

您还可以在 run 命令中指定环境变量,例如:

$ kubectl run nginx --image=nginx --port 80 --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"

如果您现在执行 kubectl describe nginx,就可以看到我们刚刚提供的新环境变量:

$ kubectl describe po nginx | grep "Env" -A2
    Environment:
      DNS_DOMAIN:     cluster
      POD_NAMESPACE:  default

通常,kubectl run 命令用于一些简单、直观和快速的任务,它适用于 ad-hoc(点对点网络模式)的测试或实验。

kubectl kubectl create/apply

kubectl create/apply 命令基于给定的配置文件。该配置文件具有以下特点:

  1. 配置文件描述了应用程序最终将达到的 Whatstate。
  2. 配置文件提供创建资源的模板,可以重复部署。
  3. 部署可以像代码一样进行管理。
  4. 适用于正式的、跨环境的、大规模的部署。
  5. 需要熟悉配置文件的语法才能使用此方法。

让我们再看一个例子。我们将创建相同的 nginx pod,这一次,让我们通过 YAML 文件来完成:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
        - containerPort: 80

不用在意 Deployment 文件语法,我将在另一篇文章中讨论 K8s Deployment。

让我们使用 kubectl create 命令来创建资源:

$ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx created
$ kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-k7tfl   1/1     Running   0          5s
$ kubectl delete -f nginx-deployment.yaml
deployment.apps "nginx" deleted

您还可以使用 kubectl apply 命令:

$ kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx created
$ kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-2fsxk   1/1     Running   0          17s
$ kubectl delete -f nginx-deployment.yaml
deployment.apps "nginx" deleted

可以看到,create 和 apply 命令都可以用来创建资源,但是二者有什么区别呢?

kubectl create 与 kubectl apply

让我们谈谈 create 和 apply 之间的区别。

create

此命令将告诉 K8s API 服务器,您要创建、删除或替换一个或多个资源。以更简化的方式,这意味着您可以从头开始创建一个全新的对象。或者,它通过定义需求对任何现有对象进行一些更改。

apply

此命令意味着通过在给定的 YAML 文件中声明您确切需要的内容来更改已经存在的对象。

为了演示,让我们使用 nginx Deployment 文件。首先,让我们创建资源:

$ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx created

现在,假设我们要向 pod 添加一个 label,将 label 更新为:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
    env: prod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        env: prod
    spec:
      containers:
        - name: nginx
          image: nginx

如果再次运行 create 命令:

$ kubectl create -f nginx-deployment.yaml
Error from server (AlreadyExists): error when creating "nginx-deployment.yaml": deployments.apps "nginx" already exists

即使 YAML 文件略有不同,您也会收到 “nginx” 已存在的错误。

那如果你运行 kubectl apply 呢?让我们试一试:

$ kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx configured

现在让我们描述一下资源:

$ kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-595f565474-zkl4t   1/1     Running   0          3m39s
$ kubectl describe po nginx-595f565474-zkl4t
Name:         nginx-595f565474-zkl4t
Namespace:    default
Priority:     0
Node:         ip-10-0-0-146.ec2.internal/10.0.0.146
Start Time:   Sat, 09 Apr 2022 17:20:04 -0400
Labels:       app=nginx
              env=prod
              pod-template-hash=595f565474

您可以看到应用了新的 labels 是 env=prod。

现在我们了解了 kubectl create 和 kubectl apply 之间的区别,您可能想知道应该使用哪一个?

在 kubectl create 命令中,我们指定了一个特定行为,也就是 create,因此它是一种更具命令式的方法。在 kubectl apply 命令中,我们指定系统的目标状态,而不指定一个特定的行为,因此它是更具声明性的方法。我们让系统决定采取什么行动。如果资源不存在,它将创建它,如果资源存在,则它将配置应用于现有资源。

简单来说,如果对单个文件运行一个操作来创建资源,create 和 apply 基本是相同的。但是,apply 允许您在一个目录中的多个文件上同时创建和修补。

总结

到此这篇关于K8s创建资源的文章就介绍到这了,更多相关K8s创建资源内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • kubernetes(k8s)安装metrics-server实现资源使用情况监控方式详解

    1. Metrics Server 与 kubenetes版本 Metrics Server    Metrics API group/version    Supported Kubernetes version0.6x    metrics.k8s.io/v1beta1    *1.19+0.5x    metrics.k8s.io/v1beta1    *1.8+0.4x    metrics.k8s.io/v1beta1    *1.8+0.3x    metrics.k8s.io/v1

  • K8s创建资源的两种方法实例

    目录 前言 kubectl run kubectl kubectl create/apply kubectl create 与 kubectl apply create apply 总结 前言 在 K8s 中,创建资源有两种方式: 直接使用 kubectl run 命令创建 使用 kubectl create/apply 命令从 YAML 文件创建 在本文中,我将通过示例解释这两种方法,以及它们分别应该在何时使用. kubectl run kubectl run 命令在 pod 中创建并运行特定

  • 在python中创建表格的两种方法实例

    目录 日常拉呱: 创建表格一般有两种方法: 一:通过导入xlwt创建 二:通过导入csv库来创建 1.写入数据 2.读取数据 总结 日常拉呱: 最近在学习爬虫模拟登陆各个软件,老师留有作业,模拟登录京东并爬取系列物品,可惜我还是个小白菜鸟,还是处于迷迷糊糊的状态,只能先了解一下边缘知识.爬取完数据,你是否在纠结这些数据放在哪呢?建一个表格或许会帮助到你! 创建表格一般有两种方法: 一:通过导入xlwt来创建,这种方法我比较喜欢,因为它够直观够容易理解,但是相对而言比较麻烦. 二:通过导入csv库

  • MySQL创建数据库的两种方法

    本文为大家分享了两种MySQL创建数据库的方法,供大家参考,具体内容如下 第一种方法:使用 mysqladmin 创建数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库. 实例 以下命令简单的演示了创建数据库的过程,数据名为 TUTORIALS: [root@host]# mysqladmin -u root -p create TUTORIALS

  • Android 中Popwindow弹出菜单的两种方法实例

    Android 中Popwindow弹出菜单的两种方法实例 1.popWindow就是对话框的一种方式! 此文讲解的android中对话框的一种使用方式,它叫popWindow. 2.popWindow的特性 Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于: AlertDialog的位置固定,而PopupWindow的位置可以随意. AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的. PopupWindow的位置按照有无偏

  • vue 动态创建组件的两种方法

    Vue动态创建组件实例并挂载到body 方式一 import Vue from 'vue' /** * @param Component 组件实例的选项对象 * @param props 组件实例中的prop */ export function create(Component, props) { const comp = new (Vue.extend(Component))({ propsData: props }).$mount() document.body.appendChild(c

  • IOS自带Email的两种方法实例详解

    IOS自带Email的两种方法实例详解 IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController.借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能. 1.openURL 使用openURL调用系统邮箱客户端是我们在IOS3.0以下实现发邮件功能的主要手段.我们可以通过设置url里的相关参数来指定邮件的内容,不过其缺点很明显,这样的过程会导致程序暂时退出.下面是使用openURL来发邮件的一个小例子: #pr

  • JS创建事件的三种方法(实例代码)

    1.普通的定义方式 <input type="button" name="Button" value="确定" onclick="Sfont=prompt('请在文本框中输入红色','红色',' 提示框 '); if(Sfont=='红色'){ form1.style.fontFamily='黑体'; form1.style.color='red'; }" /> 这是最常见的一种定义方式,直接将JS事件定义在需要的

  • Javascript使用function创建类的两种方法(推荐)

    1.使用function类 //myFunction.js var CMyFunc=function() { //类的公共方法,供外部调用 this.Func1=function() { var i=0; return i; } this.Func2=function() { _privateFunc(); } //类中的私有方法,供公共方法调用 function _privateFunc() { return 0; ] } CMyFunc myFunc=new CMyFunc(); 使用:其它

  • 浅析JS动态创建元素【两种方法】

    前言: 创建元素有两种方法 1)将需要创建的元素,以字符串的形式拼接:找到父级元素,直接对父级元素的innnerHTML进行赋值. 2)使用Document.Element对象自带的一些函数,来实现动态创建元素(创建元素 => 找到父级元素 => 在指定位置插入元素) 一.字符串拼接形式 为了更好的理解,设定一个应用场景. 随机生成一组数字,将这组数据渲染为条形图的形式,放在div[id="container"]中,如下图 <div id="containe

  • JS动态创建元素的两种方法

    本文为大家分享了js创建元素的两种方法供大家参考,具体内容如下 1)将需要创建的元素,以字符串的形式拼接:找到父级元素,直接对父级元素的innnerHTML进行赋值. 2)使用Document.Element对象自带的一些函数,来实现动态创建元素(创建元素 => 找到父级元素 => 在指定位置插入元素) 一.字符串拼接形式 为了更好的理解,设定一个应用场景. 随机生成一组数字,将这组数据渲染为条形图的形式,放在div[id="container"]中,如下图 <div

随机推荐