Kubernetes知识综合备忘单

Kubernetes(通常称为 K8s)是一种广泛采用的容器编排平台,可简化容器化应用程序的部署、扩展和管理。

在传统模型中,由于基础设施和配置的变化,跨不同环境部署应用程序带来了挑战。 Kubernetes 通过提供一个统一的平台来消除底层基础设施的复杂性,从而应对这些挑战。它允许开发人员跨各种环境一致地部署和管理应用程序,从而促进可移植性和可扩展性。

快速参考表

  • Pod荚    Kubernetes 中最小的可部署单元。
  • Node节点    集群中的物理机或虚拟机。
  • 部署    描述一组 Pod 的所需状态。
  • 服务    定义一组 Pod 和访问它们的策略。
  • 标签    附加到对象的键值对,允许灵活的分类和选择。用于识别和分组相关资源。
  • 掌握    Kubernetes 中的控制平面,管理集群的整体状态。组件包括 API 服务器、etcd、控制器管理器和调度程序。

基本命令
通过对术语和架构的基本了解,让我们掌握管理 Kubernetes 集群的基本命令。 
这些命令对于了解 Kubernetes 集群内的状态、配置和可用资源至关重要。它们提供了集群信息、版本、配置、可用 API 资源和版本的快速概述。

  • kubectl cluster-info    显示集群中master和服务的端点信息。
  • kubectl version    显示客户端和服务器上运行的 Kubernetes 版本。
  • kubectl config view    获取集群的配置。
  • kubectl api-resources    列出可用的 API 资源。
  • kubectl api-versions    列出可用的 API 版本。
  • kubectl get all --all-namespaces    列出所有命名空间中的所有内容。

Pod 和容器
Pod 是 Kubernetes 中最小的可部署单元,代表集群中正在运行的进程的单个实例。 Pod 是基本构建块,可以包含一个或多个共享相同网络命名空间的容器,允许它们使用 localhost 相互通信。 

容器是一个轻量级、独立且可执行的软件包,其中包含运行软件所需的一切,包括代码、运行时、库和系统工具。容器为应用程序提供一致且隔离的环境,确保它们在不同环境中一致运行。

用于创建、管理 Pod 和排除故障的常用命令

  • kubectl apply -f <pod_configuration>    应用 YAML 文件中指定的配置来创建或更新 pod。
  • kubectl get pods    列出默认命名空间中的所有 Pod。
  • kubectl get pods --all-namespaces    列出所有命名空间中的所有 pod。
  • kubectl describe pod <pod_name>    显示有关特定 Pod 的详细信息。
  • kubectl logs <pod_name>    查看特定 Pod 的日志。
  • kubectl exec -it <pod_name> -- /bin/bash    在正在运行的容器内打开交互式 shell。
  • kubectl delete pod <pod_name>    删除特定的 Pod。
  • kubectl apply -f <pod_configuration>    应用 YAML 文件中指定的配置来创建或更新 pod。
  • kubectl port-forward <pod_name> <local_port>:<pod_port>    将端口从 pod 转发到本地计算机。

Kubernetes 环境中有效容器化的最佳实践
有效的容器化对于 Kubernetes 环境中应用程序的顺利部署和管理至关重要。以下是优化容器化应用程序的关键最佳实践:

  • 遵守单一职责原则,确保每个容器都有特定且定义明确的角色。这促进了模块化并简化了维护。
  • 通过减少不必要的层和依赖项来最小化容器映像的大小。较小的映像可提高部署速度并减少资源消耗。
  • 利用环境变量来配置您的应用程序。这增强了灵活性,使得在不修改容器映像的情况下更容易调整设置。
  • 在您的应用程序中实施运行状况探测,以使 Kubernetes 能够评估其运行状况。这有助于自动修复并确保可靠的应用程序性能。
  • 设置CPU、内存等资源限制,防止容器消耗过多资源。这确保了公平的资源分配,并防止一个行为不当的容器影响同一节点上的其他容器。

用于创建多容器 Pod 的代码片段
在 Kubernetes 中使用多容器 Pod 可以增强同一 Pod 中容器之间的协作和资源共享。以下是演示不同多容器模式的代码片段。

1、边车模式
sidecar 容器与主应用程序容器一起运行,在不更改核心应用程序的情况下提供附加功能。

apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: main-container
    image: main-image:latest
    ports:
    - containerPort: 80
  - name: sidecar-container
    image: sidecar-image:latest

2、Ambassador 
在此模式中,Ambassador 容器充当中介,代表主应用程序处理通信和网络相关任务。

apiVersion: v1
kind: Pod
metadata:
  name: ambassador-pod
spec:
  containers:
  - name: main-container
    image: main-image:latest
    ports:
    - containerPort: 80
  - name: ambassador-container
    image: ambassador-image:latest
    ports:
    - containerPort: 8080


3、适配器模式
适配器容器在数据到达主应用程序之前对其进行转换或适配,从而提供一个无缝集成点。

apiVersion: v1
kind: Pod
metadata:
  name: adapter-pod
spec:
  containers:
  - name: main-container
    image: main-image:latest
    ports:
    - containerPort: 80
  - name: adapter-container
    image: adapter-image:latest
    ports:
    - containerPort: 9090

部署和副本集
部署和副本集是 Kubernetes 的基本组件,在管理集群内应用程序的部署、扩展和更新生命周期方面发挥着重要作用。

部署是 Kubernetes 中更高层次的抽象,有助于对应用程序生命周期进行声明式定义。

ReplicaSet 与部署密切相关,充当控制器,确保指定数量的相同 pod 复制始终在运行。

部署的生命周期以及 ReplicaSet 如何确保高可用性
Kubernetes 中的部署管理 Pod 的部署和扩展,提供一种声明式方法来定义所需状态。生命周期涉及几个关键阶段:

  • Creation:使用所需数量的副本和 Pod 模板规范创建 Deployment。
  • ReplicaSet Generation:Deployment 创建一个关联的 ReplicaSet,以确保指定数量的 pod 副本正在运行。
  • Pod 创建:ReplicaSet 根据定义的模板创建单独的 Pod。
  • 缩放:可以通过调整所需的副本数量来进行缩放。部署可确保维护正确数量的 Pod。
  • Rolling Updates滚动更新:更新应用程序时,Deployment 使用更新的配置创建新的 ReplicaSet,同时逐渐缩小旧的 ReplicaSet。
  • Termination终止:旧的ReplicaSet最终缩放为零,更新完成。

使用部署扩展应用程序和管理滚动更新的备忘单
扩展部署

  • 扩展到特定数量的副本:kubectl scale deployment <deployment_name> --replicas=<num>
  • 基于 CPU 利用率的自动缩放:kubectl autoscale deployment <deployment_name> --cpu-percent=<percentage> --min=<min_replicas> --max=<max_replicas>
  • 管理滚动更新
  • 使用新映像更新部署:kubectl set image deployment/<deployment_name> <container_name>=<new_image>
  • 监控滚动更新进度:kubectl rollout status deployment/<deployment_name>
  • 回滚到以前的版本:kubectl rollout undo deployment/<deployment_name>
  • 暂停和恢复滚动更新:kubectl rollout pause deployment/<deployment_name>以及kubectl rollout resume deployment/<deployment_name>
  • 自定义更新策略(例如金丝雀部署):kubectl apply -f canary-deployment-strategy.yaml

这些命令提供了扩展部署以满足需求和有效管理滚动更新的快速参考。无论是调整副本数量还是使用不同策略编排更新,此备忘单都有助于简化 Kubernetes 环境中的部署过程。

创建和更新 ReplicaSet 的代码示例
创建副本集

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: example-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: app-container
        image: example-image:latest

  • 此 YAML 配置定义了一个名为 example-replicaset 的 ReplicaSet。
  • 它指定应维护 pod 的三个副本。
  • Pod 模板包含一个名为 app-container 的容器,使用 example-image:latest 镜像。

更新ReplicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: example-replicaset
spec:
  replicas: 5  # Update the number of replicas
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: app-container
        image: updated-example-image:latest  # Update the container image

  • 此 YAML 配置更新名为 example-replicaset 的现有 ReplicaSet。
  • 它将所需的副本数量修改为 5。
  • Pod 模板已更新为使用 Updated-example-image:latest 容器镜像。

服务和网络
服务定义了用于访问一组 Pod 的稳定端点,而网络包含了在这些 Pod 之间实现有效通信的机制。 

