Kubernetes:全面了解 Deployment

2023-11-11

本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址:

https://k8s.whuanle.cn【适合国内访问】

https://ek8s.whuanle.cn 【gitbook】

Deployment 是 Kubernetes 提供的一种自我修复机制来解决机器故障维护的问题。前面提到了单独部署 Pod,但是这种方式只适合临时的 Pod,用于测试调试。如果要用于生产,则需要 Deployment 等控制器管理部署 Pod,维护 Pod 的副本数量以及 Pod 监控和维护。

对于 Kubernetes 对象的部署,例如 Pod、Deployment、Service 等,有三种部署方式:

  • Using Generators (Run, Expose)

  • Using Imperative way (Create)

  • Using Declarative way (Apply)

在 2.1 章中,我们已经学习了 Run 和 apply 等,在本篇以及后面的章节中,我们会一步步深入学习这些部署方式。

本篇包含或需要掌握以下内容:

  • 创建 Deployment

  • 修改 Deployment

  • 查看 Deployment 、Pod、Services、副本

在本篇文章中,我们将部署一个 Nginx 实例,并学会 部署以及管理 Deployment、Pod。

Deployment

当我们单独使用 docker 部署应用时,为了应用挂了后能够重启,我们可以使用 --restart=always 参数,例如:

docker run -itd --restart=always -p 666:80 nginx:latest

但是这种方式只能单纯重启容器,并不具备从机器故障中恢复的能力,即当一台服务器挂了后,此服务器上所有的容器全部挂掉。

Kubernetes Deployment 是一种 Pod 管理方式,它可以指挥 Kubernetes 如何创建和更新你部署的应用实例,创建 Deployment 后,Kubernetes master 会将应用程序调度到集群中的各个节点上。Kubernetes Deployment 提供了一种与众不同的应用程序管理方法。

Deployment 的创建,有两种方法,一种是直接使用命令创建(kubectl create),一种是通过 YAML(kubectl apply),后面我们会介绍这两种创建方法。

创建 Deployment

在 Kubernetes 中,Pod 是调度的最小单位,一个 Pod 中包含多个 容器,所以我们的各种操作都是在 Pod 之上。

我们来使用 deployment 部署一个 Pod,这个 Pod 包含一个 Nginx 容器。

kubectl create deployment nginx --image=nginx:latest

格式:

kubectl create deployment {deployment对象名称} --images={镜像名称和标签}

此时,nginx 容器会以 Pod 的方式部署到节点中,但是被部署到哪个节点是随机的,如果你只有一个 worker 节点,则 Pod 必定在这个 Worker 节点上。当然,我们可以获取到具体的调度信息,从中查看 Pod 被调度到哪个节点。

root@instance-1:~# kubectl get deployments -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx   1/1     1            1           52s   nginx        nginx:latest   app=nginx
root@instance-1:~# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
nginx-55649fd747-s4824   1/1     Running   0          61s   192.168.56.4   instance-2   <none>           <none>

可以看到, Pod 在 instance-2 中运行着。

Deployment 会为我们自动创建 Pod,Pod 由 {deployment名称}-{随机名称} 组成。

[Info] 提示

还有一个地方也说一下,kubectl get xxx 时,带不带 s 都没关系,例如 kubectl get nodes / kubectl get node 都是一样的。

不过,一般从语义上,我们获取全部对象时,可以使用 kubectl get nodes,获取具体的对象时,可以使用 kubectl get node nginx。类似的,kubectl describe nodes 、kubectl describe node nginx。实际上加不加 s 都一样。

kubectl apply/create

当我们创建一个 deployment 时,kubectl create 和 kubectl apply 效果是一样的,但是 apply 还具有更新(update) 的功能。

kubectl apply 会在以前的配置、提供的输入和资源的当前配置之间 找出三方差异,以确定如何修改资源,kubectl apply 命令将会把推送的版本与以前的版本进行比较,并应用你所做的更改, 但是不会自动覆盖任何你没有指定更改的属性

另外还有 kubectl replace 、kubectl editkubectl replace 是破坏性更新/替换,容易导致问题;kubectl edit 可以更新 Deployment 等已存在的对象。

根据 Kubernetes 官方的文档说明,应始终使用 kubectl apply 或 kubectl create --save-config 创建资源。

前面已经学习了 kubectl create,这里学习一下 kubectl apply

通过 YAML 文件部署 nginx:

kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml

很多开源软件提供了 YAML 文件,我们通过 YAML 文件可以快速部署服务,如 Redis、Consul 等。

这里再说一下创建 Deployment 的区别。

如果使用 create 创建,命令格式:

kubectl create deployment {deployment的名字} --image={镜像名称}

