Ubuntu TechHive
docker-orchestra-swarm-k8s-kubernetes-for-beginners.md
Docker 编排(Swarm | K8s)—— Kubernetes 入门指南
article.细节

Docker 编排(Swarm | K8s)—— Kubernetes 入门指南

reading.进展 12 分钟阅读数

Docker Orchestra (Swarm | K8s) 简介 -- Kubernetes 初学者指南

Docker 编排 (Swarm | K8s) – Kubernetes 入门

Kubernetes

是什么?(定义)

中文

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它为管理分布式系统提供了一个强大且灵活的框架,并抽象了管理单个容器的复杂性,使开发人员能够专注于构建和交付应用程序。

法文

Kubernetes est une plateforme d'orchestration de conteneurs open-source qui automatise le déploiement, le dimensionnement et la gestion des applications conteneurisées. Elle offre un cadre robuste et flexible pour gérer les systèmes distribués et abstrait la complexité de la gestion des conteneurs individuels, permettant aux développeurs de se concentrer sur la construction et la livraison d'applications.

简史

中文

Kubernetes,通常缩写为 K8s,源于对大规模管理和编排容器化应用程序的需求。它最初由 Google 开发,并于 2014 年开源。该项目迅速普及,目前由 云原生计算基金会 (CNCF) 维护,并得到了全球活跃开发人员社区的贡献。

法文

Kubernetes, souvent abrégé K8s, est né de la nécessité de gérer et d'orchestrer des applications conteneurisées à grande échelle. Il a été initialement développé par Google et publié en open source en 2014. Le projet a rapidement gagné en popularité et est maintenant maintenu par la Cloud Native Computing Foundation (CNCF), avec des contributions d'une communauté dynamique de développeurs du monde entier.

架构与关键组件

/public/img/articles/miscellaneous/k8s-full-overview.png

中文

  • Master Node(主节点):Kubernetes 集群的控制平面,负责管理和协调集群内的所有活动。它包括 API 服务器、调度器和控制器管理器等各种组件。
  • Worker Nodes(工作节点):也称为“Minions”或“Kubelets”,这些节点负责运行容器并执行工作负载。每个工作节点都运行 Kubernetes 运行时(例如 Docker),并与主节点通信以接收指令并报告容器的状态。
  • Pod:Kubernetes 中的基本部署单元。Pod 是一个或多个容器的逻辑组,它们共享网络和存储资源。Pod 内的容器可以使用 localhost 相互通信,从而实现共存和紧密耦合。
  • Service:Kubernetes Service 为访问一组 Pod 提供了一个稳定的端点。它抽象了 Pod 底层的动态 IP 地址,并提供负载均衡和服务发现功能。

法文

  • Master Node : Le plan de contrôle du cluster Kubernetes, responsable de la gestion et de la coordination de toutes les activités au sein du cluster. Il comprend divers composants tels que le serveur API, le planificateur et le gestionnaire de contrôle.
  • Worker Nodes : Également appelés "Minions" ou "Kubelets", ces nœuds sont responsables de l'exécution des conteneurs et de l'exécution des charges de travail. Chaque nœud de travail exécute le runtime Kubernetes (par exemple, Docker) et communique avec le nœud maître pour recevoir des instructions et signaler l'état des conteneurs.
  • Pod : L'unité de base de déploiement dans Kubernetes. Un pod est un groupe logique d'un ou plusieurs conteneurs qui partagent des ressources réseau et de stockage. Les conteneurs à l'intérieur d'un pod peuvent communiquer entre eux en utilisant localhost, ce qui les rend co-localisés et étroitement couplés.
  • Service : Un service Kubernetes fournit un point de terminaison stable pour accéder à un ensemble de pods. Il abstrait les adresses IP dynamiques sous-jacentes des pods et offre des capacités d'équilibrage de charge et de découverte de services.

Kubernetes 组件

/public/img/articles/miscellaneous/k8s-pics.png

Kubernetes 控制平面

中文

控制平面是 Kubernetes 的大脑

控制平面的组件:

  • *etcd*:用于存储集群状态的分布式键值存储
  • *kube-apiserver*:公开 Kubernetes API 并处理 API 请求
  • *kube-controller-manager*:管理各种控制器以维护所需的集群状态
  • *kube-scheduler*:根据资源需求和约束将 Pod 分配给可用节点

法文

Le Plan de Contrôle, en tant que cerveau de Kubernetes

