K8S简介、使用教程
以下是关于 Kubernetes(通常缩写为 K8S)的简介和使用教程:
一、Kubernetes 简介
-
定义与作用
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌开发,后捐赠给云原生计算基金会(CNCF),并成为云原生领域中非常重要的基础设施。在如今的软件开发和部署场景中,随着容器技术(如 Docker)的广泛应用,Kubernetes 能够帮助开发者和运维团队高效地管理大量的容器,确保应用程序在不同的环境(如开发、测试、生产环境)中可靠且稳定地运行。 -
核心概念
- Pod:是 Kubernetes 中最小的可部署和可管理的计算单元,它可以包含一个或多个紧密相关的容器。这些容器通常会共享网络和存储资源,并且总是一起被调度到同一个节点上运行。例如,一个包含 Web 服务器容器和数据库容器的组合,如果它们之间关联紧密,就可以放在一个 Pod 中(不过实际应用中更建议将数据库单独部署在不同的 Pod 中,这里只是为了便于理解举例)。
- Node(节点):指的是集群中的一台机器,可以是物理机也可以是虚拟机,节点上运行着 Kubernetes 的相关组件(如
kubelet
、kube-proxy
等),并且可以用来运行 Pod。简单理解就是承载 Pod 的宿主主机。 - Service(服务):用于将一组 Pod 暴露给其他应用或者外部网络,提供了稳定的网络访问入口。它可以通过不同的类型(如
ClusterIP
只在集群内部可访问、NodePort
可以通过集群中节点的特定端口访问、LoadBalancer
借助外部负载均衡器来对外提供服务等)实现不同的网络访问需求。 - Deployment(部署):用于声明式地管理 Pod 的创建、更新和删除等操作,提供了应用程序的滚动更新、回滚等功能,方便开发者对应用进行版本升级等操作。
- Namespace(命名空间):类似于操作系统中的文件夹,用于对集群中的资源进行隔离和分组管理,不同的命名空间中的资源可以同名,便于在多团队、多项目共用集群时划分资源和权限。
二、Kubernetes 使用教程
安装 Kubernetes
-
本地环境安装(以 Minikube 为例,适合用于学习和开发测试)
- 前提条件:需要先安装好 Docker(因为 Minikube 依赖 Docker 来运行容器)以及对应的命令行工具(如
kubectl
,用于与 Kubernetes 集群交互的客户端工具)。 - 安装步骤:
- 根据操作系统下载对应的 Minikube 安装包(可以从官方网站获取),然后进行安装。
- 安装完成后,在命令行执行
minikube start
命令来启动本地的 Kubernetes 集群。这个过程中,Minikube 会自动下载所需的镜像等资源并初始化集群。 - 通过
kubectl get nodes
命令可以查看集群中的节点信息,若看到节点状态为Ready
,则表示集群启动成功。
- 前提条件:需要先安装好 Docker(因为 Minikube 依赖 Docker 来运行容器)以及对应的命令行工具(如
-
生产环境安装(有多种方式,以基于云服务商提供的 Kubernetes 服务为例,如云原生的 Google Kubernetes Engine(GKE)、Amazon Elastic Kubernetes Service(EKS)、阿里云的容器服务 Kubernetes 版等)
- 以 GKE 为例的步骤:
- 登录 Google Cloud 平台账号,在控制台中选择创建 Kubernetes 引擎集群,按照提示配置集群的相关参数,如节点数量、机器类型、网络配置等。
- 完成配置后,点击创建,平台会自动完成集群的创建和初始化工作,创建完成后同样可以使用
kubectl get nodes
命令(前提是在本地配置好与 GKE 集群连接的kubectl
)来查看节点信息,确认集群状态。
- 以 GKE 为例的步骤:
创建和管理资源
- 创建 Pod
- 使用 YAML 文件定义 Pod(推荐方式,便于版本控制和复用):创建一个例如名为
my-pod.yaml
的文件,内容示例如下:apiVersion: v1 kind: Pod metadata: name: my-pod labels: app: my-app spec: containers: - name: my-container image: nginx:latest ports: - containerPort: 80
- 使用 YAML 文件定义 Pod(推荐方式,便于版本控制和复用):创建一个例如名为
这个 YAML 文件定义了一个名为 my-pod
的 Pod,它包含一个基于 nginx:latest
镜像的容器,并且容器暴露了 80
端口。
- 创建 Pod:在命令行执行
kubectl create -f my-pod.yaml
命令,Kubernetes 就会根据这个 YAML 文件创建对应的 Pod。可以通过kubectl get pods
命令查看 Pod 的状态。
- 创建 Deployment
- 同样使用 YAML 文件定义(例如
my-deployment.yaml
):apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: nginx:latest ports: - containerPort: 80
- 同样使用 YAML 文件定义(例如
这里定义了一个名为 my-deployment
的 Deployment,它会创建 3
个副本(由 replicas
参数指定)的 Pod,Pod 中的容器基于 nginx:latest
镜像且暴露 80
端口。
- 创建 Deployment:执行
kubectl create -f my-deployment.yaml
命令,通过kubectl get deployments
和kubectl get pods
命令可以分别查看 Deployment 和其创建的 Pod 的状态。
- 创建 Service
- 使用 YAML 文件定义服务(例如
my-service.yaml
),以下是创建一个ClusterIP
类型服务的示例:apiVersion: v1 kind: Service metadata: name: my-service labels: app: my-app spec: type: ClusterIP selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80
- 使用 YAML 文件定义服务(例如
这个服务会选择所有带有 app: my-app
标签的 Pod,将它们的 80
端口(targetPort
)映射到服务的 80
端口(port
)上,并且服务类型为 ClusterIP
,意味着只能在集群内部访问。
- 创建 Service:执行
kubectl create -f my-service.yaml
命令,通过kubectl get services
命令可以查看服务的相关信息。
应用更新与回滚
- 更新 Deployment 中的容器镜像(实现应用版本升级):
执行kubectl set image deployment/my-deployment my-container=nginx:new-version
命令(这里假设nginx:new-version
是要更新的新镜像版本),Kubernetes 会自动进行滚动更新,逐个替换旧版本的 Pod 为新版本的 Pod,在更新过程中可以通过kubectl rollout status deployment/my-deployment
命令查看更新进度。 - 回滚 Deployment:
如果更新后出现问题,可以执行kubectl rollout undo deployment/my-deployment
命令进行回滚操作,将 Deployment 回滚到上一个版本的状态。
资源删除
要删除之前创建的资源,可以执行以下命令:
- 删除 Pod:
kubectl delete pod my-pod
(不过通常更建议通过管理 Deployment 等上层资源来间接管理 Pod,直接删除 Pod 可能会被重新创建,如果是由 Deployment 管理的话)。 - 删除 Deployment:
kubectl delete deployment my-deployment
,这会同时删除它管理的所有 Pod。 - 删除 Service:
kubectl delete service my-service
。
以上只是 Kubernetes 的一个非常基础的使用教程,实际应用中它还有很多高级的功能和配置选项,比如配置存储卷、网络策略、资源配额等,需要进一步深入学习和实践来掌握。
原文地址:https://blog.csdn.net/weixin_42267411/article/details/144022541
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!