继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Kubernetes入门指南:容器编排初学者教程

BIG阳
关注TA
已关注
手记 473
粉丝 73
获赞 458
开始使用 Kubernetes:Kubernetes 的核心概念介绍

Kubernetes

Kubernetes(通常缩写为 K8s)是一个开源系统,旨在自动部署、扩展和管理容器化应用。最初由 Google 开发,现在在各行业广泛应用。

Kubernetes (kē bù niǔ) 管理容器在多台机器上的调度和运行,确保资源利用最优化和高可用性保障。

所以,什么是软件容器?你可以查阅我写的 Docker 相关文章的。

从零到Docker:一步一步的容器化教程Docker入门:初学者的容器化应用

容器是轻量级、独立且可执行的软件单元,包含运行该软件所需的所有内容,包括代码、运行时、库和依赖项。Docker 是最流行的容器运行时环境,但 Kubernetes 也支持其他运行时环境。

容器化应用程序。 来源链接

当你只有几个容器时,手动管理它们还是可以的。但当你有几十、几百甚至几千个容器时,这就会变得非常麻烦。Kubernetes 自动化了这些容器的部署、扩展和管理过程。

作者制作的图片。[由Claude制作]

Kubernetes(K8s)—提供了一系列强大的功能:

  • 它负责在节点集群中部署和运行容器。它确保容器在需要运行的时间和位置正常运行,并处理它们高效分布的复杂性。
  • 它支持容器的横向和纵向扩展。

水平扩展和垂直扩展。Source

  • 水平 Pod 自动伸缩(HPA)根据 CPU 或内存使用等指标来调整 Pod 的数量,而垂直 Pod 自动伸缩(VPA)则调整单个 Pod 的资源需求。还有集群自动伸缩,它根据工作负载需求调整节点数量。

HPA-VPA 自动扩展器。来源链接

  • Kubernetes 会自动重启失败的容器,在节点宕机时重新调度这些容器,并替换或杀死未通过健康检查的容器,来确保应用程序的高可用性。
  • 它通过逐步更新 pod 到新版本并在出现问题时回滚到之前的状态,支持零停机部署,所有这些操作都不会影响服务的连续性。
Kubernetes集群
Kubernetes

Kubernetes集群由一组机器(节点)组成,这些机器协同工作来运行容器化的应用程序。

Kubernetes集群, 了解更多

控制层面(左边),也叫主节点,负责整个Kubernetes集群的管理。

我们不在主节点上运行应用程序,它更像是Kubernetes的控制中心。

Kubernetes架构图。原文链接

  • API Server 是 Kubernetes 的入口,所有请求都通过这里进入。它处理身份验证、授权和准入控制。
  • 调度器 会根据资源可用性和约束条件,把 Pod 分配给合适的节点。
  • 控制器管理器 负责运行各种控制器进程,以保持集群的稳定状态。每个控制器监视不同组件的状态,并努力使当前状态与期望状态一致。
  • etcd 是一个分布式键值存储数据库,用于存储 Kubernetes 的所有集群数据,包括配置、状态和元数据。它是集群状态的唯一真实来源。如果 etcd 丢失或损坏,集群将无法正常工作。

我们将应用程序部署到工作节点(worker节点)。每个工作节点运行应用程序任务并与控制平面保持通信。

每个工作节点上都运行着一个 kubelet 代理,负责确保容器按预期运行,并与控制平面进行通信。

此外,每个节点都有一个代理。

kube-proxy (k-proxy): 在节点上维护网络规则,使 pod 之间的网络通信成为可能。

Pods. 请参阅

一个 Pod 是 Kubernetes 中最小的可部署组件。它是一个抽象,包括一个或多个容器实例、存储、网络配置和元数据。

可以将 pod 看作是围绕容器的包装,它提供了,

  • 共享网络名称空间(所有容器在同一个Pod内共享同一个IP地址和端口空间)。
  • 共享存储卷(volume)。
  • 一个调度和资源分配的单元。

每个工作节点在 Kubernetes 中可以运行多个 Pod.

一个 Pod 可以包含一个或多个容器,这些容器可以共享存储和网络资源,通常最好是每个 Pod 运行一个应用。