Composants du Plan de Contrôle :

  • etcd : Base de donnees de clés-valeurs distribué pour stocker l'état du cluster
  • kube-apiserver : Expose l'API Kubernetes et gère les requêtes API
  • kube-controller-manager : Gère divers contrôleurs pour maintenir l'état souhaité du cluster
  • kube-scheduler : Attribue des Pods aux machines(nodes) disponibles en fonction des besoins en ressources et des contraintes

Kubernetes 节点

中文

节点是 Kubernetes 集群中的工作机器 节点的组件:

  • *kubelet*:在每个节点上运行并管理 Pod 的代理
  • *kube-proxy*:处理服务的网络路由和负载均衡
  • *Container runtime*:负责运行容器的软件(例如 Docker、containerd)

法文

Machines de travail dans un cluster Kubernetes Composants d'un nœud :

  • kubelet : Agent qui s'exécute sur chaque nœud et gère les Pods
  • kube-proxy : Gère le routage réseau et l'équilibrage de charge pour les Services
  • Runtime de conteneurs : Logiciel responsable de l'exécution des conteneurs (par exemple, Docker, containerd)

Kubernetes 网络

中文

容器化环境中的网络挑战 Pod 内的容器间通信

集群网络:

  • *Pod network*:用于跨节点 Pod 之间通信的网络覆盖
  • *Service network*:用于负载均衡和服务发现的虚拟 IP 地址
  • *Ingress*:将外部流量路由到集群内的服务

法文:

Défis de mise en réseau dans les environnements conteneurisés Communication entre conteneurs au sein d'un Pod

Réseau du cluster : Réseau Pod : Superposition réseau pour la communication entre les Pods sur les différents nœuds Réseau Service : Adresses IP virtuelles pour l'équilibrage de charge et la découverte de services Ingress : Renvoie le trafic externe vers les Services à l'intérieur du cluster

Kubernetes 的优势

中文

Kubernetes 的优势

graph LR
A[Kubernetes 的优势]
A --> B[可扩展性]
A --> C[高可用性]
A --> D[自动化部署]
A --> E[负载均衡]
A --> F[自我修复]
A --> G[可移植性]

style A fill:#f2f2f2, stroke:#333, stroke-width:2px;
style B fill:#80bfff, stroke:#333, stroke-width:2px;
style C fill:#80bfff, stroke:#333, stroke-width:2px;
style D fill:#80bfff, stroke:#333, stroke-width:2px;
style E fill:#80bfff, stroke:#333, stroke-width:2px;
style F fill:#80bfff, stroke:#333, stroke-width:2px;
style G fill:#80bfff, stroke:#333, stroke-width:2px;

  1. *可扩展性*:Kubernetes 允许应用程序根据资源需求动态添加或删除 Pod,从而实现水平扩展。它确保工作负载均匀分布在可用资源上,保持高可用性并优化资源利用率。
  2. *服务发现和负载均衡*:Kubernetes 提供了内置的服务发现和负载均衡机制。Service 抽象了网络配置的复杂性,并实现了集群内微服务之间的无缝通信。
  3. *自我修复和自动重启*:Kubernetes 监控应用程序的健康状况,并在容器失败或无响应时自动重启容器或重新调度 Pod。这种自我修复能力有助于确保应用程序的高可用性和弹性。
  4. *滚动更新和回滚*:Kubernetes 支持滚动更新,允许您在不中断服务的情况下更新应用程序。它逐步用新容器替换旧容器,确保平稳过渡。如果出现问题,Kubernetes 可以轻松回滚到以前的版本。
  5. *资源管理*:Kubernetes 提供了管理和分配应用程序资源(如 CPU 和内存)的机制。它允许您为单个容器设置资源限制和请求,防止资源争用并优化性能。
  6. *声明式配置*:Kubernetes 使用声明式配置文件(YAML 或 JSON)来定义系统的期望状态。它持续监控并将实际状态与期望状态进行协调,确保系统保持在期望状态,并自动进行任何必要的调整。

法文

Avantages de Kubernetes

graph LR
A[Avantages de Kubernetes]
A --> B[Scalabilité]
A --> C[Haute disponibilité]
A --> D[Déploiements automatisés]
A --> E[Équilibrage de charge]
A --> F[Autoguérison]
A --> G[Portabilité]