如果使用 apply 命令创建,YAML 中需要指定一些信息,可定制性很高。

kind: Deployment
... ...
medatada:
    name:nginx
... ...
    spec:
      containers:
      - image: nginx:latest

然后执行 kubectl apply -f xxx.yaml 文件。

一个是 kubectl create deployment ;另一个是 kubectl apply -f,在 yaml 中指定 kind: Deployment

如果我们只需要快速创建,使用命令形式就行;如何生产生产,还是得使用 YAML 文件,并于留存记录。

要删除一个对象,可以使用 kubectl delete -f {名称}.yaml,如删除 calico。

kubectl delete -f calico.yaml

检查 YAML

有时我们不知道我们的创建命令或 yaml 是否正确,可以使用 --dry-run=client ,--dry-run=client 参数来表示当前内容只是预览而不真正提交。

kubectl create deployment testnginx --image=nginx:latest --dry-run=client

在一些 k8s 认证中,我们没时间一点点写 yaml ,但是又需要定制,此时可以使用 --dry-run=client -o yaml ,既可以不生效 Deployment,又可以导出 yaml 文件。

[Info] 提示

-o wide 可以查看对象更多的字段信息;kubectl describe 可以查看对象的全部详细信息;-o yaml 或 -o json 可以查看对象的定义/描述文件。

--dry-run 取值必须为none、server或client。如果客户端策略,只打印将要发送的对象,而不发送它。如果是服务器策略,提交服务器端请求而不持久化资源。

命令示例如下:

kubectl create deployment testnginx --image=nginx:latest --dry-run=client -o yaml
# -o json 可以输出 json 格式

576b33edd081efb2ab23962001a4cb2c.png

使用这样的方法,可以快速获得需要的 YAML 模板,然后复制到 YAML 文件,根据需要改动、定制。除了 deployment,其它 kubernetes 对象也可以使用这种方法。

查看 Deployment

我们以 Deployment 的方式部署 Pod ,就会创建一个 Deployment 对象,获得 deployment 列表:

kubectl get deployments
kubectl get deployments -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           2m24s

NAME    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
nginx   1/1     1            1           2m42s   nginx        nginx:latest   app=nginx

在 kubectl get ... 后面加上 -o wide 可以获得更多的标签信息。

使用 kubectl get events 可以获得集群中最近发生的事件,如创建 Deployment 到部署容器过程的详细事件记录。

Successfully assigned default/nginx-55649fd747-wdrjj to instance-2
Pulling image "nginx:latest"
Successfully pulled image "nginx:latest" in 8.917597859s
Created container nginx
Started container nginx
Created pod: nginx-55649fd747-wdrjj
Scaled up replica set nginx-55649fd747 to 1

使用 kubectl describe deployment nginx 可以获得更加详细的信息,是各种信息的集合。

60439e8a5629ce8c5d61a28d9df0df64.png

查看 Pod

我们没有直接创建 Pod,而是通过 Deployment 创建,接下来我们需要了解如何查看 Pod 。

kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-55649fd747-msw8g   1/1     Running   0          4h16m

可以看到一个 Pod 名为 nginx- ,因为我们是利用 Deployment 部署 Pod 的,没有指定这个 Pod 的名称,所以默认 Pod 名称以 Deployment 名称为前缀。

我们查看这个 pods 被部署到了哪个节点上:

kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP              NODE         
nginx-55649fd747-msw8g   1/1     Running   0          4h19m   192.168.56.57   instance-2

可以看到,这个 Pod 在 instances-2 这个节点上,同时这个 Pod 也有一个 IP,Kubernetes 会为每个 Pod 分配一个唯一的 IP,这个 IP 可以在节点上访问,其它 Pod 也可以通过 IP 访问此 Pod。

由于这个 Pod 里面的容器是 Nginx(80端口),所以我们可以访问这个 IP 可以打开 Nginx 页面。

root@instance-1:~# curl 192.168.56.57
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
... ...

对于没有指定的 Deployment、Pod、Service 等对象,会默认分配到 default 命名空间中,我们在执行kubectl get {} 时,会获取 default 命名空间中的对象, 后面加上 --all-namespaces 可以获得所有命名空间中的对象,使用 --namespace= 可以指定获取某个命名空间中的对象。

