前言: Kubernetes是一个帮助我们更轻松地管理和运行应用程序的工具。它会帮助我们自动地将应用程序分配到合适的服务器上,并确保它们一直在运行,还可以自动地增加或减少应用程序的数量,以适应流量的变化。还具有帮助应用程序进行负载均衡,管理和保护敏感数据,以及在不同的云平台上部署应用程序等。总的来说,Kubernetes可以帮助我们更方便地管理和运行容器化的应用程序。
1.1 K8s的网络模型
pod是k8s的最小运行单位。假定所有的pod都在一个扁平的网络空间,pod与pod之间可以直接访问。一个pod里可以有多个服务,每个服务的端口不可以冲突。
1.2 pod的生命周期
这里是引用一个 Pod 在 Kubernetes 中具有不同的生命周期阶段。以下是 Pod 的一般生命周期:
Pending(等待):
Pod 已经被创建,但还没有被调度到一个节点上运行。这可能是因为尚未满足 Pod 的调度要求,例如资源不足、调度器的策略等。
Running(运行中):
Pod 已经被调度到一个节点上运行,并且其中的至少一个容器处于运行状态。Pod 可以同时包含多个容器。
Succeeded(已完成):
Pod 中的所有容器都已成功地完成了任务并退出。例如,一个完成了数据处理的任务容器可以进入此状态。
Failed(已失败):
Pod 中的至少一个容器已经失败或退出,并且没有启动一个替代的容器。例如,一个发生错误的容器可以导致 Pod 进入此状态。
Unknown(未知):
无法从 Kubernetes API 获取到 Pod 的状态。这可能是由于通信故障或其他未知因素导致的。
Terminating(终止中):
Pod 正在被按请求终止。Kubernetes 正在处理删除操作并终止容器。
Pod 的生命周期会根据不同的情况和操作而变化。你可以使用 kubectl describe pod 命令来查看更详细的 Pod 信息,包括当前的生命周期阶段。
initContainer: pod启动前运行的特殊容器,属于pod的一部分,与其他容器享有共同资源,K8s 的 initC是按顺序逐个运行的,确保了初始化任务的有序执行,并在所有 initC完成之后启动主应用程序容器。
1.3 pod的分类
自主式 pod:pod退出,此类型的pod不会被创建
管理器控制的pod: 在控制器的生命周期里,始终维持pod的副本数目
2.1、NodePort
NodePort是Kubernetes中的一种Service类型,用于将集群内部的一个服务公开到集群外部。当创建一个NodePort Service时,Kubernetes会分配一个高端口号(30000-32767)并将它映射到集群中某个节点上的特定端口。这意味着可以使用集群中任何节点的IP地址和分配的NodePort来访问Service。
要创建一个NodePort Service,首先需要编写一个Service定义文件,例如:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30000
3.1 ConfigMap
Kubernetes的ConfigMap是一种用于存储配置数据的机制。它将配置数据以键值对的形式保存,并可以注入到容器中,下面是使用ConfigMap的示例:
#1、创建ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
key1: value1
key2: value2
#2、将ConfigMap注入到Pod中的容器:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
envFrom:
- configMapRef:
name: my-config
在上述示例中,首先创建了一个名为"my-config"的ConfigMap,并定义了"key1"和"key2"两个键值对。然后,在Pod的配置中,通过"envFrom"字段将ConfigMap注入到了名为"my-container"的容器中。
这样,容器内的应用程序可以通过读取环境变量"key1"和"key2"来获取ConfigMap中定义的值。
#获取名称空间下所有的ConfigMap
kubectl get cm -n <名称空间>
#查看具体的ConfigMap的配置内容
kubectl describe cm <ConfigMap名称> -n <名称空间>
一个YAML文件中可以同时包含Service、Deployment和ConfigMap等不同类型的资源对象,因为它们具有不同的功能和用途,并在应用程序部署和管理中扮演不同的角色。
Service(服务)在Kubernetes中用于提供网络连接和负载均衡的功能,它定义了应用程序的网络访问入口和服务发现机制。
Deployment(部署)用于定义应用程序的部署规范,包括副本数、容器镜像、资源配置等。它描述了如何创建和管理Pod。
ConfigMap(配置映射)用于存储应用程序的配置数据,如环境变量、密钥、连接字符串等。它可以作为容器环境中的配置源,供应用程序读取配置信息。
这些不同类型的资源对象之间有着协同的关系。在一个应用程序的部署过程中,可以通过将它们定义在同一个YAML文件中,一并提交给Kubernetes进行统一管理和配置。例如,Deployment中定义了应用程序的副本数和容器镜像等信息,Service则定义了如何访问这些Pod,并提供了负载均衡的功能。ConfigMap可以用来配置Deployment中的环境变量或是挂载为容器中的文件。
通过将这些资源对象定义在同一个YAML文件中,可以方便地进行管理和部署,同时保持它们之间的关联。这种模式使得应用程序的部署更加简化和可维护,能够在Kubernetes环境中更好地运行和扩展。
Deployment和Service分别负责什么?
在Kubernetes中,Deployment和Service是两个不同的资源对象,它们分别负责以下不同的功能:
Deployment:
Deployment对象用于定义应用程序的部署规范和管理。它负责以下几个方面:
- 应用程序的副本数:Deployment指定了应该创建多少个Pod副本来部署应用程序。副本数可以根据需要进行自动扩展或缩减。
- 容器镜像版本:Deployment指定了使用的容器镜像及其版本,以确保应用程序的一致性和可靠性。
- 升级和回滚策略:Deployment支持滚动升级和回滚操作,允许无中断地更新应用程序,通过逐步>替换Pod来实现平滑过渡。
- 资源配置:Deployment可以定义与应用程序相关的资源需求和限制,例如CPU、内存等,以确保适当的资源分配。
- 通过标签选择器管理Pod:Deployment通过定义标签选择器,可以管理和控制与Deployment关联的Pod。
Service:
Service对象用于定义应用程序的网络访问入口和服务发现机制。它负责以下几个方面:
- 网络连接:Service定义了应用程序的网络连接方式,内部或外部访问。它为应用程序提供一个稳定的虚拟IP地址,作为网络入口。
- 负载均衡:Service可以在一组后端Pod之间提供负载均衡功能。它会将请求分发到后端Pod中的某一个实例,以平衡负载。
- 服务发现和命名解析:Service通过在Kubernetes的内部DNS中注册应用程序的名称,允许其他服务或应用程序通过名称来发现和访问该服务。
- 外部访问:Service可以通过指定类型(如ClusterIP、NodePort、LoadBalancer等)来提供对外部网络的访问。
总结起来,Deployment负责定义和管理应用程序的部署规范,包括副本数、容器镜像版本、升级策略和资源配置等。而Service负责定义应用程序的网络访问入口,负载均衡和服务发现。它们共同协作,使得应用程序能够在Kubernetes集群中有效地部署、扩展并提供网络访问功能。
下面是一个示例的Kubernetes YAML文件,包含Deployment和Service的定义:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example-app
template:
metadata:
labels:
app: example-app
spec:
containers:
- name: example-container
image: nginx:latest
ports:
- containerPort: 80
上述文件定义了一个名为 “example-deployment” 的Deployment,它将3个Pod副本部署到集群中。使用的镜像是Nginx,并在容器的80端口暴露服务。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
上述文件定义了一个名为 “example-service” 的Service,它的selector指定为 “app: example-app”,与上面的Deployment中的标签匹配。该Service监听80端口,并将流量转发到后端Pod的80端口。类型(type)为ClusterIP,表示该Service将通过集群内部IP暴露。
在Kubernetes的Deployment和Service中,通常情况下会选择将matchLabels和labels中的指定字段取相同的名字是为了实现关联和匹配。
若是默认的namespace,下面所有命令中的 -n '名称空间'
不用添加
k8s里的namespace和nacos里的namespace不是一个概念,k8s的namespace默认是default,可以自己自定义名称;
#查看指定命名空间下的所有pod
kubectl get pods -n '名称空间'
#查看某一个pod的详细配置
kubectl describe pod 'pod名称' -n '名称空间'
# 查看pod下的日志
kubectl logs 'pod名称' -n '名称空间'
#查看某个容器的日志
#(如果只有一个容器 -c '容器名称' 可以不用加)
kubectl logs 'pod名称' -n '名称空间' -c '容器名称'
注意: 我们拉取镜像尽量不要用latest,因为在不同时期的latest是不同的,会导致容器每次启动都会去拉取最新的。
kubectl exec 是 Kubernetes 命令行工具 kubectl 的一个子命令,用于在一个正在运行的容器内部执行命令,在执行 kubectl exec 命令时,需要在 - - 后面指定要在容器内部执行的命令。
#命令顺序
kubectl exec -it -n '名称空间' <pod-name> -c <container-name> -- <command>
其中:
-it 表示以交互式的方式进入容器。
-c <container-name> 是可选的,用于指定要执行命令的容器的名称。
#在使用 kubectl exec 命令时,你可以在 部分输入任何容器内可执行的有效命令。
查看当前目录下所有文件(包括隐藏文件):ls -a
查看文件内容:cat <file>
在文件中搜索指定字符串:grep <pattern> <file>
启动一个 Shell 终端:bash 或 sh
运行一个命令行工具,如 vim 或 nano 来编辑文件
运行一个网络工具,如 ping、curl 或 wget 来进行网络测试或下载文件
注意:。例如:
kubectl exec -it <pod-name> -- ls
#进入容器内,启动一个shell终端
kubectl exec -it <pod-name> -n '名称空间' /bin/bash
#根目录下查找文件
find / -iname '文件名称'
# 实时查看日志(tail为最新日志,默认10行)
tail -300f '日志文件'
#如果我们更新了nacos里的yaml配置,直接删除pod即可,k8s会自动启动新pod
kubectl delete pod <pod-name> -n '名称空间'
#kubectl get svc命令用于获取当前Kubernetes集群中的所有Service(服务)的信息,包括服务的名称、类型、Cluster IP和已使用的端口
kubectl get services -n '名称空间'
#导出Service配置:使用kubectl get svc命令和参数-o yaml
kubectl get services <serviceName> -n '名称空间' -o yaml
clusterIP是Kubernetes(K8s)特有的服务类型之一,是服务暴露给集群内部的虚拟IP地址,它负责将请求路由到后端的Pod。当clusterIP挂掉时,服务将无法通过clusterIP进行访问。
# curl命令不是k8s的专属命令,可用于发送HTTP、HTTPS、FTP等请求
curl ip:port