style A fill:#f2f2f2, stroke:#333, stroke-width:2px;
style B fill:#80bfff, stroke:#333, stroke-width:2px;
style C fill:#80bfff, stroke:#333, stroke-width:2px;
style D fill:#80bfff, stroke:#333, stroke-width:2px;
style E fill:#80bfff, stroke:#333, stroke-width:2px;
style F fill:#80bfff, stroke:#333, stroke-width:2px;
style G fill:#80bfff, stroke:#333, stroke-width:2px;

  1. Scalabilité : Kubernetes permet aux applications de se dimensionner horizontalement en ajoutant ou en supprimant dynamiquement des pods en fonction de la demande en ressources. Il veille à ce que la charge de travail soit répartie de manière équilibrée sur les ressources disponibles, assurant ainsi une haute disponibilité et une utilisation optimale des ressources.
  2. Découverte de services et équilibrage de charge : Kubernetes offre des mécanismes intégrés de découverte de services et d'équilibrage de charge. Les services permettent de masquer les complexités de la configuration réseau et facilitent la communication transparente entre les microservices au sein du cluster.
  3. Autoréparation et redémarrage automatique : Kubernetes surveille l'état de santé des applications et redémarre automatiquement les conteneurs ou réordonnance les pods en cas de défaillance ou d'absence de réponse. Cette capacité d'autoréparation garantit une haute disponibilité et une résilience des applications.
  4. Mises à jour progressives et réversions : Kubernetes prend en charge les mises à jour progressives, vous permettant de mettre à jour les applications sans interruption de service. Il remplace progressivement les anciens conteneurs par les nouveaux, assurant une transition fluide. En cas de problème, Kubernetes facilite les réversions vers la version précédente.
  5. Gestion des ressources : Kubernetes propose des mécanismes pour gérer et allouer les ressources aux applications, telles que le CPU et la mémoire. Il vous permet de définir des limites et des demandes de ressources pour chaque conteneur, évitant les conflits de ressources et optimisant les performances.
  6. Configuration déclarative : Kubernetes utilise des fichiers de configuration déclaratifs (YAML ou JSON) pour définir l'état souhaité du système. Il surveille en permanence et concilie l'état réel avec l'état souhaité, garantissant ainsi que le système reste dans l'état souhaité et effectuant automatiquement les ajustements nécessaires.

Kubernetes 核心概念

节点与集群

Kubernetes 核心概念

graph LR
A[Pod]
B[ReplicaSet]
C[Deployment]
D[Service]
E[Namespace]
F[Node]
G[PersistentVolume]
H[PersistentVolumeClaim]
I[ConfigMap]
J[Secret]

style A fill:#80bfff, stroke:#333, stroke-width:2px;
style B fill:#80bfff, stroke:#333, stroke-width:2px;
style C fill:#80bfff, stroke:#333, stroke-width:2px;
style D fill:#80bfff, stroke:#333, stroke-width:2px;
style E fill:#80bfff, stroke:#333, stroke-width:2px;
style F fill:#80bfff, stroke:#333, stroke-width:2px;
style G fill:#80bfff, stroke:#333, stroke-width:2px;
style H fill:#80bfff, stroke:#333, stroke-width:2px;
style I fill:#80bfff, stroke:#333, stroke-width:2px;
style J fill:#80bfff, stroke:#333, stroke-width:2px;

A --> B
B --> C
C --> D
C --> E
D --> F
E --> G
G --> H
C --> I
C --> J

中文

在 Kubernetes 中,节点(Node)是运行容器的物理或虚拟机器。它是负责执行任务和运行实际工作负载的工作机器。Kubernetes 集群中的每个节点都安装了必要的组件,例如容器运行时(例如 Docker)、kubelet(与 API 服务器交互)和 kube-proxy(用于网络)。

集群(Cluster)是一组协同工作以形成 Kubernetes 环境的节点集合。集群实现了高可用性、负载均衡和可扩展性。它们由控制集群的主节点和托管容器的多个工作节点组成。

法文

Dans Kubernetes, un nœud est une machine physique ou virtuelle qui exécute des conteneurs. C'est une machine de travail chargée d'exécuter des tâches et d'exécuter les charges de travail réelles. Chaque nœud au sein d'un cluster Kubernetes dispose des composants nécessaires installés, tels que le runtime de conteneurs (par exemple, Docker), le kubelet (qui interagit avec le serveur API) et le kube-proxy (pour la mise en réseau).

Un cluster est un groupe de nœuds qui travaillent ensemble pour former un environnement Kubernetes. Les clusters permettent une haute disponibilité, l'équilibrage de charge et la scalabilité. Ils se composent d'un nœud maître, qui contrôle le cluster, et de plusieurs nœuds de travail qui hébergent les conteneurs.

Pods 与容器

中文

