K8s Walkthrough-1¶
Reference:
首先我们在~
下定义一个k8s文件夹,专门进行下列的测试
Bash | |
---|---|
1 2 3 4 5 6 |
|
安装¶
简介¶
用于管理容器化的工作负载和服务,可促进声明式配置和自动化
容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。Kubernetes 为你提供了一个可弹性运行分布式系统的框架。Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。
Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。
由于 Kubernetes 是在容器级别运行,而非在硬件级别,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡,允许用户集成他们的日志记录、监控和警报方案。 但是,Kubernetes 不是单体式(monolithic)系统,那些默认解决方案都是可选、可插拔的。
对象管理¶
使用构建在 kubectl
命令行工具中的指令式命令可以直接快速创建、更新和删除 Kubernetes 对象。
安装kubectl
。
必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。
要获知版本信息,请输入 kubectl version
.
CLI传指令及参数¶
使用指令式命令时,用户可以在集群中的活动对象上进行操作。用户将操作传给 kubectl
命令作为参数或标志。
这是开始或者在集群中运行一次性任务的推荐方法,它直接在活跃对象上操作,不提供以前配置的历史记录。
创建 Deployment 对象来运行 nginx 容器的实例
Bash | |
---|---|
1 |
|
配置文件定义¶
在指令式对象配置中,kubectl 命令指定操作(创建,替换等),可选标志和至少一个文件名。
指定的文件必须包含 YAML 或 JSON 格式的对象的完整定义
创建配置文件中定义的对象:
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
删除两个配置文件中定义的对象:
Bash | |
---|---|
1 |
|
通过覆盖活动配置来更新配置文件中定义的对象:
Bash | |
---|---|
1 |
|
声明式自动化处理¶
使用声明式对象配置时,用户对本地存储的对象配置文件进行操作,但是用户未定义要对该文件执行的操作。
kubectl
会自动检测每个文件的创建、更新和删除操作。 这使得配置可以在目录上工作,根据目录中配置文件对不同的对象执行不同的操作。(集成化处理)
处理 configs
目录中的所有对象配置文件,创建并更新活跃对象。 可以首先使用 diff
子命令查看将要进行的更改,然后在进行应用:
Bash | |
---|---|
1 2 |
|
递归处理目录:
Bash | |
---|---|
1 2 |
|
实践部分¶
指令式命令管理 Kubernetes 对象¶
创建对象
run
:创建一个新的 Pod 来运行一个容器。expose
:创建一个新的 Service 对象为若干 Pod 提供流量负载均衡。create <对象类别> [<子类别>] <实例名称>
某些对象类别拥有自己的子类别,可以在 create
命令中设置。 例如,Service 对象有 ClusterIP、LoadBalancer 和 NodePort 三种子类别。
下面是一个创建 NodePort 子类别的 Service 的示例:
Format
Bash | |
---|---|
1 2 3 |
|
建立一个名字是test-1, tcp端口是101的NodePort
Bash | |
---|---|
1 2 |
|
删除对象
delete <类别>/<名称>
下面是一个删除名为 nginx
的 Deployment 对象的命令:
Bash | |
---|---|
1 |
|
Bash | |
---|---|
1 2 3 4 |
|
查看对象
get
:打印匹配到的对象的基本信息。使用get -h
可以查看选项列表。describe
:打印匹配到的对象的详细信息的汇集版本。logs
:打印 Pod 中运行的容器的 stdout 和 stderr 输出
配置文件对 Kubernetes 对象进行命令式管理¶
可以使用 kubectl
命令行工具以及用 YAML 或 JSON 编写的对象配置文件来创建、更新和删除 Kubernetes 对象
- 手写完yaml文件
vim XXX.yaml
- 通过yaml生成对象
kubectl create -f XXX.yaml (从XXX.yaml这个配置文件中生成一个对象)
- 调用对象的相关自属性 `kubectl get -f XXX.yaml - arg1 ...
创建对象
Bash | |
---|---|
1 |
|
(1) 准备配置文件:
首先,我们准备一个简单的 nginx-deployment.yaml
配置文件,用于创建一个 Nginx Deployment(基于Nginx的Deployment类型对象)。
YAML | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
(2) 创建对象:
使用 kubectl create -f
命令从配置文件创建对象。
Bash | |
---|---|
1 |
|
Bash | |
---|---|
1 2 |
|
更新对象
(1) 修改配置文件:
假设我们要更新 Nginx Deployment,将副本数量从 3 改为 5。
修改后的 nginx-deployment.yaml
文件:
YAML | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
(2) 更新对象:
使用 kubectl replace -f
命令根据配置文件更新对象。
Bash | |
---|---|
1 |
|
Bash | |
---|---|
1 2 |
|
删除对象
(1) 删除对象:
使用 kubectl delete -f
命令删除配置文件中描述的对象。
Bash | |
---|---|
1 |
|
查看对象
(1) 查看对象信息:
使用 kubectl get -f
查看有关配置文件中描述的对象的信息。
Bash | |
---|---|
1 |
|
- 读取
nginx-deployment.yaml
文件 get -f
根据文件中的定义,找到名为nginx-deployment
的 Deployment 资源-o yaml
以 YAML 格式输出该 Deployment 资源的详细信息
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
|
从 URL 创建和编辑对象
假设你有一个对象配置文件的 URL,你可以在创建对象之前使用 kubectl create --edit
对配置进行更改。
Bash | |
---|---|
1 |
|
Bash | |
---|---|
1 2 3 |
|
从命令式命令迁移到命令式对象配置
(1) 将活动对象导出到本地对象配置文件:
Bash | |
---|---|
1 |
|
Bash | |
---|---|
1 2 3 4 |
|
如果我现在对原来的nginx-deployment.yaml
做了一些修改,只用 kubectl replace
进行更新,此时会发现nginx-deployment-generated.yaml
并没有产生变化,因为它在本地,还没有进行对object的Fetch (完全类比Git)
(2) 从对象配置文件中手动删除状态字段:
打开 nginx-deployment.yaml
文件,删除 status
字段。
(3) 使用 kubectl replace -f
进行管理:
Bash | |
---|---|
1 |
|
定义控制器选择器和 PodTemplate 标签
定义一个选择器和 PodTemplate 标签,以确保控制器只选择特定的 Pod。
YAML | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
配置文件对 Kubernetes 对象进行声明式管理¶
此处从略,用到再看 (🤡)
对象名称和 ID¶
集群中的每一个对象都有一个名称来标识在 同类资源 中的唯一性。
每个 Kubernetes 对象也有一个 UID 来标识在 整个集群 中的唯一性。
比如,在同一个名字空间 中只能有一个名为 myapp-1234
的 Pod,但是可以命名一个 Pod 和一个 Deployment 同为 myapp-1234
。
对于用户提供的非唯一性的属性,Kubernetes 提供了标签(Label)和 注解(Annotation)机制。
名称¶
某一时刻,只能有一个 给定类型的对象 具有给定的名称。但是,如果删除该对象,则可以创建同名的新对象。
名称在同一资源的所有 API 版本中必须是唯一的。
这些 API 资源通过各自的 API 组、资源类型、名字空间(对于划分名字空间的资源)和名称来区分。
当对象所代表的是一个物理实体(例如代表一台物理主机的 Node)时, 如果在 Node 对象未被删除并重建的条件下,重新创建了同名的物理主机, 则 Kubernetes 会将新的主机看作是老的主机,即:同名的同类型实体会实现覆盖,这可能会带来某种不一致性。
路径分段名称
某些资源类型要求名称能被安全地用作路径中的片段。 换句话说,其名称不能是 .
、..
,也不可以包含 /
或 %
这些字符。
下面是一个名为 nginx-demo
的 Pod 的配置清单:
YAML | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
UID¶
Kubernetes 系统生成的字符串,整个集群内的唯一标识对象。
在 Kubernetes 集群的整个生命周期中创建的每个对象都有一个不同的 UID,它旨在区分类似实体的历史事件。
Kubernetes UID 是全局唯一标识符(也叫 UUID)。