创建集群:
eksctl create cluster --name my-cluster --region us-west-2 --nodes 3 --node-type t3.medium
上述命令会在 us-west-2
区域创建一个名为 my-cluster
的 EKS 集群,并启动 3 个 t3.medium
类型的节点。
--nodes
:指定节点的数量。--node-type
:指定 EC2 实例类型。
创建集群时,eksctl
会自动设置 kubectl
配置文件,使你可以通过 kubectl
管理集群。
配置 kubectl
创建集群之后,eksctl
会自动为你配置 kubectl
,你可以通过以下命令验证配置是否成功:
bash
kubectl get nodes
这会列出当前集群中的节点信息,确保 EKS 集群已成功创建。
Helm
Helm
是 Kubernetes 的包管理工具,类似于 Linux 的 apt
或 yum
。它可以帮助你管理 Kubernetes 应用的安装和升级。
安装 Helm:
对于 Linux:
bash curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
验证 Helm 安装: 使用以下命令验证 Helm 是否安装成功:
bash
helm version
配置 Helm 使用 Kubernetes 集群
初始化 Helm: 从 Helm 3 版本开始,Helm 不再需要 Tiller,因此无需执行任何初始化步骤。只需要确保
kubectl
已正确配置即可。添加 Helm 仓库: 例如,添加官方的 Helm 仓库:
bash
helm repo add stable https://charts.helm.sh/stable
helm repo update
部署应用(示例:部署 Nginx)
你可以使用 Helm 部署应用程序(例如:Nginx)到 Kubernetes 集群中。
安装 Nginx: 使用 Helm 安装 Nginx:
bash
helm install my-nginx stable/nginx-ingress
查看部署的资源: 使用
kubectl
查看 Nginx 的部署和服务:
kubectl get all
配置 Helm 与 kubectl 集群连接
通常情况下,kubectl
已经为 EKS 集群配置好了访问权限。你只需要确保 Helm 使用的上下文与 kubectl
相同。
你可以通过以下命令检查当前 kubectl
上下文:
bash
kubectl config current-context
确保 Helm 使用的上下文与你的 EKS 集群上下文相同,通常 Helm 会自动继承 kubectl
配置。
升级与卸载 Helm 应用
升级应用:
bash
helm upgrade my-nginx stable/nginx-ingress
卸载应用:
helm uninstall my-nginx
集群管理
kubectl
是 Kubernetes 的命令行工具,广泛用于管理 Kubernetes 集群。它提供了很多命令来执行常见操作,下面是一些常用的 kubectl
操作和命令:
集群信息与节点操作
查看集群信息:
bash
kubectl cluster-info
查看当前集群的基本信息。
查看当前节点信息:
bash
kubectl get nodes
列出集群中的所有节点。
查看节点详细信息:
bash
kubectl describe node <node-name>
显示指定节点的详细信息。
命名空间操作
查看当前命名空间:
bash
kubectl config view --minify | grep namespace:
查看当前
kubectl
使用的命名空间。列出所有命名空间:
bash
kubectl get namespaces
切换命名空间:
bash
kubectl config set-context --current --namespace=<namespace>
Pod 操作
列出所有 Pods:
bash
kubectl get pods
查看所有 Pods 的状态。
列出指定命名空间中的 Pods:
bash
kubectl get pods -n <namespace>
查看某个 Pod 的详细信息:
bash
kubectl describe pod <pod-name>
查看 Pod 日志:
bash
kubectl logs <pod-name>
查看指定 Pod 的日志。
查看 Pod 中容器的日志(如果 Pod 中有多个容器):
bash
kubectl logs <pod-name> -c <container-name>
进入 Pod 内部:
bash
kubectl exec -it <pod-name> -- /bin/bash
在 Pod 内部执行命令。
删除 Pod:
bash
kubectl delete pod <pod-name>
Deployment 和 ReplicaSet 操作
列出所有 Deployments:
bash
kubectl get deployments
查看 Deployment 详情:
bash
kubectl describe deployment <deployment-name>
创建 Deployment:
bash
kubectl create deployment <deployment-name> --image=<image-name>
更新 Deployment:
bash
kubectl set image deployment/<deployment-name> <container-name>=<new-image>
滚动更新 Deployment:
bash
kubectl rollout restart deployment/<deployment-name>
查看 Deployment 的滚动更新状态:
bash
kubectl rollout status deployment/<deployment-name>
删除 Deployment:
bash
kubectl delete deployment <deployment-name>
Service 操作
列出所有 Services:
bash
kubectl get services
查看某个 Service 的详情:
bash
kubectl describe service <service-name>
暴露 Deployment 创建 Service:
bash
kubectl expose deployment <deployment-name> --type=LoadBalancer --name=<service-name>
删除 Service:
bash
kubectl delete service <service-name>
ConfigMap 和 Secret 操作
列出所有 ConfigMaps:
bash
kubectl get configmaps
查看 ConfigMap 的内容:
bash
kubectl describe configmap <configmap-name>
列出所有 Secrets:
bash
kubectl get secrets
查看 Secret 的内容:
bash
kubectl describe secret <secret-name>
PVC 和 PV 操作(存储)
查看 PersistentVolumeClaim:
bash
kubectl get pvc
查看 PersistentVolume:
bash
kubectl get pv
创建 PersistentVolumeClaim:
bash
kubectl apply -f pvc.yaml
Configurations 和资源操作
应用 Kubernetes 配置文件(如:部署、服务等):
bash
kubectl apply -f <file>.yaml
查看所有资源(pods、deployments、services 等):
bash
kubectl get all
查看某个资源的详细信息:
bash
kubectl describe <resource-type> <resource-name>
删除资源:
bash
kubectl delete -f <file>.yaml
或者
bash
kubectl delete <resource-type> <resource-name>
访问和调试
端口转发到本地:
bash
kubectl port-forward pod/<pod-name> <local-port>:<pod-port>
调试应用的事件:
bash
kubectl get events
其他常用命令
查看集群中的所有资源类型:
bash
kubectl api-resources
查看资源的 YAML 配置:
bash
kubectl get <resource-type> <resource-name> -o yaml
创建资源(根据指定的配置文件创建):
bash
kubectl create -f <file>.yaml
查看 Kubernetes 资源的历史版本:
bash
kubectl rollout history deployment/<deployment-name>
集群资源
在 Kubernetes 集群中,资源指的是管理和运行容器化应用所需的各种对象。每种资源都有不同的用途和作用,可以帮助你定义、管理和操作集群中的应用和服务。以下是 Kubernetes 集群中的常见资源类型:
1. Pod
Pod 是 Kubernetes 中的最小部署单元,通常一个 Pod 包含一个或多个容器。
容器在同一个 Pod 中共享网络和存储,可以通过同一 IP 和端口进行通信。
通常用来运行单个应用实例,或是多个应用容器的组合。
2. Deployment
Deployment 是用于管理 Pod 的资源,通常用于定义和管理应用的副本数、更新策略等。
它确保在集群中始终运行指定数量的 Pod 副本。
可以轻松进行滚动更新,确保应用在更新时不间断服务。
3. ReplicaSet
ReplicaSet 是 Deployment 内部使用的对象,用于确保特定数量的 Pod 副本在集群中运行。
ReplicaSet 会自动创建新的 Pod 并删除失效或不需要的 Pod。
4. StatefulSet
StatefulSet 用于管理有状态应用(例如数据库、缓存等),它保证每个 Pod 都有唯一的、持久的标识符。
它还会为每个 Pod 提供持久化存储。
5. DaemonSet
DaemonSet 用于确保在集群中的每个节点上运行一个 Pod 副本,通常用于节点级别的服务(如日志收集、监控等)。
当新节点加入集群时,DaemonSet 会自动在新节点上创建一个 Pod。
6. Job
Job 用于管理一次性任务或批处理任务,确保任务成功运行。
如果 Job 中的 Pod 失败,Kubernetes 会自动重启 Pod 直到任务完成。
7. CronJob
CronJob 用于定期或周期性地执行任务,类似于 Linux 中的
cron
命令。它可以设置定时任务,如每天、每周执行某个任务。
8. Service
Service 是一种抽象,它定义了一个访问指定 Pod 的方式,通常用于负载均衡和服务发现。
常见的 Service 类型包括:
ClusterIP
(集群内部访问)、NodePort
(通过节点 IP 和端口访问)、LoadBalancer
(外部负载均衡器)等。
9. Ingress
Ingress 是一个 HTTP 和 HTTPS 路由规则,用于将外部请求引导到 Kubernetes 服务。
它通常配合 Ingress Controller 使用,允许集群内部服务能够通过 HTTP(S) 路由进行访问。
10. ConfigMap
ConfigMap 用于存储非敏感的配置信息,如配置文件、环境变量等。
它能够将配置与容器镜像分离,便于应用在不同环境中的配置管理。
11. Secret
Secret 用于存储敏感数据,如密码、API 密钥、证书等。
它与 ConfigMap 类似,但提供了加密存储和更严格的访问控制。
12. PersistentVolume (PV)
PersistentVolume 是集群中的存储资源,它与底层的存储系统(如本地磁盘、NFS、云存储等)相对应。
PV 是集群管理员创建的资源,用户可以通过 PersistentVolumeClaim (PVC) 请求和使用存储。
13. PersistentVolumeClaim (PVC)
PersistentVolumeClaim 是用户对存储资源的请求,PVC 会根据 StorageClass 和资源需求向集群申请 PV。
它是 Pod 挂载持久存储的方式,保证数据的持久化存储。
14. Namespace
Namespace 用于将集群中的资源进行分隔和隔离,方便进行资源管理和权限控制。
它适用于多租户环境,可以让不同的团队或项目在同一集群中隔离开来。
15. ResourceQuota
ResourceQuota 用于限制一个 Namespace 中可使用的资源(如 CPU、内存、Pod 数量等)。
它帮助防止某个团队或项目过度消耗集群资源。
16. LimitRange
LimitRange 是一种限制资源使用范围的机制,可以为 Pod 和容器设置默认的资源请求和限制(如 CPU 和内存),确保资源不会被过度使用。
17. HorizontalPodAutoscaler (HPA)
HPA 用于根据负载(如 CPU 或内存使用率)自动调整 Pod 副本的数量。
它能够动态扩展或缩减 Pod 副本,以应对不同的工作负载需求。
18. NetworkPolicy
NetworkPolicy 用于定义 Pod 之间的网络访问控制规则,控制哪些 Pod 可以相互通信。
它提供了一种细粒度的网络安全策略,限制访问权限。
19. ClusterRole 和 Role
Role 是用于在单个 Namespace 中定义权限的对象,ClusterRole 是跨所有 Namespace 的权限定义。
它们与 RoleBinding 或 ClusterRoleBinding 配合使用,确保不同用户或服务帐户能够访问和操作集群中的资源。
20. ServiceAccount
ServiceAccount 是用于为 Pod 提供身份的对象,通常与 Kubernetes RBAC 权限系统结合使用。
每个 ServiceAccount 都可以关联一些权限(通过 Role 或 ClusterRole),以控制 Pod 对集群资源的访问权限。
21. Affinity 和 Toleration
Affinity 用于指定 Pod 与其他 Pod 或节点之间的亲和性(affinity),即调度时如何选择合适的节点。
Toleration 用于允许 Pod 被调度到带有某些 taint 的节点上,反之如果没有匹配的 toleration,则 Pod 会被排除在这些节点之外。
22. StorageClass
StorageClass 用于动态提供存储资源,指定存储的类型和属性(如性能、持久性等)。
它通常与 PVC 配合使用,自动为应用程序提供存储。
23. Event
Event 是 Kubernetes 中的事件对象,记录集群中资源状态的变化。
它们用于帮助排查问题和监控集群健康。
总结
Kubernetes 集群中的资源可以分为多种类型,涵盖从应用部署、网络访问、安全管理、存储管理到资源限制等各个方面。了解这些资源类型及其用途,有助于更好地设计、管理和优化集群中的工作负载。
常见资源总结:
计算和管理资源:Pod, Deployment, ReplicaSet, StatefulSet, DaemonSet, Job, CronJob
网络和访问:Service, Ingress, NetworkPolicy
存储:PersistentVolume, PersistentVolumeClaim, StorageClass
配置和密钥管理:ConfigMap, Secret
资源管理和配额:ResourceQuota, LimitRange
权限和安全:Role, ClusterRole, ServiceAccount, RBAC
在 Kubernetes 中,通过 YAML 配置文件来部署集群中的资源(如 Pods、Deployments、Services 等)是非常常见的做法。你可以将集群资源定义在 YAML 文件中,并通过 kubectl
命令来应用这些配置文件。
1. 准备 YAML 配置文件
首先,编写一个或多个 YAML 配置文件来定义你要部署的 Kubernetes 资源。一个典型的 YAML 文件包括资源类型、名称、规格等信息。
下面是一些常见的 YAML 文件示例。
示例 1:部署 Deployment(部署)
一个简单的 Deployment 配置示例:
yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: my-deploymentspec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80
apiVersion
:指定资源版本,通常是apps/v1
。kind
:指定资源类型,这里是Deployment
。metadata
:资源的元数据(如名称)。spec
:资源的具体规格,包含副本数、Pod 模板等。
示例 2:部署 Service(服务)
一个简单的 Service 配置示例:
yaml
apiVersion: v1kind: Servicemetadata:name: my-servicespec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 80type: ClusterIP
apiVersion
:指定资源版本,通常是v1
。kind
:资源类型,这里是Service
。spec
:服务的具体配置,包含端口、选择器等。
示例 3:部署 PersistentVolumeClaim(PVC)
一个简单的 PVC 配置示例:
yaml
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: my-pvcspec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi
accessModes
:访问模式。resources
:请求的存储资源,这里是1Gi
。
2. 部署应用
2.1 使用 kubectl apply
部署资源
使用 kubectl apply
命令可以将配置文件应用到 Kubernetes 集群中,创建或更新资源。
例如,如果你有一个名为 deployment.yaml
的文件来部署应用,可以使用以下命令:
bash
kubectl apply -f deployment.yaml
如果有多个 YAML 配置文件,可以同时应用它们:
bash
kubectl apply -f deployment.yaml -f service.yaml
或者,如果配置文件都在一个目录中,可以使用以下命令:
bash
kubectl apply -f ./manifests/
2.2 使用 kubectl create
部署资源
如果你希望直接创建资源(而不是更新现有资源),可以使用 kubectl create
命令:
bash
kubectl create -f deployment.yaml
3. 查看部署的资源
部署成功后,可以使用 kubectl
命令来查看资源的状态。
查看 Pod 状态:
bash
kubectl get pods
查看 Deployment 状态:
bash
kubectl get deployments
查看 Service 状态:
bash
kubectl get services
查看 Deployment 详情:
bash
kubectl describe deployment my-deployment
查看 Pod 详情:
bash
kubectl describe pod <pod-name>
4. 管理和修改配置
更新资源:如果修改了 YAML 文件并希望更新资源,可以再次执行
kubectl apply -f
命令,Kubernetes 会自动识别并更新资源。删除资源:如果需要删除已经部署的资源,可以使用
kubectl delete
命令:
bash
kubectl delete -f deployment.yaml
或指定资源类型:
bash
kubectl delete deployment my-deployment
kubectl delete service my-service
5. 示例:部署一个简单的 Web 应用
假设你要部署一个简单的 Nginx 应用,步骤如下:
创建
nginx-deployment.yaml
文件:
yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
创建
nginx-service.yaml
文件:
yaml
apiVersion: v1kind: Servicemetadata:name: nginx-servicespec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80type: LoadBalancer
应用这些配置:
bash
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
检查资源状态:
bash
kubectl get pods
kubectl get services
这时,你就成功地部署了一个 Nginx 服务,并通过 Service 暴露了该服务。
总结
通过 YAML 配置文件部署 Kubernetes 集群中的资源是管理和自动化操作的重要方法。你可以创建 Deployment、Service、Pod、PVC 等资源的配置文件,并使用 kubectl apply
或 kubectl create
来部署它们。通过这种方式,你可以清晰地管理和配置 Kubernetes 集群中的所有资源。