Pod 是 Kubernetes 中最小的可部署单元。它代表一个或多个共享相同网络命名空间、IP 地址和存储资源的容器的逻辑组。Pod 内的容器是共存和共同调度的,允许它们使用 localhost 相互通信。Pod 为应用程序提供了隔离的执行环境,并且可以轻松复制和扩展。 另一方面,容器是轻量级的、独立的、可执行的软件包,封装了应用程序代码、依赖项和运行时环境。容器由容器镜像创建,镜像是一种只读模板,包含运行应用程序所需的一切。Kubernetes 使用容器运行时(如 Docker)来启动和管理 Pod 内的容器。

法文

Un pod est l'unité de déploiement la plus petite dans Kubernetes. Il représente un groupe logique d'un ou plusieurs conteneurs qui partagent le même espace de réseau, la même adresse IP et les mêmes ressources de stockage. Les conteneurs à l'intérieur d'un pod sont co-localisés et co-planifiés, ce qui leur permet de communiquer entre eux en utilisant localhost. Les pods fournissent un environnement d'exécution isolé pour les applications et peuvent être facilement répliqués et mis à l'échelle. Les conteneurs, en revanche, sont des packages exécutables autonomes et légers qui encapsulent le code de l'application, les dépendances et les environnements d'exécution. Les conteneurs sont créés à partir d'images de conteneurs, qui sont des modèles en lecture seule contenant tout ce qui est nécessaire pour exécuter une application. Kubernetes utilise des runtimes de conteneurs (comme Docker) pour démarrer et gérer les conteneurs à l'intérieur des pods.

部署 (Deployments)

中文

部署(Deployments)是 Kubernetes 资源,支持对 Pod 及其关联的 ReplicaSet 进行声明式管理。部署定义了应用程序的期望状态,包括应该运行的 Pod 副本(副本)数量。

法文

Les déploiements sont des ressources Kubernetes qui permettent la gestion déclarative des pods et de leurs ensembles de réplicas associés. Un déploiement définit l'état souhaité de l'application, y compris le nombre de réplicas (copies) du pod qui doivent être en cours d'exécution.

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

副本集 (ReplicaSet)

中文

副本集(Replica Sets)确保始终维持所需的 Pod 副本数量。它们负责根据定义的部署配置创建和扩展 Pod。副本集监控 Pod 的健康状况,并可以自动替换失败或终止的 Pod 以维持期望状态。

部署和副本集为管理应用程序部署提供了重要的功能,支持滚动更新、回滚和扩展操作。它们确保了高可用性、容错能力和应用程序生命周期的轻松管理。

法文

Les Replica Sets garantissent que le nombre souhaité de répliques de pods est toujours maintenu. Ils sont responsables de la création et de la mise à l'échelle des pods en fonction de la configuration de déploiement définie. Les Replica Sets surveillent l'état de santé des pods et peuvent remplacer automatiquement les pods défaillants ou terminés pour maintenir l'état souhaité.

Les déploiements et les Replica Sets offrent des fonctionnalités importantes pour la gestion des déploiements d'applications, permettant des mises à jour progressives, des réversions et des opérations de mise à l'échelle. Ils garantissent une haute disponibilité, une tolérance aux pannes et une gestion facile des cycles de vie des applications.

副本集示例

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # modify replicas according to your case
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3

服务 (Services)

中文

Kubernetes 中的服务(Services)为访问一组 Pod 提供了一个稳定的端点。它们实现了服务发现和负载均衡,允许客户端访问应用程序,而无需知道单个 Pod 的确切 IP 地址或端口。

法文

Les services dans Kubernetes fournissent un point de terminaison stable pour accéder à un ensemble de pods. Ils permettent la découverte de services et l'équilibrage de charge, permettant aux clients d'accéder à l'application sans avoir besoin de connaître les adresses IP ou les ports exacts des pods individuels.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

负载均衡 (Load Balancing)

中文

负载均衡确保客户端请求均匀分布在可用 Pod 上,从而提高应用程序的性能和可用性。它实现了应用程序的水平扩展和对流量高峰的无缝处理。

Kubernetes 提供不同类型的服务,包括 ClusterIP、NodePort 和 LoadBalancer。ClusterIP 服务提供集群内的内部网络访问,而 NodePort 服务在每个节点上的静态端口上公开应用程序。LoadBalancer 服务通常用于云环境,以在外部公开应用程序并自动配置负载均衡器。

法文

L'équilibrage de charge garantit que les demandes des clients sont réparties de manière équitable entre les pods disponibles, améliorant ainsi les performances et la disponibilité de l'application. Il permet le dimensionnement horizontal de l'application et la gestion transparente des pics de trafic.

