Skip to content

Commit

Permalink
GITBOOK-181: No subject
Browse files Browse the repository at this point in the history
  • Loading branch information
mouuii authored and gitbook-bot committed Nov 23, 2024
1 parent 230b40f commit d6494bf
Show file tree
Hide file tree
Showing 16 changed files with 62 additions and 56 deletions.
18 changes: 11 additions & 7 deletions SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,18 @@
* [2024-9-13](k8s-yuan-ma-mei-ri-xin-wen/2024-9-13.md)
* [2024-9-14](k8s-yuan-ma-mei-ri-xin-wen/2024-9-14.md)

## CICD
***

* [01、安装 jenkins](cicd/01-an-zhuang-jenkins.md)
* [02、创建你的第一条pipeline](cicd/02-chuang-jian-ni-de-di-yi-tiao-pipeline.md)
* [03、pipeline 入门](cicd/03pipeline-ru-men.md)
* [04、使用 jenkinsfile](cicd/04-shi-yong-jenkinsfile.md)
* [05、Jenkins CI/CD 管道实战1 【go-k8s】](cicd/05jenkins-cicd-guan-dao-shi-zhan-1-gok8s.md)
* [06、 Jenkins CI/CD 管道实战2 【go-主机】](cicd/06-jenkins-cicd-guan-dao-shi-zhan-2-go-zhu-ji.md)
* [helm 教程](helm-jiao-cheng.md)

## jenkins 教程

* [01、安装 jenkins](jenkins-jiao-cheng/01-an-zhuang-jenkins.md)
* [02、创建你的第一条pipeline](jenkins-jiao-cheng/02-chuang-jian-ni-de-di-yi-tiao-pipeline.md)
* [03、pipeline 入门](jenkins-jiao-cheng/03pipeline-ru-men.md)
* [04、使用 jenkinsfile](jenkins-jiao-cheng/04-shi-yong-jenkinsfile.md)
* [05、Jenkins CI/CD 管道实战1 【go-k8s】](jenkins-jiao-cheng/05jenkins-cicd-guan-dao-shi-zhan-1-gok8s.md)
* [06、 Jenkins CI/CD 管道实战2 【go-主机】](jenkins-jiao-cheng/06-jenkins-cicd-guan-dao-shi-zhan-2-go-zhu-ji.md)

## c# 编程入门

Expand Down
8 changes: 4 additions & 4 deletions c-bian-cheng-ru-men/01c-zhi-l.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

编程语言可让您编写希望计算机执行的指令。每种编程语言都有自己的语法,但是在学习第一种编程语言并尝试学习另一种编程语言之后,您很快就会意识到它们都有许多相似的概念。编程语言的工作是让人们以人类可读和可理解的方式表达他们的意图。您用编程语言编写的指令称为“源代码”或简称为“代码”。

开发人员可以更新和更改代码,但计算机无法理解该代码。代码首先必须_编译_成计算机可以理解的格式
开发人员可以更新和更改代码,但计算机无法理解该代码。代码首先必须_编译_成计算机可以理解的格式

## 什么是编译? <a href="#what-is-compilation" id="what-is-compilation"></a>

称为**编译器的**特殊程序将源代码转换为计算机中央处理单元 (CPU) 可以执行的不同格式。当您在编辑器中点击绿色**“运行”**按钮时,您编写的代码首先被编译,然后被执行。
称为**编译器的**特殊程序将源代码转换为计算机中央处理单元 (CPU) 可以执行的不同格式。当您在编辑器中点击绿&#x8272;**“运行”**&#x6309;钮时,您编写的代码首先被编译,然后被执行。

为什么代码需要编译?尽管大多数编程语言一开始看起来很神秘,但它们比计算机的_首选_语言更容易被人类理解。 CPU 可以理解通过打开或关闭数千或数百万个微小开关所表达的指令。编译器通过将人类可读的指令转换为计算机可理解的指令集来连接这两个世界。
为什么代码需要编译?尽管大多数编程语言一开始看起来很神秘,但它们比计算机&#x7684;_&#x9996;&#x9009;_&#x8BED;言更容易被人类理解。 CPU 可以理解通过打开或关闭数千或数百万个微小开关所表达的指令。编译器通过将人类可读的指令转换为计算机可理解的指令集来连接这两个世界。

