kubernetes
kubernetes
一、Kubernetes 简介
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种可靠、可扩展和高效的方式来管理容器集群,使得应用程序能够在不同的环境中轻松运行。
二、安装 Kubernetes
-
安装 Minikube(用于本地开发和测试):
- Minikube 是一个在本地运行单节点 Kubernetes 集群的工具。
- 下载并安装 Minikube 对应操作系统的版本。
- 启动 Minikube:
minikube start
。
-
安装 kubectl(Kubernetes 命令行工具):
- 下载并安装 kubectl 工具。
- 设置 kubectl 与 Minikube 或实际的 Kubernetes 集群进行通信。
三、Kubernetes 核心概念
-
节点(Node):
- 是 Kubernetes 中可以运行容器化应用的工作机器,可以是物理机或虚拟机。
- 节点分为主节点(控制平面)和工作节点。
-
主节点(Master Node):
- 负责管理整个集群,包括调度容器、存储配置信息等。
- 主要组件包括 API 服务器、调度器、控制器管理器等。
-
工作节点(Worker Node):
- 运行实际的容器化应用。
- 包含容器运行时(如 Docker)、kubelet(与主节点通信并管理容器)、kube-proxy(负责网络代理和负载均衡)。
-
容器组(Pod):
- Kubernetes 中最小的部署单元,一个 Pod 可以包含一个或多个容器,这些容器共享网络命名空间和存储卷。
- Pod 通常用于部署一个单一的应用程序或一组紧密相关的应用程序。
-
服务(Service):
- 定义了一组 Pod 的访问策略,提供了稳定的网络地址和负载均衡功能。
- 服务可以通过标签选择器(Label Selector)来选择要关联的 Pod。
-
部署(Deployment):
- 用于管理 Pod 的创建、更新和扩缩容。
- 可以定义副本数量、更新策略等。
-
标签(Label)和选择器(Selector):
- 用于给资源(如 Pod、Service)打标签,以便进行分类和选择。
- 选择器可以根据标签来选择特定的资源进行操作。
-
命名空间(Namespace):
- 用于隔离不同的用户、项目或环境。
- 可以在不同的命名空间中创建独立的资源,避免资源冲突。
四、基本操作
- 创建 Pod:
- 可以使用 YAML 配置文件来定义 Pod。
- 例如,创建一个包含一个 Nginx 容器的 Pod:
apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx image: nginx - 使用
kubectl apply -f pod.yaml
命令创建 Pod。
Pod的资源清单
apiVersion: v1 #必选,版本号,例如v1 kind: Pod #必选,资源类型,例如 Pod metadata: #必选,元数据 name: string #必选,Pod名称 namespace: string #Pod所属的命名空间,默认为"default" labels: #自定义标签列表 - name: string spec: #必选,Pod中容器的详细定义 containers: #必选,Pod中容器列表 - name: string #必选,容器名称 image: string #必选,容器的镜像名称 imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略 command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令 args: [string] #容器的启动命令参数列表 workingDir: string #容器的工作目录 volumeMounts: #挂载到容器内部的存储卷配置 - name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名 mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符 readOnly: boolean #是否为只读模式 ports: #需要暴露的端口库号列表 - name: string #端口的名称 containerPort: int #容器需要监听的端口号 hostPort: int #容器所在主机需要监听的端口号,默认与Container相同 protocol: string #端口协议,支持TCP和UDP,默认TCP env: #容器运行前需设置的环境变量列表 - name: string #环境变量名称 value: string #环境变量的值 resources: #资源限制和请求的设置 limits: #资源限制的设置 cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数 memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数 requests: #资源请求的设置 cpu: string #Cpu请求,容器启动的初始可用数量 memory: string #内存请求,容器启动的初始可用数量 lifecycle: #生命周期钩子 postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启 preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止 livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器 exec: #对Pod容器内检查方式设置为exec方式 command: [string] #exec方式需要制定的命令或脚本 httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port path: string port: number host: string scheme: string HttpHeaders: - name: string value: string tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式 port: number initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒 timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒 periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次 successThreshold: 0 failureThreshold: 0 securityContext: privileged: false restartPolicy: [Always | Never | OnFailure] #Pod的重启策略 nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上 nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上 imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定 - name: string hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络 volumes: #在该pod上定义共享存储卷列表 - name: string #共享存储卷名称 (volumes类型有很多种) emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值 hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录 path: string #Pod所在宿主机的目录,将被用于同期中mount的目录 secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部 scretname: string items: - key: string path: string configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部 name: string items: - key: string path: string
-
创建 Service:
- 定义 Service 来暴露 Pod 的网络访问。
- 例如,创建一个 ClusterIP 类型的 Service:
apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 - 使用
kubectl apply -f service.yaml
命令创建 Service。
-
创建 Deployment:
- 使用 Deployment 来管理 Pod 的副本数量和更新。
- 例如,创建一个有三个副本的 Nginx Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx - 使用
kubectl apply -f deployment.yaml
命令创建 Deployment。
-
查看资源:
- 使用
kubectl get pods
查看 Pod 列表。 - 使用
kubectl get services
查看 Service 列表。 - 使用
kubectl get deployments
查看 Deployment 列表。
- 使用
-
扩缩容:
- 使用
kubectl scale deployment/nginx-deployment --replicas=5
将 Nginx Deployment 的副本数量扩展到 5。
- 使用
-
更新 Deployment:
- 修改 Deployment 的 YAML 文件,然后使用
kubectl apply -f deployment.yaml
进行更新。
- 修改 Deployment 的 YAML 文件,然后使用
五、存储管理
-
存储卷(Volume):
- Kubernetes 支持多种类型的存储卷,如 EmptyDir(临时存储)、HostPath(挂载宿主机目录)、PersistentVolume(持久化存储)等。
- 在 Pod 的 YAML 配置中定义存储卷,并将其挂载到容器中。
-
PersistentVolume 和 PersistentVolumeClaim:
- PersistentVolume 是集群中的一块存储资源,可以由管理员预先创建或动态供应。
- PersistentVolumeClaim 是用户对存储资源的请求,它会绑定到一个合适的 PersistentVolume。
六、网络管理
-
Kubernetes 网络模型:
- 每个 Pod 都有自己独立的 IP 地址,并且可以在集群内直接通信。
- 不同节点上的 Pod 之间的通信通过网络插件(如 Flannel、Calico 等)实现。
-
Ingress:
- Ingress 用于将外部流量路由到集群内的服务。
- 可以通过定义 Ingress 规则来实现 URL 路由、负载均衡等功能。
七、监控和日志管理
-
监控:
- 可以使用 Prometheus 和 Grafana 等工具对 Kubernetes 集群进行监控,收集指标如 CPU 使用率、内存使用率、容器状态等。
-
日志管理:
- 可以使用 Elasticsearch、Fluentd 和 Kibana(EFK 栈)等工具来收集、存储和分析容器的日志。
八、应用部署最佳实践
-
蓝绿部署:
- 同时维护两个版本的应用,通过切换服务指向不同版本的 Deployment 来实现零停机部署。
-
滚动更新:
- 逐步替换旧版本的 Pod 为新版本的 Pod,确保应用的可用性。
-
健康检查:
- 在容器中定义存活探针(liveness probe)和就绪探针(readiness probe),以确保容器的健康状态。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战