Kubernetes propose différents types de services, notamment ClusterIP, NodePort et LoadBalancer. Les services ClusterIP permettent un accès réseau interne au sein du cluster, tandis que les services NodePort exposent l'application sur un port statique sur chaque nœud. Les services LoadBalancer sont généralement utilisés dans les environnements cloud pour exposer l'application de manière externe et provisionner automatiquement un équilibrage de charge.

Ingress

中文

Ingress 将 HTTP 和 HTTPS 路由从集群外部公开到集群内的服务。流量路由由 Ingress 资源上定义的规则控制。

法文

Ingress expose les routes HTTP et HTTPS depuis l'extérieur du cluster vers les services à l'intérieur du cluster. La circulation est contrôlée par des règles définies sur la ressource Ingress.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

演示 (DEMO)

Docker + Minikube

graph LR
A[Docker]
B[Image]
C[Container]
D[Minikube]
E[Virtual Machine]
F[Kubernetes Cluster]

style A fill:#80bfff, stroke:#333, stroke-width:2px;
style B fill:#80bfff, stroke:#333, stroke-width:2px;
style C fill:#80bfff, stroke:#333, stroke-width:2px;
style D fill:#80bfff, stroke:#333, stroke-width:2px;
style E fill:#80bfff, stroke:#333, stroke-width:2px;
style F fill:#80bfff, stroke:#333, stroke-width:2px;

A --> B
B --> C
D --> E
E --> F

前置条件

1-安装 Docker

2-安装 Minikube (仅限 Mac OS)

# 安装 minikube
brew install minikube

# 设置 docker 为引擎
minikube config set driver docker

# 启动 minikube
minikube start --driver=docker
==> Fetching minikube
==> Downloading https://ghcr.io/v2/homebrew/core/minikube/manifests/1.30.1
Already downloaded: /Users/chiefkemist/Library/Caches/Homebrew/downloads/81c9fce44a16655222dac1d280fb070da9f2d2f29e41bd8e8c6e06ee412ff62b--minikube-1.30.1.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/minikube/blobs/sha256:d74c3581ec6420d173393cdffe19dd104cf65c49f6cf7a8b6161aa165d4f2085
Already downloaded: /Users/chiefkemist/Library/Caches/Homebrew/downloads/aaec261695ad4b0bfc49551f3637dd82dc32049ced3704ce747bda73becb65af--minikube--1.30.1.arm64_ventura.bottle.tar.gz
==> Pouring minikube--1.30.1.arm64_ventura.bottle.tar.gz

# set docker as engine
minikube config set driver docker

# start minikube
minikube start --driver=docker
==> Caveats
zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
==> Summary
🍺  /opt/homebrew/Cellar/minikube/1.30.1: 9 files, 77.5MB
==> Running `brew cleanup minikube`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

创建部署 (Deployment)

# 运行以下命令:
# 注意:要访问 Kubernetes,需要使用 kubectl 命令。此命令告诉 Kubernetes(或本例中的 minikube)
# 部署位于以下 URL 的 'deployment'。

kubectl apply -f https://raw.githubusercontent.com/istio/istio/ \
release-1.17/samples/bookinfo/platform/kube/bookinfo.yaml

# 等待几秒钟并检查节点和服务是否已启动
kubectl get pods

# 检查服务 - 您应该看到所有服务都已启动 1/1
kubectl get services

# 为 minikube 启用 ingress 插件
minikube addons enable ingress

部署 Ingress 资源

Web + K8s

graph LR
A[Client]
B[Ingress Controller]
C[Kubernetes Cluster]
D[Service]
E[Pod]

style A fill:#80bfff, stroke:#333, stroke-width:2px;
style B fill:#80bfff, stroke:#333, stroke-width:2px;
style C fill:#80bfff, stroke:#333, stroke-width:2px;
style D fill:#80bfff, stroke:#333, stroke-width:2px;
style E fill:#80bfff, stroke:#333, stroke-width:2px;

A --> B
B --> C
C --> D
D --> E

创建一个名为 bookinfo-ingress.yaml 的文件并添加以下内容

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: bookinfo-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: localhost
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
                service:
                name: productpage
                port:
                  number: 9080

运行以下命令来部署 ingress

kubectl apply -f docker-orchestra-swarm-k8s/k8s/booking-info-ingress.yaml

启动 minikube tunnel

# 打开一个单独的终端并运行以下命令
minikube tunnel

检查站点

打开浏览器并导航到 localhost:80 访问该站点。

删除所有资源

minikube delete --all