kubernetes

kubernetes

一、Kubernetes 简介

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种可靠、可扩展和高效的方式来管理容器集群,使得应用程序能够在不同的环境中轻松运行。

二、安装 Kubernetes

  1. 安装 Minikube(用于本地开发和测试):

    • Minikube 是一个在本地运行单节点 Kubernetes 集群的工具。
    • 下载并安装 Minikube 对应操作系统的版本。
    • 启动 Minikube:minikube start
  2. 安装 kubectl(Kubernetes 命令行工具):

    • 下载并安装 kubectl 工具。
    • 设置 kubectl 与 Minikube 或实际的 Kubernetes 集群进行通信。

三、Kubernetes 核心概念

  1. 节点(Node):

    • 是 Kubernetes 中可以运行容器化应用的工作机器,可以是物理机或虚拟机。
    • 节点分为主节点(控制平面)和工作节点。
  2. 主节点(Master Node):

    • 负责管理整个集群,包括调度容器、存储配置信息等。
    • 主要组件包括 API 服务器、调度器、控制器管理器等。
  3. 工作节点(Worker Node):

    • 运行实际的容器化应用。
    • 包含容器运行时(如 Docker)、kubelet(与主节点通信并管理容器)、kube-proxy(负责网络代理和负载均衡)。
  4. 容器组(Pod):

    • Kubernetes 中最小的部署单元,一个 Pod 可以包含一个或多个容器,这些容器共享网络命名空间和存储卷。
    • Pod 通常用于部署一个单一的应用程序或一组紧密相关的应用程序。
  5. 服务(Service):

    • 定义了一组 Pod 的访问策略,提供了稳定的网络地址和负载均衡功能。
    • 服务可以通过标签选择器(Label Selector)来选择要关联的 Pod。
  6. 部署(Deployment):

    • 用于管理 Pod 的创建、更新和扩缩容。
    • 可以定义副本数量、更新策略等。
  7. 标签(Label)和选择器(Selector):

    • 用于给资源(如 Pod、Service)打标签,以便进行分类和选择。
    • 选择器可以根据标签来选择特定的资源进行操作。
  8. 命名空间(Namespace):

    • 用于隔离不同的用户、项目或环境。
    • 可以在不同的命名空间中创建独立的资源,避免资源冲突。

四、基本操作

  1. 创建 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
  1. 创建 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。
  2. 创建 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。
  3. 查看资源:

    • 使用kubectl get pods查看 Pod 列表。
    • 使用kubectl get services查看 Service 列表。
    • 使用kubectl get deployments查看 Deployment 列表。
  4. 扩缩容:

    • 使用kubectl scale deployment/nginx-deployment --replicas=5将 Nginx Deployment 的副本数量扩展到 5。
  5. 更新 Deployment:

    • 修改 Deployment 的 YAML 文件,然后使用kubectl apply -f deployment.yaml进行更新。

五、存储管理

  1. 存储卷(Volume):

    • Kubernetes 支持多种类型的存储卷,如 EmptyDir(临时存储)、HostPath(挂载宿主机目录)、PersistentVolume(持久化存储)等。
    • 在 Pod 的 YAML 配置中定义存储卷,并将其挂载到容器中。
  2. PersistentVolume 和 PersistentVolumeClaim:

    • PersistentVolume 是集群中的一块存储资源,可以由管理员预先创建或动态供应。
    • PersistentVolumeClaim 是用户对存储资源的请求,它会绑定到一个合适的 PersistentVolume。

六、网络管理

  1. Kubernetes 网络模型:

    • 每个 Pod 都有自己独立的 IP 地址,并且可以在集群内直接通信。
    • 不同节点上的 Pod 之间的通信通过网络插件(如 Flannel、Calico 等)实现。
  2. Ingress:

    • Ingress 用于将外部流量路由到集群内的服务。
    • 可以通过定义 Ingress 规则来实现 URL 路由、负载均衡等功能。

七、监控和日志管理

  1. 监控:

    • 可以使用 Prometheus 和 Grafana 等工具对 Kubernetes 集群进行监控,收集指标如 CPU 使用率、内存使用率、容器状态等。
  2. 日志管理:

    • 可以使用 Elasticsearch、Fluentd 和 Kibana(EFK 栈)等工具来收集、存储和分析容器的日志。

八、应用部署最佳实践

  1. 蓝绿部署:

    • 同时维护两个版本的应用,通过切换服务指向不同版本的 Deployment 来实现零停机部署。
  2. 滚动更新:

    • 逐步替换旧版本的 Pod 为新版本的 Pod,确保应用的可用性。
  3. 健康检查:

    • 在容器中定义存活探针(liveness probe)和就绪探针(readiness probe),以确保容器的健康状态。
posted @   渔樵江渚  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示