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),以确保容器的健康状态。

浙公网安备 33010602011771号