一、K8s 集群基础介绍
Kubernetes(简称 K8s)是一个开源的容器编排平台,它可以自动化容器的部署、扩展和管理。在当今的云计算和微服务架构中,K8s 已经成为了不可或缺的一部分。想象一下,你有一堆容器,每个容器就像是一辆汽车,而 K8s 就像是一个智能的交通指挥中心,能够合理地安排这些汽车的行驶路线和停车位置。
应用场景
K8s 的应用场景非常广泛。在互联网公司中,它可以用于部署和管理微服务架构的应用程序。例如,一个电商网站,可能有商品服务、用户服务、订单服务等多个微服务,每个微服务都可以打包成容器,使用 K8s 进行统一管理。在大数据领域,K8s 可以用于管理分布式计算任务,如 Hadoop、Spark 等集群的部署和调度。
技术优缺点
优点方面,K8s 具有高度的自动化和可扩展性。它可以根据应用的负载情况自动扩展或收缩容器的数量,确保应用的高可用性和性能。同时,K8s 支持多节点集群,能够在不同的物理机或云服务器上运行,提高了资源的利用率。缺点是,K8s 的学习曲线较陡,对于初学者来说,理解和掌握其复杂的概念和配置需要花费一定的时间和精力。而且,K8s 的部署和维护需要一定的技术能力和资源,对于小型项目来说,可能会显得过于复杂。
注意事项
在使用 K8s 之前,需要确保你的服务器环境满足要求,包括操作系统版本、网络配置等。同时,要合理规划集群的节点数量和资源分配,避免资源浪费或不足的情况。另外,要定期备份 K8s 的配置文件和数据,以防数据丢失。
二、容器调度
调度原理
K8s 的容器调度是通过调度器(Scheduler)来实现的。调度器会根据节点的资源情况、容器的资源需求以及一些调度策略,将容器分配到合适的节点上。例如,一个容器需要 2GB 的内存和 1 个 CPU 核心,调度器会在集群中寻找满足这些资源要求的节点。
示例(使用 YAML 配置)
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:1.19.0 # 使用 Nginx 镜像
resources:
requests:
memory: "256Mi" # 请求 256MB 内存
cpu: "0.5" # 请求 0.5 个 CPU 核心
limits:
memory: "512Mi" # 内存限制为 512MB
cpu: "1" # CPU 限制为 1 个核心
注释:
apiVersion:指定 API 的版本。kind:指定资源的类型,这里是 Pod。metadata:包含 Pod 的元数据,如名称。spec:定义 Pod 的规格,包括容器的信息。containers:定义容器的列表,这里只有一个容器。image:指定容器使用的镜像。resources:定义容器的资源请求和限制。
调度策略
K8s 提供了多种调度策略,如节点亲和性、反亲和性等。节点亲和性可以让容器优先调度到满足某些条件的节点上,而反亲和性则可以避免容器调度到某些节点上。例如,我们可以使用节点亲和性让容器优先调度到具有特定标签的节点上:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: my-container
image: nginx:1.19.0
注释:
affinity:定义亲和性规则。nodeAffinity:指定节点亲和性。requiredDuringSchedulingIgnoredDuringExecution:表示在调度时必须满足该条件,运行时可以忽略。nodeSelectorTerms:定义节点选择条件。matchExpressions:使用表达式匹配节点标签。
三、资源限制
为什么需要资源限制
在 K8s 集群中,如果不进行资源限制,一个容器可能会占用过多的资源,导致其他容器无法正常运行。例如,一个容器可能会无限制地占用 CPU 或内存,使得其他容器得不到足够的资源,从而影响整个集群的性能和稳定性。
资源限制的类型
K8s 支持对 CPU 和内存进行资源限制。CPU 资源限制可以使用 CPU 核心数或 CPU 份额来表示,内存资源限制则使用字节数来表示。
示例
apiVersion: v1
kind: Pod
metadata:
name: resource-limited-pod
spec:
containers:
- name: my-container
image: busybox
command: ["sh", "-c", "while true; do sleep 1; done"]
resources:
requests:
memory: "128Mi"
cpu: "0.2"
limits:
memory: "256Mi"
cpu: "0.5"
注释:
requests:定义容器启动时请求的资源量。limits:定义容器可以使用的最大资源量。
资源限制的效果
当容器使用的资源超过限制时,K8s 会采取相应的措施。对于 CPU 资源,容器可能会被限制使用的 CPU 时间;对于内存资源,容器可能会被终止。
四、Ingress 控制器配置实战
Ingress 是什么
Ingress 是 K8s 中用于管理外部对集群内服务的访问的 API 对象。它可以将外部的 HTTP 或 HTTPS 请求路由到集群内的不同服务上,类似于一个智能的路由器。
应用场景
在微服务架构中,一个应用可能有多个服务,每个服务都有自己的端口。使用 Ingress 可以将这些服务统一暴露在一个公共的域名下,方便用户访问。例如,一个电商网站的商品服务、用户服务和订单服务可以通过 Ingress 统一暴露在 www.example.com 域名下。
配置 Ingress 控制器
这里以 Nginx Ingress 控制器为例。首先,需要部署 Nginx Ingress 控制器:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
然后,创建一个 Ingress 资源:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
注释:
host:指定域名。paths:定义请求路径的规则。backend:指定请求转发的后端服务。
注意事项
在配置 Ingress 时,需要确保域名解析正确,并且 Ingress 控制器能够正常工作。同时,要注意安全问题,如使用 HTTPS 协议进行加密传输。
五、文章总结
通过以上内容,我们详细介绍了 K8s 集群的部署与运维,包括容器调度、资源限制和 Ingress 控制器配置。容器调度可以让我们合理地分配容器到不同的节点上,提高资源的利用率;资源限制可以保证每个容器都能得到足够的资源,避免资源竞争;Ingress 控制器则可以方便地管理外部对集群内服务的访问。
在实际应用中,我们需要根据具体的需求和场景,合理配置 K8s 集群。同时,要不断学习和掌握 K8s 的新特性和技术,以提高集群的性能和稳定性。
评论