K8s 基础:修订间差异
无编辑摘要 |
(→Error) |
||
第39行: | 第39行: | ||
* kubectl apply -f nginx.yaml 创建三个 replicas,但只有一个成功 | * kubectl apply -f nginx.yaml 创建三个 replicas,但只有一个成功 | ||
可能的原因是只有一个节点上有镜像文件 | 可能的原因是只有一个节点上有镜像文件 | ||
* yaml 缩进 | |||
<small><small># unknown field "spec.template.spec.name" | |||
apiVersion: apps/v1 | |||
kind: Deployment | |||
metadata: | |||
labels: | |||
app: nginx | |||
name: nginx-bi | |||
namespace: rds2024 | |||
spec: | |||
replicas: 3 | |||
selector: | |||
matchLabels: | |||
app: nginx | |||
template: | |||
metadata: | |||
labels: | |||
app: nginx | |||
spec: | |||
containers: | |||
- image: nginx | |||
ports: | |||
- containerPort: 80 | |||
name: nginx</small></small> | |||
... | |||
spec: | |||
containers: | |||
- image: nginx | |||
ports: | |||
- containerPort: 80 | |||
name: nginx | |||
[[分类:Develop]] | [[分类:Develop]] | ||
[[分类:Linux]] | [[分类:Linux]] |
2024年6月18日 (二) 13:29的版本
基本概念
Pod
Pod 是 K8s 中集群部署应用和服务的最小单元,一个 Pod 中可以部署多个容器。
Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod 对多容器的支持是 K8s 最基础的设计理念。
RC(副本控制器)
RC(Replication Controller,RC)通过启动/停止 Pod 副本保证集群中有指定数目的 Pod 运行。
RS(副本集)
RS(Replica Set,RS)是新一代 RC,提供同样的高可用能力,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为 Deployment 的理想状态参数使用。
Deployment(部署)
Deployment 提供了一种对 Pod 和 ReplicaSet 的管理方式,每一个 Deployment 都对应集群中的一次部署。用来创建/更新/滚动升级服务。
滚动升级实际是创建一个新的 RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧 RS 中的副本数减小到 0 的复合操作。
Service(服务)
RC、RS 和 Deployment 保证了支撑服务的微服务 Pod 的数量,Service 解决如何访问这些服务,以及对绑定的 Pod 提供负载均衡。
一个 Pod 只是一个运行服务的实例,随时可能在节点上停止,然后在新的节点上用一个新的 IP 启动一个新的 Pod,因此不能使用确定的 IP 和端口号提供服务。这对于业务来说,就不能根据 Pod 的 IP 作为业务调度。K8s 就引入了 Service 的概念,为 Pod 提供一个入口,通过 Labels 标签来选择后端的 Pod,从而允许后端 Pod 的 IP 地址变更。
当声明 Service 的时候,会自动生成一个虚拟的 cluster IP,可以通过这个 IP 来访问后端的 Pod。如果集群配置了 CoreDNS 服务,那么也可以通过 Service 的名字来访问。
Service 对外暴露服务的方式
- ClusterIP (默认) :在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问,一般这种类型的 Service 上层会挂一个 Ingress,通过 Ingress 暴露服务
- NodePort:在每个选定 Node 的相同端口上公开 Service,使用 <NodeIP>:<NodePort> 即可从集群外部访问 Service
- LoadBalancer:使用云厂商的 K8S 集群,即可使用这种方式的暴露 Service,自建的服务一般不支持。使用 LoadBalancer,会生成一个 IP 地址,通过这个即可访问 Service, 通知这个 IP 也是高可用的
- ExternalName: 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的 externalName 指定)公开 Service,不使用代理。这种类型需要 kube-dns v1.7 或更高版本
Demo
创建 Nginx 集群
Error
- kubectl apply -f nginx.yaml 创建三个 replicas,但只有一个成功
可能的原因是只有一个节点上有镜像文件
- yaml 缩进
# unknown field "spec.template.spec.name" apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-bi namespace: rds2024 spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx ports: - containerPort: 80 name: nginx ... spec: containers: - image: nginx ports: - containerPort: 80 name: nginx