Pod :Kubernetes 中的最小部署单元,它可以包含一个或多个容器(通常是一个),容器在同一个 Pod 中共享网络和存储资源。
Deployment :Pod 的生命周期管理、调度和扩缩容。
Service :定义了一种访问 Pod 的方式,通常提供负载均衡。
StatefulSet :管理有状态的应用,并保证了 Pod 的部署顺序和唯一性。
ConfigMap: 用于存储配置信息。
Secret: 用于存储敏感信息,如密码和密钥,Secret 在 API 中以加密形式存储,以提供更安全的数据管理。
Volume: 提供了一种存储机制,允许数据在 Pod 中的容器之间共享和持久化。
Namespace: 是 Kubernetes 中的一种隔离机制,用于将集群资源划分为多个逻辑分区。
apiVersion: v1
kind: Namespace
metadata:
name: <namespace-name>
kubectl apply -f namespace.yaml
kubectl config set-context --current --namespace=<namespace-name>
kubectl get pods -n <namespace-name>
Kubernetes 的主要组件,集群由控制平面(Control Plane)组件和工作节点(Worker Nodes)组件组成
Kubernetes 要求所有 Pod 能够直接通信,不需要网络地址转换(NAT),且每个 Pod 都分配有一个唯一的 IP 地址。
kubectl get pods -o wide
kubectl describe pod <pod-name>
Kubernetes 使用 ResourceQuota 对象来定义和限制每个 Namespace 可以消耗的资源量,同时可以使用 LimitRange 来约束每个 Pod 或容器可以使用的资源。
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-resource-quota
namespace: mynamespace
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
pods: "10"
services: "5"
replicationcontrollers: "5"
resourcequotas: "1"
persistentvolumeclaims: "10"
secrets: "10"
configmaps: "10"
services.loadbalancers: "2"
services.nodeports: "2"
在这个示例中,针对的是特定命名空间’mynamespace’进行资源限制:
自动扩缩容通过 HorizontalPodAutoscaler (HPA) 实现,它自动调整 Pod 的数量基于 CPU 或其他监控指标。
创建hpa.yaml的yaml文件
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
在这个示例中:
执行hpa.yaml文件
kubectl apply -f hpa.yaml
Note: 确保你的 Pods 和 Deployment 配置了资源请求。HPA 使用这些请求来计算 Pod 的 CPU 使用率。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: my-container
image: nginx
resources:
requests:
cpu: "100m" # 请求 100 millicpu
memory: "200Mi" # 请求 200 MiB 内存
limits:
cpu: "200m" # 设置 CPU 使用上限为 200 millicpu
memory: "400Mi" # 设置内存使用上限为 400 MiB
在这个例子中,resources.requests.cpu 和 resources.requests.memory 定义了每个 Pod 的 CPU 和内存请求。这些值是 HPA 用来计算使用率并进行扩缩容决策的基础。
Ingress 是一个 API 对象,它管理外部访问集群中的服务,可以提供负载均衡、SSL 终端和基于名称的虚拟托管。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
注意事项
蓝绿部署通常通过创建两个版本的 Deployment 实现,然后通过切换 Service 指向不同的 Deployment 来切换流量。
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
version: blue
ports:
- protocol: TCP
port: 80
targetPort: 9376
当准备好将流量切换到绿色部署时,更新 Service 的选择器:
spec:
selector:
app: myapp
version: green
滚动更新是 Kubernetes Deployment 的默认策略,更新 Deployment 的配置(例如,更新应用的镜像版本)。它逐渐替换旧版本的 Pod。
kubectl rollout status
kubectl rollout undo
应用配置可以通过 ConfigMap 和 Secrets 管理,它们可以作为环境变量、命令行参数或配置文件挂载到 Pod 中。
Kubernetes 中的服务发现是指在集群内部定位和连接到服务的过程。Kubernetes 提供了几种机制来实现服务发现,主要通过 Service 资源和 DNS。
当你在 Kubernetes 中创建一个 Service 时,它会自动获得一个与之关联的内部 DNS 名称。这个名称可以在集群的所有 Pod 中使用,允许它们通过服务名称发现并连接到服务。
ClusterIP:每个 Service 都会被分配一个内部 IP 地址(称为 ClusterIP)。这个地址在集群内部是可达的,允许集群内的其他 Pod 通过 IP 地址连接到服务。
DNS 解析:Kubernetes 集群通常运行一个内部 DNS 服务(如 CoreDNS),它为每个 Service 自动创建 DNS 记录。Pod 可以通过服务的名称解析这个 DNS 记录,从而获得服务的 IP 地址。
例如,如果有一个名为 “my-service” 的 Service 在 “my-namespace” 命名空间中,那么在同一命名空间中的 Pod 可以通过 my-service 访问该服务,而在其他命名空间中的 Pod 可以通过 my-service.my-namespace 访问。
当 Pod 启动时,Kubernetes 也会为每个活动的 Service 设置一组环境变量。这些环境变量包括服务的名称和 ClusterIP。Pod 可以使用这些环境变量来发现和连接到服务。
当 Service 被创建时,Kubernetes 会创建一个同名的 Endpoints 对象。这个对象包含了与 Service 的选择器匹配的所有 Pod 的 IP 地址和端口信息。当 Pod 状态改变时,Endpoints 对象会相应地更新,从而保证服务发现的准确性。
在应用代码中,你通常会通过服务的名称(DNS 解析)或环境变量来连接到其他服务。例如,如果一个微服务需要连接到名为 “database-service” 的数据库服务,它可以简单地连接到 database-service,DNS 解析会自动将这个名称转换为相应的 IP 地址。
总之,Kubernetes 的服务发现机制提供了一个简单且一致的方式来在集群内部定位和通信服务,无论后端 Pod 的实际 IP 地址如何变化。
Kubernetes 的安全特性包括:RBAC 授权、Pod Security Policies、网络策略、TLS 证书和 Secret 管理等。
RBAC 是一种基于角色的访问控制,它使用 Role 和 RoleBinding 对象为 Kubernetes API 定义权限和授权。
网络策略通过 NetworkPolicy 资源定义,它允许你控制 Pod 间的网络访问规则。
PSP 是一种集群级别的安全特性,它定义了 Pod 运行所需的条件,以减少潜在的安全风险。
Pod 的健康状况通过 Liveness 和 Readiness 探针进行监控。
Liveness Probes 确定何时需要重启容器。例如,如果应用程序处于死锁状态,无法对外提供服务,liveness probe 将检测到这种状态,并重启出现问题的容器,以恢复正常服务。
Readiness Probes 判断容器何时准备好开始接受流量。只有当容器的 readiness probe 成功时,流量才会被路由到该容器。这对于在容器启动期间依赖于外部资源的应用程序特别有用,确保服务不会开始接收请求,直到它真正准备好。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
在这个例子中:
Kubernetes 本身不存储日志,但可以使用 kubectl logs 命令获取容器日志。对于长期日志存储,通常需要集成外部日志记录解决方案,如 ELK 栈或 Fluentd。
常用工具包括 Prometheus 用于指标收集,Grafana 用于数据可视化,以及 Alertmanager 用于警报。
包括编写 Dockerfile 构建应用的容器镜像、推送到容器镜像仓库、编写 Kubernetes 配置文件(如 Deployment 和 Service),然后使用 kubectl apply 将配置应用到 Kubernetes 集群。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
ports:
- containerPort: 80
例如,创建一个名为 service.yaml 的文件。
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: myapp
调试 Kubernetes 的问题可以通过检查 Pod 状态、查看日志、执行 kubectl describe 来获取更多信息,以及进入 Pod 内部进行检查。
升级可以通过更新 Kubernetes 集群的版本或更改应用的配置和镜像版本实现。回滚可以使用 Deployment 的历史版本来进行,通过 kubectl rollout 命令。
规划持久化存储通常涉及选择合适的存储类型(如 PersistentVolumes 和 StorageClasses)和确定存储的大小、性能和备份策略。
根据应用是否有状态、更新模式、访问模式等因素选择合适的对象,如 Deployment、StatefulSet 或 DaemonSet。
考虑的因素包括集群的扩展性、多租户和资源隔离、网络设计、存储和持久化需求、监控和日志、安全性和合规性以及灾难恢复策略。
检查 Pod 的状态和事件,查看日志,检查是否有资源限制、错误的镜像名或配置错误。
查看 Service 和 Ingress 配置是否正确,检查网络策略,确保 Pod 之间的通信不受限制,以及查看相关的日志和指标。
可以使用 kubectl top 查看资源使用情况,检查是否有资源瓶颈,通过指标和日志确定性能瓶颈的位置,以及可能需要调整的资源请求和限制。
目标用户和用途:面向中到大型生产环境,是一个功能强大的容器编排系统。
可伸缩性和复杂性:设计用于处理大规模、高可用性和跨多主机的容器部署。
功能范围:包括自动部署、扩展和管理容器化应用程序的复杂功能。
使用场景:适用于需要高度可伸缩性和复杂容器管理的大型项目和企业级部署。