简介
本全面的 Kubernetes 课程旨在让你掌握使用 Kubernetes 平台有效部署、管理和扩展容器化应用程序所需的知识和技能。无论你是开发人员、DevOps 工程师还是 IT 专业人员,本课程都将让你深入了解 Kubernetes 架构、核心组件和高级功能,使你能够构建和维护强大、可扩展且安全的基于 Kubernetes 的系统。
本全面的 Kubernetes 课程旨在让你掌握使用 Kubernetes 平台有效部署、管理和扩展容器化应用程序所需的知识和技能。无论你是开发人员、DevOps 工程师还是 IT 专业人员,本课程都将让你深入了解 Kubernetes 架构、核心组件和高级功能,使你能够构建和维护强大、可扩展且安全的基于 Kubernetes 的系统。
Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。它最初由谷歌开发,现在由云原生计算基金会(Cloud Native Computing Foundation,CNCF)维护。
容器化是一种将应用程序及其所有依赖项、库和配置打包并部署到一个称为容器的独立自包含单元中的方法。Docker 是最流行的容器化平台,提供用于构建、部署和管理容器的工具及运行时环境。
要开始使用 Kubernetes,你需要设置一个 Kubernetes 集群,这可以在本地或云环境中完成。常见的选择包括 minikube(用于本地开发)、托管的 Kubernetes 服务(如 Amazon EKS、Google GKE 或 Azure AKS),或自行管理的 Kubernetes 集群。
Kubernetes 采用主从架构,其中主节点管理整个集群,而工作节点运行容器化应用程序。Kubernetes 架构的关键组件如下:
API 服务器是 Kubernetes 集群的中央控制点。它公开 Kubernetes API,所有其他组件都通过该 API 与集群进行交互。
调度器负责根据资源需求、约束条件和策略将新容器放置到可用的工作节点上。
控制器管理器是一组控制器的集合,用于管理集群状态,例如复制控制器,它确保运行所需数量的 Pod 副本。
etcd 是一个分布式键值存储,Kubernetes 用它来存储所有集群数据,包括配置信息、集群状态以及运行中容器的元数据。
kubelet 是在每个工作节点上运行的主要“节点代理”。它负责与 API 服务器通信、执行 Pod 操作并报告节点状态。
kube-proxy 是在每个工作节点上运行的网络代理,负责实现 Kubernetes 网络模型,包括负载均衡和服务发现。
Kubernetes 使用声明式配置,即你定义应用程序的期望状态,Kubernetes 将努力维护该状态。这通过 Kubernetes 对象(如 Pod、Deployment、Service 等)来完成,这些对象在 YAML 或 JSON 文件中定义。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:v1
ports:
- containerPort: 80
根据你的需求和基础设施,有几种方法可以部署 Kubernetes 集群:
kubeadm 是一个用于在本地或云端引导 Kubernetes 集群的流行工具。以下是一个如何使用 kubeadm 创建 Kubernetes 集群的示例:
## 在主节点上
## 在工作节点上
--discovery-token-ca-cert-hash sha256:<哈希值>
## 在主节点上配置 kubectl
kubectl 是用于与 Kubernetes 集群交互的主要命令行工具。一些常见的 kubectl 命令包括:
命令 | 描述 |
---|---|
kubectl get nodes |
列出集群中的所有节点 |
kubectl get pods |
列出集群中的所有 Pod |
kubectl create -f my-deployment.yaml |
从 YAML 文件创建新的 Kubernetes 对象 |
kubectl describe pod my-pod |
描述特定 Pod 的详细信息 |
kubectl logs my-pod |
查看特定 Pod 的日志 |
kubectl delete pod my-pod |
删除特定的 Pod |
Kubernetes 集群需要定期维护和升级,以确保其安全性和保持最新状态。这包括:
Kubernetes 提供了工具和策略,以在对运行中的应用程序造成最小停机时间和干扰的情况下执行这些任务。
Kubernetes 提供了多个用于部署和管理应用程序的对象,包括:
要在 Kubernetes 上部署应用程序,通常创建一个 Deployment 对象,并在 YAML 文件中定义容器镜像、资源需求和其他配置细节:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:v1
ports:
- containerPort: 80
然后可以使用 kubectl create -f my-deployment.yaml
创建 Deployment。
Kubernetes 提供了多种扩展应用程序的方法:
replicas
字段。apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
Kubernetes 支持滚动更新,允许在不停机的情况下更新正在运行的应用程序的容器镜像或配置。如果更新引入问题,也可以轻松回滚到先前版本。
## 更新容器镜像
kubectl set image deployment/my-app my-app=my-app:v2
## 回滚到先前版本
kubectl rollout undo deployment/my-app
Kubernetes 遵循特定的网络模型,以确保 Pod、服务与外部世界之间的通信。Kubernetes 网络模型的关键组件包括:
Kubernetes 支持不同类型的服务,以满足各种网络需求:
服务类型 | 描述 |
---|---|
ClusterIP | 在集群内部 IP 上暴露服务,使服务仅在集群内部可访问。 |
NodePort | 在每个节点的 IP 上的静态端口暴露服务,使服务在集群外部可访问。 |
LoadBalancer | 创建一个外部负载均衡器(例如在云提供商上),并为服务分配一个稳定的 IP 地址。 |
ExternalName | 将服务映射到外部 DNS 名称,而不创建任何代理或负载均衡。 |
Kubernetes 提供了两种主要的服务发现机制:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
然后,Pod 可以使用 DNS 名称 my-service.default.svc.cluster.local
(其中 default
是命名空间)访问该服务。
Kubernetes 提供了多种方式来管理容器化应用程序的存储:
持久卷(PV)是可以静态或动态预配置的存储资源。存储类提供了一种定义不同类型存储(如 SSD 或 HDD)及其预配置参数的方法。
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/my-pv
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
fstype: ext4
encrypted: "true"
应用程序使用持久卷声明(PVC)来请求存储资源。Kubernetes 将根据请求的存储大小和访问模式自动将合适的 PV 绑定到 PVC。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
卷被挂载到容器中,允许应用程序读取和写入数据。Kubernetes 支持各种卷类型,包括 emptyDir、hostPath 和特定于云提供商的卷。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app:v1
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: my-pvc
监控对于了解 Kubernetes 集群及其上运行的应用程序的健康状况和性能至关重要。Kubernetes 提供了多个内置监控工具,并与各种第三方监控解决方案集成,例如:
Kubernetes 提供了多种管理容器和集群本身日志的方法:
kubectl logs
命令进行访问。当 Kubernetes 集群出现问题时,可以使用多种工具和技术进行故障排除:
通过结合这些工具和技术,你可以有效地诊断和解决 Kubernetes 环境中的问题。
Kubernetes 提供了多种认证和授权机制:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] ## "" 表示核心 API 组
resources: ["pods"]
verbs: ["get", "watch", "list"]
Kubernetes API 服务器是集群的中央入口点,因此正确保护它至关重要:
--anonymous-auth
和 --basic-auth-file
。Kubernetes 提供了多种保护 Pod 和网络的方法:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-external-access
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
Kubernetes 密钥提供了一种存储和管理敏感信息(如密码、API 密钥和证书)的方法。密钥可以作为文件挂载或在 Pod 中作为环境变量公开。
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
Kubernetes 允许你通过定义自己的自定义资源定义(CRD)来扩展其功能。CRD 使你能够创建和管理自定义资源,这些资源可以像内置的 Kubernetes 资源一样被对待。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: myresources.example.com
spec:
group: example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: myresources
singular: myresource
kind: MyResource
shortNames:
- mr
操作员是一种打包、部署和管理 Kubernetes 应用程序的方式。它们通过自定义资源和控制器扩展 Kubernetes API,从而实现复杂应用程序管理的自动化。操作员中心是查找和共享 Kubernetes 操作员的中央存储库。
Helm 是 Kubernetes 的包管理器,可简化应用程序的部署和管理。Helm 图表是预配置的 Kubernetes 清单文件,可以轻松地进行版本控制、共享和安装。
## 安装 Helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
## 搜索并安装 Helm 图表
helm search hub wordpress
helm install my-wordpress stable/wordpress
使用 Kubernetes 的一些最佳实践包括:
通过遵循这些最佳实践,你可以构建和维护健壮、可扩展且可靠的基于 Kubernetes 的应用程序。
在本 Kubernetes 课程中,你将学习 Kubernetes 和容器化的基础知识,探索 Kubernetes 架构和核心组件,并深入了解在 Kubernetes 集群上部署和管理应用程序。你还将发现高级 Kubernetes 概念,如自定义资源定义、操作员和 Helm 图表,以及监控、日志记录、安全等方面的最佳实践。完成本课程后,你将具备充分利用 Kubernetes 的强大功能来简化应用程序部署和管理流程的能力,确保高可用性、可扩展性和可靠性。