Kubernetes核心概念
Kubernetes核心概念
什么是Kubernetes
Kubernetes(简称K8s)是Google开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它提供了一个以容器为中心的管理环境,可以自动化应用的部署、扩展和操作。
Kubernetes这个名字源于希腊语,意为"舵手"或"飞行员",正如其名,Kubernetes为容器化应用提供了导航和管理的能力。
Kubernetes的核心特性
1. 服务发现和负载均衡
Kubernetes可以使用DNS名称或自己的IP地址公开容器,如果到容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定可靠。
2. 存储编排
Kubernetes允许你自动挂载存储系统,无论是在本地存储、公共云提供商还是网络存储系统(如NFS、iSCSI、Gluster、Ceph、Cinder或Flocker)。
3. 自动部署和回滚
你可以使用Kubernetes描述已部署容器的期望状态,它可以以受控的速率将实际状态更新到期望状态。例如,你可以自动化Kubernetes来为你的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
4. 自动完成装箱计算
你为Kubernetes提供许多节点组成的集群,在这个集群上运行容器化任务。你告诉Kubernetes每个容器需要多少CPU和内存(RAM)。Kubernetes可以将这些容器按实际情况调度到集群中的节点上,以最佳方式利用资源。
5. 自我修复
Kubernetes重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
6. 密钥与配置管理
Kubernetes允许你存储和管理敏感信息,例如密码、OAuth令牌和SSH密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes架构
1. 控制平面(Control Plane)
控制平面负责管理整个Kubernetes集群,包括调度、扩展、更新等操作。
主要组件:
API Server
- Kubernetes控制平面的前端,提供REST API接口
- 所有组件通信的中心枢纽
- 负责验证和配置API对象的数据
etcd
- 一致且高度可用的键值存储
- 保存所有集群数据
- 是Kubernetes的后端数据库
Scheduler
- 监视新创建的、未指定运行节点的Pods
- 选择节点让Pod在上面运行
- 考虑资源需求、策略约束、亲和性/反亲和性等
Controller Manager
- 运行控制器进程
- 包括Node Controller、Replication Controller、Endpoints Controller等
- 管理集群状态
Cloud Controller Manager
- 与底层云提供商交互
- 管理云特定的控制器组件
2. 节点组件(Node Components)
节点组件在每个节点上运行,维护运行的Pod并提供Kubernetes运行环境。
主要组件:
kubelet
- 在集群中的每个节点上运行
- 确保Pod中的容器都运行正常
- 与API Server通信,报告节点状态
kube-proxy
- 在集群中的每个节点上运行
- 维护节点上的网络规则
- 实现Kubernetes服务概念的一部分
容器运行时
- 负责实际运行容器
- 支持Docker、containerd、CRI-O等
Kubernetes核心对象
1. Pod
Pod是Kubernetes中最小的可部署单元,可以包含一个或多个容器。Pod中的容器共享网络和存储资源。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
2. Service
Service定义了一种访问Pod的方式,提供负载均衡和服务发现功能。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
3. Deployment
Deployment为Pod和ReplicaSet提供声明式更新,用于管理应用的部署。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
4. ConfigMap
ConfigMap用于存储非机密性的配置数据,以键值对的形式存储。
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
5. Secret
Secret用于存储敏感信息,如密码、OAuth令牌等。
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
6. Namespace
Namespace提供虚拟集群的支持,用于资源的逻辑隔离。
apiVersion: v1
kind: Namespace
metadata:
name: development
7. Volume
Volume用于Pod中容器间的数据共享和持久化存储。
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
Kubernetes网络模型
1. Pod网络
- 每个Pod都有一个唯一的IP地址
- Pod内的所有容器共享同一个网络命名空间
- 同一Pod内的容器可以通过localhost通信
2. Service网络
- Service有虚拟IP(ClusterIP)
- 提供负载均衡和服务发现
- 通过标签选择器关联Pod
3. 集群网络
- 所有Pod可以在不使用NAT的情况下相互通信
- 所有节点可以在不使用NAT的情况下与所有Pod通信
- Pod看到自己的IP与其他人看到的IP相同
Kubernetes存储模型
1. Volume
Volume是Pod中能够被多个容器访问的共享目录,生命周期与Pod相同。
2. PersistentVolume (PV)
PV是集群中的一块存储,由管理员配置,与具体的Pod生命周期无关。
3. PersistentVolumeClaim (PVC)
PVC是用户对存储的请求,类似于Pod消费节点资源的方式。
4. StorageClass
StorageClass为管理员提供了描述存储"类"的方法,可以动态分配PV。
Kubernetes工作负载
1. Deployment
用于管理无状态应用,支持滚动更新和回滚。
2. StatefulSet
用于管理有状态应用,提供稳定的网络标识和持久化存储。
3. DaemonSet
确保全部(或一些)节点上运行一个Pod副本,常用于日志收集、监控等。
4. Job
创建一个或多个Pod,确保指定数量的Pod成功终止。
5. CronJob
按照预定时间创建Job,类似于Linux的cron。
Kubernetes常用命令
# 查看集群信息
kubectl cluster-info
# 查看节点
kubectl get nodes
# 查看Pod
kubectl get pods
# 查看服务
kubectl get services
# 查看部署
kubectl get deployments
# 创建资源
kubectl apply -f filename.yaml
# 删除资源
kubectl delete -f filename.yaml
# 查看资源详细信息
kubectl describe pod pod-name
# 查看日志
kubectl logs pod-name
# 进入容器
kubectl exec -it pod-name -- /bin/bash
Kubernetes最佳实践
1. 资源管理
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
2. 健康检查
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
3. 标签和选择器
metadata:
labels:
app: myapp
version: v1.0
environment: production
总结
Kubernetes作为容器编排的事实标准,提供了强大的容器管理能力。理解Kubernetes的核心概念是掌握容器编排技术的基础。通过合理的架构设计和资源配置,可以构建高可用、可扩展的容器化应用平台。