## 什么是语法? <a href="#what-is-syntax" id="what-is-syntax"></a>

Expand All @@ -29,7 +29,7 @@ C#语言是[.NET平台](https://learn.microsoft.com/en-us/dotnet/csharp/)最流
Console.WriteLine("Hello, World");
```

`//`开头的行是_单行注释_。 C# 单行注释以`//`开始,一直到当前行的末尾。 C#还支持_多行注释_。多行注释以`/*`开头,以`*/`结尾。 `Console`类(位于`System`命名空间中)的`WriteLine`方法生成程序的输出。此类由标准类库提供,默认情况下,每个 C# 程序都会自动引用该类。
`//`开头的行&#x662F;_&#x5355;行注释_。 C# 单行注释以`//`开始,一直到当前行的末尾。 C#还支&#x6301;_&#x591A;行注释_。多行注释以`/*`开头,以`*/`结尾。 `Console`类(位于`System`命名空间中)的`WriteLine`方法生成程序的输出。此类由标准类库提供,默认情况下,每个 C# 程序都会自动引用该类。

前面的示例显示了“Hello, World”程序的一种形式,叫做 top level statements。 top level statements 允许您直接在文件的根目录编写可执行代码,从而无需将代码包装在类或方法中。这意味着您可以创建程序而无需`Program`类和`Main`方法的仪式。在这种情况下,编译器会生成一个带有应用程序入口点方法`Program`类。生成的方法的名称不是`Main` ,它是代码无法直接引用的实现细节。

Expand Down
2 changes: 2 additions & 0 deletions helm-jiao-cheng.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# helm 教程

Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ jenkins 是最老牌功能最全的devops平台,适合市面上99%的场景,

## 为什么选择 jenkins

* **掌握 CI/CD 管道:**高效地自动构建、测试和部署代码。
* **自动执行重复任务:**节省时间并减少软件开发中的人为错误
* **广泛的工具集成:**可与 Git、Maven、Docker 和 Kubernetes 等众多工具配合使用。
* **促进团队协作:**促进持续集成和反馈,改善团队工作流程。
* **可扩展性:**支持具有分布式构建的大型项目
* **职业发展:** Jenkins 专业知识的高需求带来了更好的工作机会。
* **掌握 CI/CD 管道:**&#x9AD8;效地自动构建、测试和部署代码。
* **自动执行重复任务:**&#x8282;省时间并减少软件开发中的人为错误
* **广泛的工具集成:**&#x53EF; Git、Maven、Docker 和 Kubernetes 等众多工具配合使用。
* **促进团队协作:**&#x4FC3;进持续集成和反馈,改善团队工作流程。
* **可扩展性:**&#x652F;持具有分布式构建的大型项目
* **职业发展:**&#x5BF9; Jenkins 专业知识的高需求带来了更好的工作机会。

## 安装

Expand Down Expand Up @@ -84,7 +84,7 @@ sudo docker exec ${CONTAINER_ID or CONTAINER_NAME} cat /var/jenkins_home/secrets

<figure><img src="../.gitbook/assets/image (28).png" alt=""><figcaption></figcaption></figure>