用于创建和管理 Kubernetes 服务的备忘单
1、创建服务
从 YAML 文件创建服务:kubectl apply -f service-definition.yaml
示例服务定义.yaml:

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

2、管理服务

  • 列出默认命名空间中的所有服务:kubectl get services
  • 删除服务:kubectl delete service <service_name>
  • 将部署公开为服务:kubectl expose deployment <deployment_name> --port=<external_port>

3、服务发现

  • 了解服务详情:kubectl describe service <service_name>
  • 检索服务的 ClusterIP:kubectl get service <service_name> -o jsonpath='{.spec.clusterIP}'

用于定义服务和公开应用程序的 YAML 示例
集群IP服务

apiVersion: v1
kind: Service
metadata:
  name: clusterip-service
spec:
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

  • 此 YAML 配置定义了一个名为 clusterip-service 的 ClusterIP 服务。
  • 它选择带有标签 app: example 的 Pod。
  • 该服务在内部公开端口 80,并将流量路由到 Pod 的端口 8080。

节点端口服务

apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: NodePort

  • 此 YAML 配置创建一个名为 nodeport-service 的 NodePort 服务。
  • 它选择标记为 app: example 的 pod。
  • 该服务在每个节点上公开端口 80,将流量转发到端口 8080 上的选定 Pod。

负载均衡服务

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service
spec:
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

  • 此 YAML 配置定义了一个名为 loadbalancer-service 的 LoadBalancer 服务。
  • 它选择标记为 app: example 的 pod。
  • 该服务公开端口 80,并且在云环境中,会配置特定于云的负载均衡器以将流量分配到选定的 Pod。

配置和安全
ConfigMap允许集中管理非敏感配置详细信息,而 Secret 则提供用于存储密码等敏感信息的安全机制。 
Kubernetes 中的关键配置和实际用例:

  • ConfigMaps配置映射    应用程序的集中配置管理。
  • Secrets 安全地存储密码等敏感信息。
  • 资源限制    限制容器的资源消耗。
  • 环境变量    将配置详细信息传递给容器。
  • 卷安装    在容器和 Pod 之间共享文件和目录。
  • 标签和注释    用于在 Kubernetes 中组织和查询对象的元数据。

管理和使用Secret 的安全实践

  • 使用 Kubernetes Secrets:利用内置的 Kubernetes Secrets API 安全地存储敏感信息。
  • 加密传输中的数据:确保组件之间交换的数据经过加密,尤其是在处理敏感信息时。
  • 基于角色的访问控制 (RBAC):实施 RBAC 来控制对 Secret 的访问,仅允许授权实体检索敏感数据。
  • 避免硬编码秘密:避免直接在应用程序代码或配置文件中硬编码秘密。
  • 定期轮换机密:定期轮换密码和加密密钥,以最大程度地减少潜在安全漏洞的影响。

在 Kubernetes Pod 中使用 ConfigMap 和 Secrets 的代码片段
在 Pod 中使用 ConfigMap

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
  - name: app-container
    image: app-image:latest
    envFrom:
    - configMapRef:
        name: example-configmap

  • 此 YAML 配置定义了一个名为 configmap-pod 的 pod。
  • envFrom 字段引用名为 example-configmap 的 ConfigMap。
  • ConfigMap 中的值作为环境变量注入到 pod 中。

在 Pod 中使用 Secret

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: app-container
    image: app-image:latest
    envFrom:
    - secretRef:
        name: example-secret

  • 此 YAML 配置创建一个名为 Secret-pod 的 pod。
  • envFrom 字段引用名为 example-secret 的 Secret。
  • Secret 中的值作为环境变量注入到 pod 中。

创建配置映射
kubectl create configmap example-configmap --from-literal=key1=value1 --from-literal=key2=value2

  • 此命令创建一个名为 example-configmap 的 ConfigMap。
  • 它包括可由引用此 ConfigMap 的 pod 访问的键值对(key1=value1 和 key2=value2)。

监控和故障排除
Kubernetes 中的监控和故障排除涉及对集群内问题的持续观察和解决。 Prometheus、Grafana 和 cAdvisor 等监控工具可提供对集群运行状况的深入了解,而故障排除则涉及识别和解决 Pod、节点、网络和服务中的常见问题。 

