前提介绍
Kubernetes,亦被称为K8s,是业界公认的容器编排巨擘,以其卓越的能力简化了容器化应用的部署、扩展和管理流程。通过其强大的功能,Kubernetes不仅提升了应用的可靠性和可伸缩性,还优化了资源利用率,为开发者和运维人员提供了更加高效、灵活的容器运行环境。
在传统的应用部署模式中,不同环境间的基础设施与配置差异构成了巨大的挑战,使得跨环境部署变得困难重重。然而,Kubernetes的出现彻底改变了这一局面。它通过构建一个统一的容器编排平台,巧妙地将底层基础设施的复杂性进行了抽象,让开发人员能够摆脱繁琐的环境配置问题。在Kubernetes的助力下,应用程序可以在不同环境中实现一致且高效的部署与管理,这不仅极大地提升了应用的可移植性,更为未来的扩展性奠定了坚实的基础。
文章主旨
本篇文章是学习开发使用k8s的必备工具,提供了对无缝部署管理所需的基本命令的快速访问。让我们将其视为快节奏Kubernetes环境中的必备指南,以提高生产力,减少错误,并确保在复杂任务中的高效导航。不仅包含了Kubernetes中最常用的命令,还提供了针对特定任务的实用提示和最佳实践。无论您是经验丰富的Kubernetes管理员还是初学者,这份速查表都将成为您日常工作中的宝贵资源。
通过本系列文章,您可以快速了解如何创建和管理部署(Deployments)、服务(Services)、持久存储(Persistent Storage)以及其他Kubernetes资源。
Services和Networking
Service 为一组 pod 提供了稳定的访问端点,而 network 则负责构建这些 pod 之间高效通信的机制。
网络组件之间交互
网络组件间的交互是一个复杂而关键的过程,它涉及到信息的传递和组件间的协作。为了确保这种交互的顺畅进行,需要精心设计和实现组件间的接口和通信协议。下图是一个K8s框架的Node以及内部的Pod之间的网络调用和交互,其中包含了很多隐藏信息:服务发现、服务调用等。 同时,网络的安全性、稳定性和可扩展性等因素也必须得到充分考虑,以确保整个系统的正常运行和可靠性。因此,对于网络组件间的交互,我们需要进行全面的规划、设计和测试,以优化其性能和提升可靠性。
创建Service组件
利用kubectl命令和指定的YAML文件(service-definition.yaml),可以便捷地创建和部署服务。
yaml
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
selector:
app: demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
这个 YAML 文件定义了一个名为 demo-service 的 Kubernetes Service,它选择所有带有 app=demo 标签的 Pods,并将外部流量从集群的 80 端口转发到这些 Pods 的 8080 端口。
重要参数解析
- protocol: TCP:这指定了使用的协议是 TCP。Kubernetes 支持 TCP 和 UDP 协议。
- port: 80:这是 Service 的集群内部端口,也就是集群内的其他 Pods 或 Services 可以通过这个端口访问此 Service。
- targetPort: 8080:这是实际转发到选定 Pods 的端口。这意味着,尽管外部世界可能通过端口 80 访问此 Service,但流量实际上会被转发到 Pods 的 8080 端口。
- type: ClusterIP:意味着 Service 将有一个仅在集群内部可用的 IP 地址。外部流量无法直接访问它,除非通过其他方式(如 LoadBalancer、NodePort 等)进行转发。
执行指令创建
执行命令kubectl apply -f service-definition.yaml
时,Kubernetes将读取YAML文件中的配置信息,并据此在集群中创建或更新对应的服务资源。
管理和操作Services
- 列出默认命名空间中的所有服务:
kubectl get service
- 删除服务:
kubectl delete service <service_name>
- 将部署作为服务公开:
kubectl expose deployment <deployment_name> --port=<external_port>
服务发现
- 发现服务详细信息:
kubectl describe service <service_name>
- 读取服务的 ClusterIP:
kubectl get service <service_name> -o jsonpath='{.spec.clusterIP}'
快速指令列表
Service组件的ClusterIP和NodePort模式
在Kubernetes(k8s)中,Service是一个核心概念,它允许你将一组Pod(运行应用的容器组)暴露为一个统一的、抽象的网络服务。这个Service可以被集群内部或外部的其他应用访问。总体包含了三种模式,分别为ClusterIP和NodePort、LoadBalancer。
ClusterIP(集群内部访问)
- ClusterIP是Kubernetes Service的默认类型。当你创建一个Service时,Kubernetes会自动为它分配一个唯一的IP地址,这个IP地址仅在集群内部可见和可访问。
- IP地址与Service关联的后端Pods的端口(称为targetPort)绑定。集群内的其他Pods可以通过
ClusterIP:ServicePort
来访问这个Service,进而访问到后端Pods。
由于ClusterIP仅在集群内部可见,如果你希望从集群外部访问这个Service,你需要使用其他方式,如NodePort或LoadBalancer。
创建Cluster-IpService组件
配置定义了一个名为clusterip-service
的ClusterIP服务,它专门选择那些带有app: demo
标签的Pods。此服务在集群内部将80端口公开,以便其他Pods或Service能够访问,并将接收到的流量智能地路由到对应Pods的8080端口。
yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service
spec:
selector:
app: demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
NodePort(集群外部访问)
NodePort是Kubernetes Service的另一种类型,它允许你将Service暴露给集群外部。
- 当一个Service被设置为NodePort类型时,Kubernetes会在每个Node(节点)上打开一个静态端口(NodePort)。这个端口是外部可访问的,并且会路由到Service的ClusterIP。
- 因此,外部客户端可以通过
<NodeIP>:<NodePort>
来访问这个Service。这种机制允许外部流量进入集群,然后通过ClusterIP路由到后端Pods。
创建NodePort-service组件
yaml
apiVersion: v1
kind: Service
metadata:
name: nodeport-service
spec:
selector:
app: demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: NodePort
NodePort通常用于开发、测试或某些不需要高度可用性的生产环境。如果你需要一个更加健壮的外部访问方案,你可能会考虑使用LoadBalancer类型的Service。
LoadBalancer(集群外部访问)
定义了一个名为 loadbalancer-service
的 LoadBalancer 服务,其专门筛选带有 app: demo
标签的 Pods。
yaml
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service
spec:
selector:
app: demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
此服务将端口暴露给外部访问,而在云环境中,它会自动配置一个与云环境相匹配的负载均衡器。这个负载均衡器负责将接收到的流量智能地分配到相应的 Pods 上,确保服务的高可用性和可扩展性。通过这样的配置,我们能够在云环境中轻松实现负载均衡和服务发现,提升应用的可访问性和性能。
查看日志快速指令
为了帮助大家更高效地进行Kubernetes(简称K8s)的日常管理和故障排查,整理了一份关于K8s日志查询的指令快速列表。这些指令都是在日常工作中经常使用的,希望能为大家带来便利。
下篇预告
在即将发表的文章中,我们将进一步聚焦于Configuration和Secrets相关的核心组件,进行深入的介绍、分析和阐释。通过这篇文章,读者将能够更全面地了解这些组件的功能、特点以及它们在整体架构中的重要性。我们期待通过分享专业知识和经验,为读者提供更深入、更全面的了解和掌握这些关键组件的机会。