kubectl get pods --all-namespaces
# kubectl get pods --namespace=default
NAMESPACE              NAME                                         READY   STATUS      RESTARTS   AGE
default                nginx-55649fd747-msw8g                       1/1     Running     0          4h28m
kube-system            etcd-instance-1                              1/1     Running     1          13d
kube-system            kube-apiserver-instance-1                    1/1     Running     1          13d
kube-system            kube-controller-manager-instance-1           1/1     Running     1          13d
kube-system            kube-proxy-bhj76                             1/1     Running     1          13d
kube-system            kube-proxy-pm597                             1/1     Running     0          13d
kube-system            kube-scheduler-instance-1                    1/1     Running     1          13d
kubernetes-dashboard   dashboard-metrics-scraper-856586f554-4nd9v   1/1     Running     1          13d
kubernetes-dashboard   kubernetes-dashboard-78c79f97b4-288js        1/1     Running     1          13d

在 worker 节点上执行 docker ps,可以看到 Nginx 容器:

root@instance-2:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
fe7433f906a0   nginx     "/docker-entrypoint.…"   7 seconds ago    Up 6 seconds              k8s_nginx_nginx-55649fd747-wdrjj_default_ea41dcc4-94fe-47f9-a804-5b5b1df703e9_0

实时修改

使用 kubectl edit 可以实时修改一个对象,这里我们使用前面已经部署好的 Nginx 这个 Deployment,因为创建的 Pod 名称有点长,我们希望直接改成 nginx。

修改 deployment:

kubectl edit pod nginx-55649fd747-msw8g

在 metadata 字段中,找到 name: nginx-55649fd747-msw8g ,修改为合适的名称。

修改完毕后,会提示:

A copy of your changes has been stored to "/tmp/kubectl-edit-w11bx.yaml"
error: At least one of apiVersion, kind and name was changed

出于某些原因,直接修改 name 字段是不行的,还需要修改其它地方。

这里读者了解,可以通过 kubectl edit 实时直接修改对象即可。后面还会介绍另一种修改方法。

导出 yaml

我们可以从已经创建的 Deployment 、Pod、Service 等对象导出 yaml 文件,使用 -o yaml 即可导出(-o json 导出json)。

kubectl get deployment nginx -o yaml
# 保存到文件
# kubectl get deployment nginx -o yaml > mynginx.yaml

然后终端会打印:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2021-04-21T00:37:13Z"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
... ...

虽然我们创建对象时的命令很简单,但是生成的 YAML 很复杂。

我们可以尝试把 yaml 导出到 mynginx.yaml 文件中,然后我们删除这个 Deployment。

kubectl get deployment nginx -o yaml > mynginx.yaml
kubectl delete deployment nginx

然后利用导出的 mynginx.yaml 再创建一个 Deployment。

kubectl apply -f mynginx.yaml

多个 容器

一个 Pod 中,是可以包含多个容器的,我们可以使用命令或 YAML 形式创建包含多个容器的 Pod 服务。示例如下:

root@master:~# kubectl create deployment testnginx --image=nginx:latest --image=busybox:latest --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: testnginx
  name: testnginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: testnginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: testnginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        resources: {}
      - image: busybox:latest
        name: busybox
        resources: {}
status: {}

总结

