Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >跟着Kubernetes学设计—声明式or命令式

跟着Kubernetes学设计—声明式or命令式

作者头像
tunsuy
发布于 2023-09-20 00:43:29
发布于 2023-09-20 00:43:29
15900
代码可运行
举报
运行总次数:0
代码可运行

我们知道k8s是基于声明式设计的系统,我们只管告诉k8s我们想要达到的系统状态,至于怎么达到,是k8s自身需要处理的事情,比如下面的yaml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

当然k8s也支持命令式的交互动作,比如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 创建
$ kubectl create -f nginx.yaml
// 修改后更新
$ kubectl replace -f nginx.yaml

Kubernetes 通过声明式方式实现的 Controller,每个组件都只需要和 ETCD 这样的状态中心交互,完成自己的任务后把状态更新到 ETCD 中即可。如果失败则反复重试,直到失败条件解除。虽然任务的完成时间不可控,但可达到最终一致。

声明式方式增加了复杂性,对于开发来说可能更难调试,而使用命令式模型,所见即所得,你所想要达到的效果就是程序命令执行完成的样子,除非发生错误。

有的人说,越接近现实的表达就叫越“声明式”(declarative),越接近计算机的执行过程就叫越“命令式”(imperative),这个比较形象。

越是声明式,意味着下层要做更多的东西,或者说能力越强。也意味着效率的损失。越是命令式,意味着上层对下层有更多的操作空间,可以按照自己特定的需求要求下层按照某种方式来处理。

声明式(declarative)是结果导向的,命令式(imperative)是过程导向的。它们都有自己适用的场景和局限,其实在我们的日常使用的编程语言中,或多或少都有两者的身影。

显然,声明式语言对用户更友好,用户可以关心更少的细节。更重要的是:它允许多种底层实现方式,保持目标不变的同时不断优化。

而命令式的好处自然是它的表达能力了,图灵完备的语言可以表达任何的可计算问题。

更极端一点,所有的 DSL (HTML, XML, SQL) 都是声明式的,你写出一条 SQL 语句,只是为了告诉数据库你要什么,然后数据库就会给你对应的数据,而不是通过数据库的 API 去取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM Test WHERE name='ts'

正如我之前文章里面介绍的 GraphQL,也是声明式的, 因为它把网络请求变得声明式了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
query {
	posts {
		id, title, content
  }
}