Kubernetes 根据资源可用性来决定 Pod 应该运行在哪个节点上。

Ingress 是一个 Kubernetes API 对象,它管理服务对外的访问,通常通过 HTTP/HTTPS 反向代理。例如。

用户在浏览器里输入了 https://some-app.com 这个网址。

Ingress。 来源链接

请求到达 ingress 控制器。控制器会检查 ingress rules,以确定哪个服务应该处理该请求。

这些服务让应用程序能够被访问,以支持内部和外部的交流。

请求被路由到 some-app 服务,然后该服务将其转到运行该应用的相应 pod。

如果应用程序需要抓取数据,它会通过内部与数据库服务交流,比如。

一个 ConfigMap 用于单独存储非敏感的配置数据,使其与应用代码分离。它允许你将特定环境的配置(如数据库连接字符串、API 密钥或特性标志)与容器化应用程序分离。

ConfigMaps(配置映射)。来源链接

Ingress 在集群内公开应用 Hollow App Pod,使用户可以访问它。

ConfigMap 存储了应用程序与数据库通信所需的数据库连接字符串。空应用容器读取该连接字符串,然后应用它来建立与数据库的连接。

相反地,Kubernetes 中的 Secret 实际上是用来存储敏感信息的,例如密码、API 密钥、令牌和证书。与 ConfigMaps 不同的是,Secrets 以编码格式存储,不会以明文形式暴露。

卷(volumes)用来为 Pod 内的容器提供持久存储。与本地于容器的存储不同,后者当容器重启时不会丢失数据,而卷在整个 Pod 的生命周期中持久化数据。

Volumes。来源链接

我们有不同的工作负载控制器:部署、状态集和守护集。

视频链接: 来源

部署指的是用于无状态应用,其中Pods之间可以互换,不需要固定的网络标识或持久存储。Pod会随机命名。

StatefulSet 适用于需要保持状态的应用程序,确保 Pod 保持稳定的标识和持久化存储。Pod 会严格按照顺序创建。

DaemonSet 确保在每个(或特定的)节点上运行一个 Pod(一个副本),并且在集群中的每个节点上也都会运行一个 Pod。

Minikube

注:Minikube是一个用于本地开发的Kubernetes最小化安装工具。

Minikube 是一个开源工具,帮助您在个人电脑上本地运行 Kubernetes 集群。

它很轻量,让我们可以运行单节点 Kubernetes 集群。它主要用于学习、开发和测试 K8s 应用,而无需完整的生产环境。

你可以下载它:

minikube startminikube 是一个本地 Kubernetes,专注于让 Kubernetes 学习和开发变得简单。你只需要 Docker 就行了。

下载好了,我们开始吧。

    minikube start