[解锁 Jenkins](https://www.jenkins.io/doc/book/installing/docker/#unlocking-jenkins)后,会出现**“自定义 Jenkins”**页面。作为初始设置的一部分,您可以在此处安装任意数量的有用插件。这里我们选择第一个,仅仅安装默认插件。
[解锁 Jenkins](https://www.jenkins.io/doc/book/installing/docker/#unlocking-jenkins)后,会出&#x73B0;**“自定义 Jenkins”**&#x9875;。作为初始设置的一部分,您可以在此处安装任意数量的有用插件。这里我们选择第一个,仅仅安装默认插件。

<figure><img src="../.gitbook/assets/1730336059284.png" alt=""><figcaption></figcaption></figure>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

上一节我们安装好了 jenkins,这节课我们熟悉下什么是 pipeline。

Jenkins Pipeline(或简称“Pipeline”)是一套插件,支持在 Jenkins 中实施和集成_持续交付管道_
Jenkins Pipeline(或简称“Pipeline”)是一套插件,支持在 Jenkins 中实施和集&#x6210;_&#x6301;续交付管道_

Jenkins Pipeline 提供了一组可扩展的工具,用于将简单到复杂的交付管道“作为代码”进行建模。 Jenkins Pipeline 的定义通常写入文本文件(称为`Jenkinsfile` ),然后将其嵌入项目的源码存储库。&#x20;

Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ func TestHandler(t *testing.T) {

#### 先决条件 <a href="#id-383e" id="id-383e"></a>

1. **Ubuntu 主机:**有一个可用于部署的 Ubuntu 主机。在此示例中,我们将使用 IP 地址`172.16.137.133`和用户名`nn`
2. **SSH 密钥对:**生成 SSH 密钥对以安全访问 Ubuntu 主机。
1. **Ubuntu 主机:**&#x6709;一个可用于部署的 Ubuntu 主机。在此示例中,我们将使用 IP 地址`172.16.137.133`和用户名`nn`
2. **SSH 密钥对:**&#x751F; SSH 密钥对以安全访问 Ubuntu 主机。

#### (1) 生成SSH密钥对 <a href="#id-0b18" id="id-0b18"></a>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ type Indexer interface {
#### index 方法用于获取指定索引的所有对象
这个 Index 函数就是获取一个指定对象的索引键,然后把这个索引键下面的所有的对象全部获取到,比如我们要获取一个 Pod 所在命名空间下面的所有 Pod,如果更抽象一点,就是符合对象_某些特征_的所有对象,而这个特征就是我们指定的索引键函数计算出来的。
这个 Index 函数就是获取一个指定对象的索引键,然后把这个索引键下面的所有的对象全部获取到,比如我们要获取一个 Pod 所在命名空间下面的所有 Pod,如果更抽象一点,就是符合对&#x8C61;_&#x67D0;些特&#x5F81;_&#x7684;所有对象,而这个特征就是我们指定的索引键函数计算出来的。
```go
// Index returns a list of items that match the given object on the index function.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ EndpointSlice 是什么?相比于我们熟知的 endpoint ,有什么区别
\
**使用Endpoints API,服务只有一个Endpoints资源**。这意味着它需要能够为支持相应服务的每个Pod存储IP地址和端口(网络端点)。这耗费了巨大的API资源。为了解决此问题,kube-proxy在每个节点上运行,并会监视Endpoints资源的任何更新。如果在Endpoints资源中甚至只有一个网络端点发生了更改,则整个对象也必须发送到kube-proxy的每个实例。

Endpoints API的另一个限制是它限制了可以为服务跟踪的网络端点的数量。**存储在etcd中的对象的默认大小限制为1.5MB。在某些情况下,可能会将Endpoints资源限制为5,000个Pod IP。**对于大多数没有超过5000个pod的用户而言,这不是问题,但是对于服务接近此大小的用户而言,这将成为一个重大问题。
Endpoints API的另一个限制是它限制了可以为服务跟踪的网络端点的数量。**存储在etcd中的对象的默认大小限制为1.5MB。在某些情况下,可能会将Endpoints资源限制为5,000个Pod IP。**&#x5BF9;于大多数没有超过5000个pod的用户而言,这不是问题,但是对于服务接近此大小的用户而言,这将成为一个重大问题。

为了说明这些问题在多大程度上变得重要,举一个简单的例子是有帮助的。考虑具有5,000个Pod的服务,它最终可能具有1.5MB的端点资源。如果该列表中的单个网络端点都发生了更改,则需要将完整的端点资源分配给集群中的每个节点。在具有3,000个节点的大型群集中,这成为一个很大的问题。每次更新将涉及跨集群发送4.5GB数据(1.5MB端点\* 3,000个节点)。这几乎足以耗费大量资源,并且每次端点更改都会发生这种情况。想象一下,如果滚动更新会导致全部5,000个Pod都被替换,那么传输的数据量超过22TB(等同于5000张DVD存储量)

Expand Down Expand Up @@ -54,7 +54,7 @@ func startEndpointSliceController(ctx context.Context, controllerContext Control
* maxEndpointsPerSlice 每组切片的最大 endpoint 数量。
* triggerTimeTracker 计算 service 和 pods 最后一次更新时间,并存到缓存,然会 2 者中最后一次更新的时间
* reconciler 控制器的核心逻辑所在
* features.TopologyAwareHints 是否开启拓扑感知提示特性,就近路由,比如节点 A B 属于同一区域,C D 属于另一个区域,pod 在 A B C D 节点上各有一个,查看 A B 节点上面的 ipvs 规则,会发现,通往该 pod service 的流量的 ipvs 后端,只有 A B 节点上的 pod ip ,C D 同理 ,可以参考这篇文章,说得很直白:[Kubernetes Service 开启拓扑感知(就近访问)能力](https://blog.csdn.net/shida\_csdn/article/details/124285905)
* features.TopologyAwareHints 是否开启拓扑感知提示特性,就近路由,比如节点 A B 属于同一区域,C D 属于另一个区域,pod 在 A B C D 节点上各有一个,查看 A B 节点上面的 ipvs 规则,会发现,通往该 pod service 的流量的 ipvs 后端,只有 A B 节点上的 pod ip ,C D 同理 ,可以参考这篇文章,说得很直白:[Kubernetes Service 开启拓扑感知(就近访问)能力](https://blog.csdn.net/shida_csdn/article/details/124285905)

```go
// NewController creates and initializes a new Controller
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,9 @@ spec:

对于你可以配置的每个策略,你可以将值设置为 `Delete` 或 `Retain`。

**`Delete`**对于受策略影响的每个 Pod,基于 StatefulSet 的 `volumeClaimTemplate` 字段创建的 PVC 都会被删除。 使用 `whenDeleted` 策略,所有来自 `volumeClaimTemplate` 的 PVC 在其 Pod 被删除后都会被删除。 使用 `whenScaled` 策略,只有与被缩减的 Pod 副本对应的 PVC 在其 Pod 被删除后才会被删除。
**`Delete`**&#x5BF9;于受策略影响的每个 Pod,基于 StatefulSet 的 `volumeClaimTemplate` 字段创建的 PVC 都会被删除。 使用 `whenDeleted` 策略,所有来自 `volumeClaimTemplate` 的 PVC 在其 Pod 被删除后都会被删除。 使用 `whenScaled` 策略,只有与被缩减的 Pod 副本对应的 PVC 在其 Pod 被删除后才会被删除。

**`Retain`(默认)**来自 `volumeClaimTemplate` 的 PVC 在 Pod 被删除时不受影响。这是此新功能之前的行为。
**`Retain`(默认)**&#x6765;自 `volumeClaimTemplate` 的 PVC 在 Pod 被删除时不受影响。这是此新功能之前的行为。

请记住,这些策略**仅**适用于由于 StatefulSet 被删除或被缩小而被删除的 Pod。 例如,如果与 StatefulSet 关联的 Pod 由于节点故障而失败, 并且控制平面创建了替换 Pod,则 StatefulSet 保留现有的 PVC。 现有卷不受影响,集群会将其附加到新 Pod 即将启动的节点上。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

新的 Deployment 就产生了新的 replicaset 对象和新的 Pod。这里就出现了一个问题,旧的 ReplicaSet 和 Pod 去哪了?另外,如果直接删除 deployment,那 replicaset 和 pod 又会如何?事实就是,在删除 Deployment 后,ReplicaSet 和 Pod 也会一起被删除,要不然集群早就乱套了。

在这个场景之下,我们可以深入思考几个问题:**在 K8s 中该如何实现级联删除?有几种级联删除策略?在 K8s 中有没有可能存在孤儿对象(orphan object)?**这些问题其实就是典型的垃圾回收(garbage collection,GC)问题。
在这个场景之下,我们可以深入思考几个问题:**在 K8s 中该如何实现级联删除?有几种级联删除策略?在 K8s 中有没有可能存在孤儿对象(orphan object)?**&#x8FD9;些问题其实就是典型的垃圾回收(garbage collection,GC)问题。

## 概述 <a href="#gai-shu" id="gai-shu"></a>

一般来说,**垃圾回收(GC)就是从系统中删除不再使用的对象,并释放分配给它们的计算资源。**GC 存在于所有的高级编程语言中,较低级的编程语言通过系统库实现 GC。
一般来说,**垃圾回收(GC)就是从系统中删除不再使用的对象,并释放分配给它们的计算资源。**&#x47;C 存在于所有的高级编程语言中,较低级的编程语言通过系统库实现 GC。

和编程语言中(例如 Go, Java) 的 GC 运行机制一样,Kubernetes 内部也有垃圾回收机制,用于清理集群中的下列资源:

Expand Down Expand Up @@ -66,7 +66,7 @@ spec:
### 级联删除 (Cascading deletion) <a href="#cascading-deletion" id="cascading-deletion"></a>
Kubernetes 检查并删除不再具有所有者引用的对象,例如删除 ReplicaSet 时留下的 pod。当你删除一个对象时,你可以控制 Kubernetes 是否自动删除该对象的依赖项,这个过程称为_级联删除_。级联删除有两种类型,如下:
Kubernetes 检查并删除不再具有所有者引用的对象,例如删除 ReplicaSet 时留下的 pod。当你删除一个对象时,你可以控制 Kubernetes 是否自动删除该对象的依赖项,这个过程称&#x4E3A;_&#x7EA7;联删除_。级联删除有两种类型,如下:
* Foreground cascading deletion\
前台级联删除
Expand All @@ -78,7 +78,7 @@ Kubernetes 检查并删除不再具有所有者引用的对象,例如删除 Re
#### Foreground cascading deletion 前台级联删除 <a href="#foreground-deletion" id="foreground-deletion"></a>
在前台级联删除中,您要删除的所有者对象首先进入_删除进行中_状态。在这种状态下,所有者对象会发生以下情况:
在前台级联删除中,您要删除的所有者对象首先进&#x5165;_&#x5220;除进行&#x4E2D;_&#x72B6;态。在这种状态下,所有者对象会发生以下情况:
* Kubernetes API server 将对象的`metadata.deletionTimestamp`字段设置为对象被标记为删除的时间
* Kubernetes API server 将`metadata.finalizers`字段设置为`foregroundDeletion`&#x20;
Expand All @@ -100,7 +100,7 @@ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-

### Delete owner objects and orphan dependents 删除所有者对象和孤儿依赖项 <a href="#set-orphan-deletion-policy" id="set-orphan-deletion-policy"></a>

默认情况下,当您告诉 Kubernetes 删除对象时,[控制器](https://kubernetes.io/docs/concepts/architecture/controller/)也会删除依赖对象。您可以使用`kubectl`或 Kubernetes API 使 Kubernetes_孤立_这些依赖项
默认情况下,当您告诉 Kubernetes 删除对象时,[控制器](https://kubernetes.io/docs/concepts/architecture/controller/)也会删除依赖对象。您可以使用`kubectl`或 Kubernetes API 使 Kubernete&#x73;_&#x5B64;&#x7ACB;_&#x8FD9;些依赖项

```go
// 孤儿删除示例
Expand Down
Loading

0 comments on commit d6494bf

Please sign in to comment.