使用过java语言的,不知道有没有一种体会,Java 8 增加了 Lambda 表达式这一新特性,允许我们以函数式风格进行编程,所以Java 也算是一种命令式与声明式混合风格的编程语言了,但需要注意的是函数式编程只是声明式编程的一个子集

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-10 12:08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有文化的技术人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes整理
一般做法:容器A共享容器B$ docker run --net=B --volumes-from=B --name=A image-A ...,这种做法会存在一个问题,容器AB的关系从对等变成了拓扑。
铭丶
2021/03/12
7430
Argo CD 实践教程 01
在本章中,我们将看看什么是GitOps,以及这个想法在 Kubernetes集群中如何有意义。我们将介绍特定的组件,例如应用程序编程接口(API)服务器和控制器管理器,它们可以使集群对状态更改做出反应。我们将从命令式API开始,然后浏览声明式API,并将看到如何应用文件和文件夹来应用Git存储库只是一个步骤——当执行它时,GitOps出现了。 我们将在本章中介绍以下主要主题:
拿我格子衫来
2023/08/24
3590
Argo CD 实践教程 01
【云原生 | Kubernetes篇】深入Kubernetes(k8s)概念(四)
可以使用 kubectl 命令行创建对象,也可以编写 .yaml 格式的文件进行创建
Lansonli
2022/06/07
1.3K0
【云原生 | Kubernetes篇】深入Kubernetes(k8s)概念(四)
Kubernetes 笔记 08 Deployment 副本管理
Deployment 是 K8S v1.2 引入的概念,与之一起引入还有 ReplicaSet。这两个概念是等同的,准确说是 Deployment 内部调用 ReplicaSet 来实现。
Linux云计算网络
2019/05/25
1.6K0
Kubernetes基本概念
在k8s中最常见的就是yaml文件了,通过一个简单的yaml文件我们就可以完成80%的功能,现在我们来编写一个简单的yaml文件nginx.yaml来启动一个nginx服务:
Java学习录
2019/04/18
4430
Kubernetes 笔记 05 yaml 配置文件详解
生活中,随处可见,几乎每一款产品都会附带一份说明书,说明书可以记录产品的使用方法,也可以记录产品的配方。有了说明书,我们完全可以窥探一款产品的全貌。
Linux云计算网络
2019/05/25
2.2K0
k8s--资源控制器
Kubernetes中内建了很多controller (控制器) ,这些相当于一个状态机,用来控制Pod的具体状态和行为
eadela
2019/12/11
7980
Kubernetes入门培训
"本文主要从docker、docker-compose由浅到深介绍了Kubernetes核心功能,关注回复【ppt】获得演示文稿"
用户5166556
2020/06/15
6.1K138
Kubernetes 资源控制器使用指南
资源配额控制器确保了指定的资源对象始终不会超过配置的资源,能够有效的降低整个系统宕机的机率,增强系统的鲁棒性,对整个集群的稳定性有非常重要的作用。
民工哥
2021/04/21
1.7K0
ubuntu20.04升级k8s集群,etcd备份恢复,k8s集群使用
5.资源对象 rc/rs/deployment、 service、 volume、 emptyDir、 hostpath、 NFS
conanma
2022/03/17
1.5K0
5-Kubernetes入门基础之控制器Controller介绍
[toc] 0x00 Controller 介绍 Q: 什么是资源控制器(资源控制器介绍)? 答:Kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制Pod的
全栈工程师修炼指南
2022/09/29
1.9K0
5-Kubernetes入门基础之控制器Controller介绍
K8s上部署Go服务
通过Rancher一键部署k8s服务 地址: https://rancher.com/quick-start/ 命令 sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher 然后访问你的docker机器的IP地址就可以看到一个叫local的k8s环境,不过不知道是不是我操作不对,我不能使用这个集群 点击添加集群,自定义一通默认到最后给你一个docker命令执行后我们就又得到
conanma
2022/03/17
8570
深入k8s:k8s部署&在k8s中运行第一个程序
由于在国内网络问题,我们无法很好的使用minikube进行部署k8s实验环境,所以可以使用阿里提供的minikube进行搭建。除了minikube,也可以使用kubeasz进行部署。
luozhiyun
2020/07/22
3.2K0
容器编排引擎Kubernetes 07——Deployment介绍及使用
Deployment 是 k8s 中管理发布的控制器,k8s 从v1.2开始就引入了 Deployment 控制器,Deployment 控制器并不直接管理 pod,而是通过管理 ReplicaSet 来间接管理 pod,即:Deployment 管理 ReplicaSet, ReplicaSet 管理 pod。所以 Deployment 比 ReplicaSet 的功能更加强大。
用户8100582
2024/01/27
5530
Kubernetes 入门
通过 《容器集群管理工具 Docker Swarm》可以知道,在部署、调度、扩展和管理较多的容器时,如果有一个工具帮忙做这些事,那无疑会大大提高工作效率了。
王二蛋
2024/05/05
1580
自建 Kubernetes 上运行容器
Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器(虽然 Kubernetes 项目也支持这种方式,比如:kubectl run),而是希望你用 YAML 文件的方式,即:把容器的定义、参数、配置,统统记录在一个 YAML 文件中,然后用这样一句指令把它运行起来:
星哥玩云
2022/08/08
4010
声明式Api及其实际应用
这篇文章, 我将按照自己的理解结合我阅读过的文章给大家讲讲关于声明式API这个概念
用户11097514
2024/07/28
2280
声明式Api及其实际应用
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用
863987322
2018/03/29
5K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
Kubernetes(四) - Pod和Deployment
Kubernetes中有各种各样的组件,对于容器来说Kubernetes最小的单元是由Pod进行组成的,但是我们在使用过程中经常会使用到Deployment来部署我们的应用,其中究竟区别在哪里,我们今天就来一同探索
喵了个咪233
2022/03/24
5040
Kubernetes折腾记:部署应用
前面我们分享了集群的集群,现在我们来折腾一下应用的部署。k8s部署应用相对比较简单,一个yaml文件即可搞定。但是想要理解这个yaml文件,就需要先了解k8s中的两个概念:deployment和pod。
yaxin
2021/01/30
1.2K1
Kubernetes折腾记:部署应用
相关推荐
Kubernetes整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验