本小章中不只是讲解 Deployment,还包含了很多日常管理对象的命令,读者可多做练习,加深记忆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes:全面了解 Deployment 的相关文章

  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • 【C语言】三子棋游戏详解

    目录 一 三子棋的游戏规则 二 基本流程 三 实现步骤 3 1打印菜单 3 2 创建并初始化棋盘 3 3 打印棋盘 3 4 玩家落子 3 5 电脑落子 3 6 判断输赢 四 游戏演示 五 完整代码 一 三子棋的游戏规则 三子棋也就是经常玩的
  • 天猫精灵-土味情话

    1 你猜我想喝什么 不知道啊 我想呵护你 2 你为什么要害我呀 害你什么了 害我喜欢你呀 3
  • qt把ui文件加入到类中

    有一个ui界面 需要建立 cpp和 h文件 ui的名字是Ui Form 代码如下 h文件 pragma once include ui add1 h class Form1 public QWidget Q OBJECT public Fo
  • 以法律的名义捍卫自由软件的权益之二 —— 软件自由法律中心(SFLC)的来龙去脉...

    更多精彩推荐 请关注开源之道 Thu Apr 24 2020 7347 Words 大约需要阅读 2 分钟 作者 开源之道 在介绍完成以法律的名义捍卫自由软件的权益之一 软件自由保护组织 SFC 的来龙去脉 笔者觉得有点不足的地方 尽管基本
  • 使用docker和docker-compose搭建Vulhub漏洞测试靶场

    使用docker和docker compose搭建Vulhub漏洞测试靶场 1 安装Docker和docker compose docker安装步骤 docker compose安装步骤 2 下载vulhub 安装完成docker和dock
  • Arduino的传感器使用教程1:PM2.5、温度和大气压传感器

    来自我的个人网站 http wangbch com ARDUINO SENSOR Arduino Temperature PM2 5 Atmos Arduino测定温度 PM2 5以及大气压 Temperature Measure and
  • 猜字母

    猜字母 把abcd s共19个字母组成的序列重复拼接106次 得到长度为2014的串 接下来删除第1个字母 即开头的字母a 以及第3个 第5个等所有奇数位置的字母 得到的新串再进行删除奇数位置字母的动作 如此下去 最后只剩下一个字母 请写出
  • mongoDB介绍与客户端认证权限

    mongoDB简介 Mongo 是 humongous 的中间部分 在英文里是 巨大无比 的意思 所以 MongoDB 可以翻译成 巨大无比的数据库 更优雅的叫法是 海量数据库 Mongodb是一款非关系型数据库 说到非关系型数据库 区别于
  • State Hook

    State Hook State Hook是一个在函数组件中使用的函数 useState 用于在函数组件中使用状态 useState 函数有一个参数 这个参数的值表示状态的默认值 函数的返回值是一个数组 该数组一定包含两项 第一项 当前状态
  • 华为OD机试 - 数据最节约的备份方法(Java )

    题目描述 有若干个文件 使用刻录光盘的方式进行备份 假设每张光盘的容量是500MB 求使用光盘最少的文件分布方式 所有文件的大小都是整数的MB 且不超过500MB 文件不能分割 分卷打包 输入描述 一组文件大小的数据 输出描述 使用光盘的数
  • github/gitlab中的fork操作

    在git中 fork是 分叉 复制 的意思 fork可以复制出一个仓库的新拷贝 包含了原有库中的所有提交记录 fork后这个代码库是完全独立的 可以在自己的库中做任何修改 也可以向原来的库提交合并请求 git中fork是什么意思 githu
  • transition将鼠标悬停在一个div元素上,逐步改变表格的宽度从100px到300px::

  • Lock 接口与 synchronized 关键字的区别

    拷贝别的博主总结的9点不同 1 JDK版本不同 synchronized关键字产生于JKD1 5之前 是低版本保证共享资源同步访问的主要技术 Lock接口产生于JDK1 5版本 位于著名的java util concurrent并发包中 是
  • 2018年WiFi、5G和蓝牙的发展以及与VR/AR的联系

    52VR大幅修正了原译文的翻译错误并作润饰编辑 这份文章中涵盖对无线技术们在2018年的表现之期待 包括可能实现的时间 以及它们将可能会怎样影响AR VR的版图 首先我们展望一下 不得不说的是2018年将是很多技术大转折的一年 这其中包括手
  • delphi listview动态添加图片_Qml组件化编程4-i18n动态国际化

    简介 本文是 Qml组件化编程 系列文章的第四篇 涛哥将教大家 如何在Qml中实现动态国际化 i18n 是 internationalization 国际化 的首尾字符加中间的 18 个字符 随着产品越做越大 要推向国际的时候 国际化这一步
  • C语言指针详解

    C语言指针详解 字符指针 1 如何定义 2 类型和指向的内容 3 代码例子 指针数组 1 如何定义 2 类型和内容 数组指针 1 如何定义 2 类型和指向类型 3 数组名vs 数组名 数组指针运用 数组参数 指针参数 一维数组传参 二维数组
  • 多级页表的优点和缺点

    多级页表是基于虚拟地址的分段来划分等级的 最低等级的页表上保存了最终的虚拟页号和物理页号的对应关系 例如拿32位的虚拟地址来说 如果页面的大小为4K 也就是12位 那么地址空间内将有20位 也就是1M的页表项目 每个项目对应一个虚拟页面 那
  • 机器学习2:朴素贝叶斯分类器Naïve Bayes Classifier(基于R language&Python)

    朴素贝叶斯是基于贝叶斯定理与特征条件独立假设的分类方法 朴素贝叶斯法与贝叶斯估计是不同的概念 对于给定的训练数据集 首先基于特征条件独立假设学习输入 输出的联合概率分布 然后基于此模型 对个给定的输入 x x x 利用贝叶斯定理求出后验概率
  • Unity基础篇:Unity2D图集(2):将剪裁好的图片导出。

    转载http blog csdn net hongyouwei article details 45011315 这位大佬讲的很好 但是他没有很好地考虑到我等小白的感受 故在此补充说明 1 在Unity的Project窗口下的Assets里
  • Kubernetes:全面了解 Deployment

    本文为作者的 Kubernetes 系列电子书的一部分 电子书已经开源 欢迎关注 电子书浏览地址 https k8s whuanle cn 适合国内访问 https ek8s whuanle cn gitbook Deployment 是