``` (启动 minikube)

这会在我的电脑上启动一个集群环境。
okan@yeniguno:~$ minikube start  
😄  minikube v1.35.0 on Ubuntu 24.04  
✨  基于现有配置文件使用 docker 驱动  
💨  为提高 Docker 性能,请通过 'modprobe overlay' 启用 overlay Linux 内核模块  

⛔  请求的内存分配(1833MB)小于推荐的最小值 1900MB,部署可能会失败。  

👍  启动 "minikube" 集群中的 "minikube" 主节点  
🚜  拉取基础镜像 v0.0.46 ...  
🏃  更新运行中的 docker "minikube" 容器 ...  
🐳  准备 Kubernetes v1.32.0 环境在 Docker 27.4.1 上...  
🔎  验证 Kubernetes 组件 ...  
    ▪ 使用镜像 gcr.io/k8s-minikube/storage-provisioner:v5  
🌟  启用插件:storage-provisioner、default-storageclass  
🏄  完成!kubectl 默认集群为 "minikube",默认命名空间为 "default"

如果没有安装 Docker Desktop 的话,请下载 Docker Desktop。

## [Docker DesktopDocker Desktop 是一款专为开发者设计的协作容器技术工具。立即下载并开始使用 Docker Desktop。www.docker.com](https://www.docker.com/products/docker-desktop/?source=post_page-----5c7d2ae8ba32---------------------------------------)

接下来,我们需要下载一下 **kubectl**。

kubectl,简称kubectl,是管理Kubernetes集群的命令行工具。

## [在 Linux 上安装和设置 kubectl 之前,您需要使用与您的集群版本相差不超过一个小版本的 kubectl 版本。](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/?source=post_page-----5c7d2ae8ba32---------------------------------------)
kubectl version --client

客户端版本号: v1.32.2
Kustomize 版本号: v5.5.0


列出集群中的所有Pods:
kubectl get nodes
名称:       状态:     角色:           年龄:     版本:  
minikube   就绪       控制节点       约3m59s   v1.32.0

我们有一个单一的控制平面节点,它负责整个系统的控制。

列出所有命名空间中的所有Pods:
kubectl get pods -A
(获取所有命名空间中的pod列表 (-A 表示所有命名空间))
NAMESPACE     组件                             就绪   状态      重启计数       存活时间  
kube-system   coredns-668d6bf9bc-fqvbt           1/1     正在运行   1 (117s 前)   5m4s  
kube-system   etcd-minikube                      1/1     正在运行   1 (2m2s 前)   5m9s  
kube-system   kube-apiserver-minikube            1/1     正在运行   1 (112s 前)   5m9s  
kube-system   kube-controller-manager-minikube   1/1     正在运行   1 (2m2s 前)   5m9s  
kube-system   kube-proxy-wj4tm                   1/1     正在运行   1 (2m2s 前)   5m5s  
kube-system   kube-scheduler-minikube            1/1     正在运行   1 (2m2s 前)   5m9s  
kube-system   storage-provisioner                1/1     正在运行   3 (108s 前)   5m8s

我们看到系统 Pods 在控制节点上运行着。

我们来创建一个部署:`nginx-deployment.yaml`

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

注:此配置用于部署一个包含三个副本的Nginx应用。每个副本都会拉取并运行指定版本的Nginx镜像,并监听80端口。

此 YAML 文件定义了一个 Kubernetes Deployment,用于管理 Nginx 网站服务器,并确保始终有 3 个 Nginx Pod 在运行。

API:版本和类型

以下是一个Kubernetes部署配置的YAML片段:

apiVersion: apps/v1
kind: Deployment
  • apiVersion: apps/v1 → 指定使用的Kubernetes API版本为apps/v1
  • kind: Deployment → 将此资源定义为Deployment,用于管理Pod并确保高可用性。
  1. 元数据:
    元数据:  
      名称: nginx-deployment:  
      标签:  
        应用: nginx:
  • name: nginx-deployment → 部署的名称。

  • labels: app: nginx → 标签:app: nginx,标签有助于识别和选择资源(对选择器很有用)。

3. 部署规格 spec

    spec:  
      replicas: 3

Kubernetes 会运行这三个 Nginx Pod 的实例,以确保可用性并实现负载均衡。

4. 选择器(匹配 Pod 实例的)

    selector:  
      matchLabels:  
        app: nginx
        #  selector 选择器,matchLabels 匹配标签,app: nginx 表示应用程序为 nginx
  • matchLabels: app: nginx → 此 Deployment 将管理标有 app: nginx 的 Pods。
  • 确保只有标有这一标签的 Pods 会被此 Deployment 控制。

5. Pod 模板

    模板配置:  
      元数据:  
        标签:  
          app: nginx
  • 定义 Pod 规范(每个 Pod 应该是什么样子的)。
  • 标签 app: nginx 确保 Pod 能正确识别和管理。

6. Pod 规格.

    spec:  
      containers:  
      - name: nginx  
        image: nginx:1.14.2  
        ports:  
        - containerPort: 80

(Note: Since the original text contains technical terms that are commonly used in their original form in the Chinese technical community, the translation remains the same to maintain accuracy and consistency in terminology.)

  • 在每个 Pod 内定义容器。
  • name: nginx → 容器名称。
  • image: nginx:1.14.2 → 从 Docker Hub 下载 Nginx 1.14.2 镜像。
  • ports: containerPort: 80 → 监听 80 端口(默认的 HTTP 端口)。

基本上,这个文件是这样的。

  1. 创建一个名为 nginx-deployment 的部署。
  2. 确保始终有 3 个 Nginx Pod 运行。
  3. app: nginx 标签标记 Pod,使其更易于管理和选择。
  4. 在每个 Pod 内的容器中运行 Nginx 版本 1.14.2。
  5. 在每个容器内开放端口 80 以供 HTTP 流量。

我们在应用这一开发:

kubectl apply -f nginx-deployment.yaml  # 使用kubectl命令将nginx部署配置应用到集群中。
deployment.apps/nginx-deployment 已创建。

我们可以检查正在运行的容器(pod):

    kubectl get pods -A  # 获取所有命名空间中的Pod列表 (Getting the list of Pods in all namespaces)
    命名空间(Namespace)     名称                                就绪   状态(Status)    重启次数(Restarts)        持续时间(Age)  
    default       nginx-deployment-647677fc66-g6kh8   1/1     运行           0               51秒  
    default       nginx-deployment-647677fc66-mvftc   1/1     运行           0               51秒  
    default       nginx-deployment-647677fc66-zpsfr   1/1     运行           0               51秒  
    kube-system   coredns-668d6bf9bc-fqvbt            1/1     运行           1 (7分钟27秒前)   10分钟  
    kube-system   etcd-minikube                       1/1     运行           1 (7分钟32秒前)   10分钟  
    kube-system   kube-apiserver-minikube             1/1     运行           1 (7分钟22秒前)   10分钟  
    kube-system   kube-controller-manager-minikube    1/1     运行           1 (7分钟32秒前)   10分钟  
    kube-system   kube-proxy-wj4tm                    1/1     运行           1 (7分钟32秒前)   10分钟  
    kube-system   kube-scheduler-minikube             1/1     运行           1 (7分钟32秒前)   10分钟  
    kube-system   storage-provisioner                 1/1     运行           3 (7分钟18秒前)   10分钟

可以看到这三个新的 pod,这些 nginx-deployment-… 处于容器创建 (ContainerCreating) 状态。

    kubectl get deployments --all-namespaces

(这个命令用于获取所有命名空间中的部署信息)

    命名空间:     名称               副本数/期望副本数   最新状态   就绪   存在时间  
    default       nginx-deployment   3/3     3            3           2m6s  
    kube-system   coredns           1/1     1            1           11m

我们创建了一个部署,里面包含了三个 pod。

让我们在部署配置中做一些调整,比如改变副本。

spec:
  复本数: 6

再试试这个:

kubectl apply -f nginx-deployment.yaml

使用 kubectl 命令来应用 nginx-deployment.yaml 文件

kubectl get pods -A # 获取所有命名空间中的Pod信息
    NAMESPACE     名称(NAME)                       就绪   状态(STATUS)    重启次数      时长(AGE)  
    default       nginx-deployment-647677fc66-97n5x   1/1     运行中        0             2秒  
    default       nginx-deployment-647677fc66-g6kh8   1/1     运行中        0             4分9秒  
    default       nginx-deployment-647677fc66-mvftc   1/1     运行中        0             4分9秒  
    default       nginx-deployment-647677fc66-pw2zs   1/1     运行中        0             2秒  
    default       nginx-deployment-647677fc66-tt7zm   1/1     运行中        0             2秒  
    default       nginx-deployment-647677fc66-zpsfr   1/1     运行中        0             4分9秒  
    kube-system   coredns-668d6bf9bc-fqvbt            1/1     运行中        1(10分前)   13分  
    kube-system   etcd-minikube                       1/1     运行中        1(10分前)   13分  
    kube-system   kube-apiserver-minikube             1/1     运行中        1(10分前)   13分  
    kube-system   kube-controller-manager-minikube    1/1     运行中        1(10分前)   13分  
    kube-system   kube-proxy-wj4tm                    1/1     运行中        1(10分前)   13分  
    kube-system   kube-scheduler-minikube             1/1     运行中        1(10分前)   13分  
    kube-system   storage-provisioner                 1/1     运行中        3(10分前)   13分
K8slens (K8slens, 一个 Kubernetes 相关的工具)

Lens 是一个流行的开源集成开发环境,专门用于管理和排障 Kubernetes 集群。它为开发人员和 DevOps 工程师提供了一个全面且直观的界面,以可视化并控制其 Kubernetes 环境的各个方面。

在您的计算机上安装 Lens 桌面 - Lens 文档

支持 Linux、macOS 和 Windows 操作系统。

那就开始吧。

    lens-desktop

K8slens,截个图。

示例

我跟着Nana在YouTube上的教程做了尝试,没达到预期,但我在代码里解决了问题。

这是一个简单的应用程序,它使用来自Docker Hub的一个镜像。

访问这个链接可以找到相关的Docker镜像:https://hub.docker.com/r/nanajanashia/k8s-demo-app

它用了 MongoDB 和一个简单的网页界面。

首先,我们创建 mongo-config.yaml 文件。该文件定义了一个名为 ConfigMap 的配置项,用于存储非敏感配置数据,这些数据是 MongoDB 服务的配置数据。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mongo-config
data:
  mongo-url: mongo-service
  • 创建一个名为 mongo-config 的配置映射(ConfigMap)。
  • 将 MongoDB 服务的 URL 存储为 mongo-url: mongo-service
  • 供 web 应用程序用来连接到 MongoDB 服务。

其次,我们创建 mongo-secret.yaml 文件。此文件定义了一个 Secret,存放 MongoDB 数据库的敏感信息。

# MongoDB 密钥配置
apiVersion: v1
kind: Secret
metadata:
  name: mongo-secret
type: Secret
# 密钥类型
data:
  mongo-user: YWRtaW4=
  mongo-password: YWRtaW4xMjM=
  • 创建一个名为 mongo-secret 的 Kubernetes 密钥(Secret)。
  • 将 MongoDB 的用户名和密码以编码格式存储。
  • 为 MongoDB 容器和 web 应用程序提供认证所需的凭证。

用户名和密码已经用 Base64 进行了编码。

echo -n admin | base64
# 将字符串'admin'进行base64编码

管理员

使用命令 echo -n admin123 | base64 将字符串 'admin123' 进行Base64编码。

YWRtaW4xMjM=

接下来,我们创建 mongo.yaml 文件。该文件定义了一个 Deployment(用于运行 MongoDB 数据库)和一个 Service(用于在 Kubernetes 集群内部暴露 MongoDB 数据库的访问)。

apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: mongo-deployment  
  labels:  
    app: mongo  
spec:  
  replicas: 1  
  selector:  
    matchLabels:  
      app: mongo  
  template:  
    metadata:  
      labels:  
        app: mongo  
    spec:  
      containers:  
      - name: mongodb  
        image: mongo:5.0  
        ports:  
        - containerPort: 27017  
        env:  
        - name: MONGO_INITDB_ROOT_USERNAME  
          valueFrom:  
            secretKeyRef:  
              name: mongo-secret  
              key: mongo-user  
        - name: MONGO_INITDB_ROOT_PASSWORD  
          valueFrom:  
            secretKeyRef:  
              name: mongo-secret  
              key: mongo-password  
---  
apiVersion: v1  
kind: Service  
metadata:  
  name: mongo-service  
spec:  
  selector:  
    app: mongo  
  ports:  
    - protocol: TCP  
      port: 27017  
      targetPort: 27017

部署详情

apiVersion: apps/v1  # 定义部署的API版本
kind: Deployment     # 资源类型: 部署,定义资源类型为部署
metadata:            # 元数据: 包含部署的元数据
  name: mongo-deployment  # 名称: mongo-deployment,指定部署的名称
  labels:             # 标签: 包含应用的标签
    app: mongo        # 应用: mongo,指定应用的名称为mongo
  • 定义了一个名为 mongo-deployment 的部署,并使用标签 app: mongo 来帮助识别该资源。

Pod 复制 & 匹配选择器

规范:
  副本数: 1
  选择器:
    标签匹配:
      应用: mongo
  • replicas: 1 → 只运行一个MongoDB实例。
  • 选择器(matchLabels)确保只有标签为app: mongo的Pod会被此Deployment管理。

Pod 模版

    模板定义:  
      元数据:  
        标签:  
          app: mongo

此 Pod 将标记为 app: mongo,从而可以被 Service 选择。

MongoDB 容器设置

    容器:  
    - 名字: mongodb  
      镜像: mongo:5.0  
      端口:  
      - 端口: 27017
  • 运行版本为 MongoDB 5.0 的 Docker 镜像。

  • 映射端口 27017,这是 MongoDB 的默认端口。

环境变量用于存储认证信息

# 配置环境变量
env:  
- name: MONGO_INITDB_ROOT_USERNAME  # 设置用户名的环境变量
  valueFrom:  
    secretKeyRef:  
      name: mongo-secret  # 密钥名称
      key: mongo-user  # 用户名键
- name: MONGO_INITDB_ROOT_PASSWORD  # 设置密码的环境变量
  valueFrom:  
    secretKeyRef:  
      name: mongo-secret  # 密钥名称
      key: mongo-password  # 密码键
  • MongoDB需要用户名和密码来进行身份验证。

  • 它从这个Kubernetes Secret(mongo-secret)安全地获取凭据。

MongoDB 服务端

---
# 定义一个服务
apiVersion: v1
kind: 服务
metadata:
  名称: mongo-service
规范:
  选择器:
    应用: mongo
  端口:
    - 协议: TCP
      端口号: 27017
      目标端口: 27017

服务详情

apiVersion: v1
kind: Service
metadata:
  name: mongo-service
  # 配置一个名为mongo-service的服务

定义一个名为 mongo-service服务实例,其他应用可以通过它来访问 MongoDB 数据库。

MongoDB Pods的筛选器

    selector:  
      app: mongo

选择器配置中,app: mongo 表示应用为 MongoDB。

选择标签为 app: mongo 的 Pod,确保它把流量路由到 MongoDB。

开放的端口

    端口:  
      - 协议:TCP  
        端口:27017,目标端口:27017
  • port: 27017 → 监听27017端口。

  • targetPort: 27017 → 将流量路由至27017端口的MongoDB容器。

最后,我们创建了 webapp.yaml 文件。该文件同时定义了 部署(用于运行 web 应用)和 服务(让 web 应用对外可用)。

apiVersion: apps/v1  
kind: Deployment  # 此配置用于部署web应用
metadata:  
  name: webapp-deployment  
  labels:  
    app: webapp  
spec:  
  replicas: 1  
  selector:  
    matchLabels:  
      app: webapp  
  template:  
    metadata:  
      labels:  
        app: webapp  
    spec:  
      containers:  
      - name: webapp  
        image: nanajanashia/k8s-demo-app:v1.0  
        ports:  
        - containerPort: 3000  # 容器端口设置为3000
        env:  
        - name: USER_NAME  
          valueFrom:  
            secretKeyRef:  
              name: mongo-secret  
              key: mongo-user  # 从mongodb秘钥中获取mongo用户信息
        - name: USER_PWD  
          valueFrom:  
            secretKeyRef:  
              name: mongo-secret  
              key: mongo-password  # 从mongodb秘钥中获取mongo用户密码
        - name: DB_URL  
          valueFrom:  
            configMapKeyRef:  
              name: mongo-config  
              key: mongo-url  # 从配置映射中获取mongodb url
---
apiVersion: v1  
kind: Service  # 此配置用于定义web应用的服务
metadata:  
  name: webapp-service  
spec:  
  type: NodePort  # 服务类型为NodePort
  selector:  
    app: webapp  
  ports:  
    - protocol: TCP  
      port: 3000  # 应用的服务端口设置为3000
      targetPort: 3000  # 应用容器监听端口设置为3000
      nodePort: 30100  # NodePort设置为30100,通过此端口访问应用
  • 创建一个 Deployment(webapp-deployment),用于在 Pod 内运行 web 应用。
  • 使用 Secret(mongo-secret)中的 MongoDB 凭证来进行安全连接。
  • 从 ConfigMap(mongo-config)中获取 MongoDB 服务的 URL 地址。
  • 创建一个 Service(webapp-service),通过 NodePort 暴露 web 应用,使其能够被外部访问。

在开始之前,让我们删除之前在 nginx-deployment 中创建的那些 pod。

kubectl delete deployment nginx-deployment
deployment.apps "nginx-deployment" 被删除了
运行这个命令 `kubectl get pod`,这个命令用来获取pod的信息。
在默认命名空间中没有找到任何资源。

现在我们用apply命令部署这个应用。

运行以下命令来应用 MongoDB 配置文件:

kubectl apply -f mongo-config.yaml
configmap/mongo-config 创建成功
    kubectl apply -f mongo-secret.yaml

运行以下命令来应用 MongoDB 密钥配置。

kubectl apply -f mongo.yaml

运行此命令将会应用名为mongo.yaml的配置文件到Kubernetes集群中。

    部署.apps/mongo-deployment 已创建  
    服务/mongo-service 已创建

使用kubectl apply -f webapp.yaml命令来应用web应用的配置文件。kubectl是Kubernetes的命令行工具。

deployment.apps/应用部署已创建  
service/服务已创建

让我们获取当前的命名空间中的所有 Kubernetes 资源。

    kubectl get all  # (查看所有资源)
    名称                                     准备就绪   状态              重启数   存活时长  
    pod/mongo-deployment-7cccf8b6d8-rn2px    1/1     运行中           0          66s  
    pod/webapp-deployment-6bb4795f54-vrt54   0/1     正在创建容器      0          39s  

    名称                     类型        集群IP      外部 IP   端口          存活时长  
    service/kubernetes       ClusterIP   10.96.0.1       无        443/TCP          4h41m  
    service/mongo-service    ClusterIP   10.96.7.226     无        27017/TCP        66s  
    service/webapp-service   NodePort    10.103.158.97   无        3000:30100/TCP   39s  

    名称                                准备就绪   更新的副本数   可用   存活时长  
    deployment.apps/mongo-deployment    1/1     1            1           66s  
    deployment.apps/webapp-deployment   0/1     1            0           39s  

    名称                                           期望   当前   就绪   存活时长  
    replicaset.apps/mongo-deployment-7cccf8b6d8    1         1         1       66s  
    replicaset.apps/webapp-deployment-6bb4795f54   1         1         0       39s

我们可以获取配置映射和Secrets啊。

    kubectl get configmap (获取 ConfigMap 列表)
    名称               数据   时长  
    kube-root-ca.crt   1      4小时41分钟  
    mongo-config       1      2分钟44秒
    kubectl get secret
    名称           类型     数据   2分钟40秒  
    mongo-secret   Opaque   2     

豆荚:

    kubectl get pod(用于获取Pod的Kubernetes命令)
    名称/名称                                 就绪   状态      重启次数   存活时间/  
    mongo-deployment-7cccf8b6d8-rn2px    1/1     运行中     0          2m39s  
    webapp-deployment-6bb4795f54-vrt54   1/1     运行中     0          2m12s

我们可以使用 describe 命令来获取服务详情。

kubectl describe service webapp-service # 查看名为webapp-service的服务的详细信息
    名称:                     webapp-service  
    命名空间:                 default  
    标签:                    无标签  
    注解:                    无  
    选择器:                  app=webapp  
    类型:                    NodePort  
    IP 策略:                 SingleStack  
    IP 类型:                IPv4  
    IP:                      10.103.158.97  
    IPs:                     10.103.158.97  
    端口:                    未指定 3000/TCP  
    目标端口:               3000/TCP  
    NodePort:                未指定 30100/TCP  
    端点:                   10.244.0.37:3000  
    会话:                    无  
    外部流量策略:        集群内  
    内部流量策略:        集群内  
    事件:                    无
kubectl logs webapp-deployment-6bb4795f54-vrt54

(查看webapp-deployment的日志)

    这个应用正在监听着3000端口呢
运行这个命令来查看服务列表:`kubectl get svc`
    名称(NAME)             类型        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE  
    kubernetes       集群IP(ClusterIP)   10.96.0.1       <none>        443/TCP          4h45m  
    mongo-service    集群IP         10.96.7.226     <none>        27017/TCP        5m28s  
    webapp-service   节点端口(NodePort)   10.103.158.97   <none>        3000:30100/TCP   5m1s
    kubectl get node -o wide
    名称       状态       角色           运行时间     版本       内部IP       外部IP地址       操作系统版本           内核版本      容器运行时版本  
    minikube   Ready     控制平面       4h46m   v1.32.0   192.168.49.2  <none>        Ubuntu 22.04.5 LTS   6.12.5-linuxkit   docker://27.4.1

通过 minikube 运行应用程序:

    minikube service webapp-service

此命令用于在 Minikube 中访问名为 webapp-service 的服务。

    |-----------|----------------|-------------|---------------------------|
    | NAMESPACE |      名称      | 目标端口    |            URL            |
    |-----------|----------------|-------------|---------------------------|
    | default   | webapp-service |        3000 | http://192.168.49.2:30100 |
    |-----------|----------------|-------------|---------------------------|
    🏃  正在为 webapp-service 服务启动隧道。
    |-----------|----------------|-------------|------------------------|
    | NAMESPACE |      名称      | 目标端口    |          URL           |
    |-----------|----------------|-------------|------------------------|
    | default   | webapp-service |             | http://127.0.0.1:45947 |
    |-----------|----------------|-------------|------------------------|
    🎉  正在默认浏览器中打开 default/webapp-service 服务。
    ❗  因为你在 Linux 上使用 Docker 驱动,终端需要保持打开才能运行。
    18:18:27.010 Gtk-Message: 不加载 atk-bridge 模块,因为此功能由 GTK 内置支持。请勿加载此模块。
    [20414, 主线程] 警告: 无法加载 GTK+ 模块 /snap/firefox/5134/gnome-platform/usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so。检测到 GTK+ 2.x 符号,同一进程中不支持 GTK+ 2.x 和 GTK+ 3。

    (firefox:20414): Gtk-WARNING **: 18:18:27.107: 无法加载 GTK+ 模块 /snap/firefox/5134/gnome-platform/usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so。检测到 GTK+ 2.x 符号,同一进程中不支持 GTK+ 2.x 和 GTK+ 3。
    Gtk-Message: 18:18:27.107: 无法加载 canberra-gtk-module 模块。

    (firefox:20414): Gtk-WARNING **: 18:18:27.109: 无法加载 GTK+ 模块 /snap/firefox/5134/gnome-platform/usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so。检测到 GTK+ 2.x 符号,同一进程中不支持 GTK+ 2.x 和 GTK+ 3。
    Gtk-Message: 18:18:27.109: 无法加载 canberra-gtk-module 模块。

还有这个应用:

截图一下。

总之来说,Kubernetes之所以重要,是因为它能够自动化容器化应用程序的部署、扩展和管理过程,确保它们能够高效且可靠地运行。

最核心的是,Kubernetes 基于 声明式的配置 的原则运行——用户定义系统期望达到的状态,Kubernetes 则会努力确保系统维持在该状态。

如果你是初学者,请记住,Kubernetes 功能强大但也很复杂,这一点很重要;专注于理解其核心组件,比如 Pods、Nodes 和 Controllers,并记住它被设计来处理现代应用程序的可伸缩性和韧性。

阅读更多
微服务入门:初学者必知的关键概念微服务初探:现代软件架构初学者指南awstip.com
Docker入门指南:一步步实现容器化Docker详解:初学者指南faun.pub
掌握RAY:初学者指南从零到英雄之路:使用Ray扩展机器学习工作负载blog.devops.dev
Inside AutoGen: 第3章 — 团队篇
参考资料

这是一个YouTube链接: https://www.youtube.com/watch?v=r2zuL9MW6wc

点击此处观看视频

https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/

了解关于 Kubernetes 卷的更多信息:https://learncloudnative.com/blog/2020-11-11-kubernetes-volumes

https://theithollow.com/2019/02/20/kubernetes-configmaps/

这是一个关于Kubernetes ingress的文章页面。https://outshift.cisco.com/blog/k8s-ingress

https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-networking-guide-beginners.html

<https://cloudvests.com/保护 Kubernetes 控制平面/>

https://www.wallarm.com/what/什么是Kubernetes集群以及它是如何运作的

点击这里了解更多信息

https://www.cloudzero.com/blog/horizontal-vs-vertical-scaling/

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP