Azure Kubernetes 概念
复习 Kubernetes 的核心构造——Pod、部署、服务和命名空间——并了解 AKS 如何代表您管理控制平面。
Azure Kubernetes 概念 是 CoddyKit 上的免费 Azure Fundamentals 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Azure Fundamentals 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Azure Fundamentals 课程共包含 4 节课。
什么是 Kubernetes?
Kubernetes(K8s)是一个开源容器编排平台,最初由 Google 开发。它可以自动完成容器化应用的部署、扩展和管理。您不必手动运行容器,而是通过 YAML 清单声明应用的期望状态,Kubernetes 会持续使实际状态与期望状态保持一致,包括重启失败的容器、将工作负载调度到运行状况良好的节点上,以及扩展副本数量。
集群架构:控制平面和节点
Kubernetes 集群由控制平面和工作节点组成。控制平面包含 API 服务器(所有 kubectl 命令的入口)、etcd(分布式状态存储)、调度器(将 Pod 分配给节点)和控制器管理器(维护期望状态)。工作节点运行 kubelet(节点代理)、kube-proxy(网络规则)和容器运行时(containerd)。在 AKS 中,Microsoft 管理控制平面,您只需管理工作节点。
# Kubernetes control plane components
# kube-apiserver - REST API for all cluster operations
# etcd - Distributed key-value store (cluster state)
# kube-scheduler - Assigns pending pods to nodes
# kube-controller-manager - Runs reconciliation controllers
# Worker node components
# kubelet - Node agent, ensures containers run
# kube-proxy - Network routing for services
# containerd - Container runtime (runs containers)Pod:最小可部署单元
Pod 是 Kubernetes 中最小的可部署单元。一个 Pod 封装一个或多个容器,这些容器共享网络命名空间(同一个 IP 地址)、存储卷和生命周期。Pod 内的容器通过 localhost 相互通信。Pod 是临时的——发生故障时,Kubernetes 会用具有不同 IP 地址的新 Pod 替换它。您很少会直接创建 Pod,而是创建管理 Pod 的更高层资源。
# Simple pod manifest
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp
image: mycontainerregistry.azurecr.io/myapp:v1.0
ports:
- containerPort: 80
resources:
requests:
cpu: '100m'
memory: '128Mi'
limits:
cpu: '500m'
memory: '512Mi'Deployment:管理 ReplicaSet
Deployment 是在 Kubernetes 中运行无状态应用的标准方式。它会创建并管理一个ReplicaSet,以维持所需数量的相同 Pod 副本。Deployment 支持滚动更新——逐步用新 Pod 替换旧 Pod——以及回滚到以前的版本。您只需描述期望的 Pod 模板和副本数量,其余工作由 Kubernetes 处理。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # Create 1 extra pod during update
maxUnavailable: 0 # Never reduce below desired count
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: mycontainerregistry.azurecr.io/myapp:v1.0
ports:
- containerPort: 80Service:稳定的网络端点
由于 Pod 是临时的,且其 IP 地址会发生变化,因此 Service 提供稳定的网络端点,将流量负载均衡到匹配的 Pod。Service 使用标签选择器查找 Pod。Service 类型包括:ClusterIP(仅限内部访问,默认类型)、NodePort(在每个节点上公开一个端口)、LoadBalancer(使用公共 IP 配置 Azure Load Balancer)以及 ExternalName(指向外部服务的 DNS 别名)。
# Service exposing myapp pods externally
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
type: LoadBalancer # Creates Azure Load Balancer
selector:
app: myapp # Routes traffic to pods with this label
ports:
- port: 80 # Service port
targetPort: 80 # Pod/container port
# After creation, check the EXTERNAL-IP (Azure LB public IP)
# kubectl get service myapp-svc用于多租户的命名空间
命名空间可以将单个 Kubernetes 集群划分为多个虚拟集群。不同命名空间中的资源按名称隔离——您可以同时在 development 和 production 命名空间中各创建一个名为 myapp 的 Deployment。命名空间是向团队或环境应用 RBAC、资源配额和网络策略的主要单位。默认命名空间包括 default、kube-system 和 kube-public。
# Create a namespace for the dev team
kubectl create namespace dev-team
# Deploy into a specific namespace
kubectl apply -f deployment.yaml --namespace dev-team
# List all resources in a namespace
kubectl get all --namespace dev-team
# Set default namespace for current context
kubectl config set-context --current --namespace dev-teamConfigMaps 和 Secrets
ConfigMaps 将非敏感配置数据存储为键值对或文件,并将其作为环境变量或卷挂载注入 Pod。Secrets 存储敏感数据(密码、令牌),并以 Base64 编码(默认情况下并未加密;如需静态数据的真正加密,请使用 Azure Key Vault Provider for Secrets Store CSI Driver)。二者都限定在命名空间范围内,并在 Pod 规范中通过名称引用。
# Create a ConfigMap from literal values
kubectl create configmap app-config \
--from-literal=APP_ENV=production \
--from-literal=LOG_LEVEL=info
# Create a Secret
kubectl create secret generic db-secret \
--from-literal=DB_PASSWORD='super-secret'
# Reference in a pod spec
# env:
# - name: APP_ENV
# valueFrom:
# configMapKeyRef:
# name: app-config
# key: APP_ENV
# - name: DB_PASSWORD
# valueFrom:
# secretKeyRef:
# name: db-secret
# key: DB_PASSWORDAzure 上的持久卷
有状态应用需要一种生命周期长于单个 Pod 的存储。Kubernetes 使用 PersistentVolumes (PVs) 和 PersistentVolumeClaims (PVCs),将存储与 Pod 生命周期解耦。在 AKS 中,内置的 Azure Disk 和 Azure Files 存储类会在创建 PVC 时自动配置托管磁盘和文件共享。Azure Disk 用于单个 Pod 访问;Azure Files 支持多个 Pod 同时读写。
# PersistentVolumeClaim using Azure Disk
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-disk-pvc
spec:
accessModes:
- ReadWriteOnce # Single-node read/write (Azure Disk)
storageClassName: managed-csi
resources:
requests:
storage: 10Gi
# Mount in a pod
# volumes:
# - name: data
# persistentVolumeClaim:
# claimName: my-disk-pvc
# volumeMounts:
# - name: data
# mountPath: /dataHorizontal Pod Autoscaler
Horizontal Pod Autoscaler (HPA) 会根据观测到的 CPU/内存利用率或自定义指标,自动调整 Deployment 中的 Pod 副本数量。HPA 控制器每 15 秒查询一次指标服务器,并增加或减少副本数量,使利用率保持在接近目标值的水平。您可以设置最小和最大副本数作为限制,防止扩展失控。
# Create an HPA targeting 50% CPU utilisation
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50运行状况检查:Liveness 和 Readiness 探针
Kubernetes 使用探针监控容器运行状况。livenessProbe 检查容器是否仍在运行;如果检查失败,Kubernetes 会重启容器。readinessProbe 检查容器是否已准备好提供流量;如果检查失败,Pod 会从 Service 的负载均衡中移除,但不会重启。startupProbe 会在应用完成初始化之前延迟其他探针,从而避免应用启动缓慢时被过早重启。
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 15
periodSeconds: 20
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 3
startupProbe:
httpGet:
path: /startup
port: 80
failureThreshold: 30
periodSeconds: 10 # Allow 300s for slow startup资源请求和限制
Kubernetes 中的每个容器都应声明资源请求(调度器使用的最低保证分配量)和限制(允许的最大值,超过后容器会受到限流或被终止)。CPU 请求以毫核(m)为单位,1000m = 1 个 CPU 核心。准确设置请求和限制,可以避免嘈杂邻居问题,并帮助调度器在不过度分配资源的情况下,将 Pod 高效地安排到节点上。
resources:
requests:
cpu: '250m' # 0.25 CPU core guaranteed
memory: '256Mi' # 256 MiB guaranteed
limits:
cpu: '1' # Max 1 CPU core
memory: '512Mi' # Max 512 MiB (OOMKilled if exceeded)快速检查
测试您对本课 Microsoft Azure Fundamentals (AZ-900) 概念的理解。
课程回顾
在本课中,您学习了:容器组是共享网络和存储的最小可部署单元;部署负责管理支持滚动更新的无状态副本集;服务提供稳定的终结点,在临时容器组之间进行流量负载均衡。接下来,我们将学习如何在 AKS 上部署工作负载。
常见问题解答
「Azure Kubernetes 概念」课时是免费的吗?
是的 — 「Azure Kubernetes 概念」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Azure Fundamentals 课程的其余内容,请升级到 CoddyKit PRO。 Azure Fundamentals 课程共包含 4 节课。
「Azure Kubernetes 概念」这节课中我会学到什么?
复习 Kubernetes 的核心构造——Pod、部署、服务和命名空间——并了解 AKS 如何代表您管理控制平面。 你通过在浏览器中直接运行的动手代码来练习 Azure Fundamentals,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Azure Fundamentals 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Azure Fundamentals 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Azure Kubernetes 概念」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Azure Fundamentals 课中编写并运行代码吗?
能。每节 Azure Fundamentals 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Azure 容器注册表
- Azure 容器实例
- Azure Kubernetes 概念
- 在 AKS 上部署工作负载