用于排查 Kubernetes 集群中常见问题的备忘单

  • Pod 问题:
    • 检查 Pod 日志:kubectl logs <pod_name>
    • 描述 pod 以获取详细信息:kubectl describe pod <pod_name>
  • 节点问题:
    • 查看节点:kubectl get nodes
    • 检查节点事件:kubectl describe node <node_name>
  • 网络问题:
    • 检查网络策略:kubectl get networkpolicies
  • 服务问题:
    • 验证服务状态:kubectl get services
  • 配置问题:
    • 检查ConfigMap:kubectl get configmaps
  • 资源问题:
    • 查看资源使用情况:kubectl top nodes or kubectl top pods
  • 集群信息:
    • 获取集群信息:kubectl cluster-info
  • API 资源:
    • 列出可用的 API 资源:kubectl api-resources
  • 版本信息:
    • 检查 Kubernetes 版本:kubectl version

高级主题
Helm 图表备忘单和 Kubernetes 中的高效包管理

  • 安装Helm :curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
  • 添加 Helm 存储库:helm repo add stable https://charts.helm.sh/stable
  • 安装 Helm Chart:helm install my-release stable/<chart_name>
  • 升级 Helm 版本:helm upgrade my-release stable/<chart_name>
  • 卸载 Helm 版本:helm uninstall my-release

设置持久卷和持久卷声明的代码示例
定义持久卷(example-pv.yaml)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /path/to/host/folder

使用主机路径定义一个名为 example-pv 、容量为 1Gi 的持久卷。
创建持久卷声明 (example-pvc.yaml)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

创建名为 example-pvc 的持久卷声明,请求具有 ReadWriteOnce 访问权限的 1Gi 存储。
在 Pod 中使用持久卷声明 (example-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: app-container
    image: app-image:latest
    volumeMounts:
    - mountPath: /app/data
      name: data-volume
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: example-pvc

  • 使用指定镜像定义一个名为 example-pod 的 Pod,其中包含一个容器。
  • 使用持久卷声明 (example-pvc) 挂载卷(数据卷)。

附加命令
用于节点管理
Kubernetes 中的节点是构成集群计算基础设施的物理机或虚拟机。这些命令允许用户检查、标记和管理节点以获得最佳集群性能。

  • kubectl get nodes    显示集群中节点的信息。
  • kubectl describe node <node_name>    显示有关特定节点的详细信息。
  • kubectl label nodes <node_name> <label>    将标签附加到节点以进行分类。
  • kubectl cordon <node_name>    将节点标记为不可安排维护。
  • kubectl uncordon <node_name>    允许以前不可调度的节点调度 Pod。
  • kubectl drain <node_name>    在维护之前从节点安全地逐出所有 Pod。

对于命名空间管理
Kubernetes 中的命名空间是物理集群内的虚拟集群,提供隔离和组织。这些命令有助于命名空间的管理,使用户能够创建和检查它们。

  • kubectl get namespaces    列出集群中的所有命名空间。
  • kubectl create namespace <namespace_name>    创建一个新的命名空间。
  • kubectl describe namespace <namespace_name>    显示有关特定命名空间的详细信息。

服务命令
Kubernetes 中的服务提供了一个稳定的端点来访问一组 Pod。这些命令有助于管理服务,允许用户公开部署并处理服务配置。

  • kubectl get services    列出默认命名空间中的所有服务。
  • kubectl get services --all-namespaces    列出所有命名空间中的所有服务。
  • kubectl describe service <service_name>    显示有关服务的详细信息。
  • kubectl expose deployment <deployment_name> --port=<external_port>    将部署公开为服务。
  • kubectl delete service <service_name>    删除特定服务。

部署命令
Kubernetes 中的部署定义了一组 Pod 的所需状态。这些命令有助于管理部署,允许用户扩展、检查和修改部署配置。

  • kubectl get deployments    列出默认命名空间中的所有部署。
  • kubectl get deployments --all-namespaces    列出所有命名空间中的所有部署。
  • kubectl describe deployment <deployment_name>    显示有关特定部署的详细信息。
  • kubectl scale deployment <deployment_name> --replicas=<num>    扩展部署中的副本数量。