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架构图。原文链接
- 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
- 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并确保高可用性。
- 元数据:
元数据:
名称: 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 端口)。
基本上,这个文件是这样的。
- 创建一个名为
nginx-deployment
的部署。 - 确保始终有 3 个 Nginx Pod 运行。
- 用
app: nginx
标签标记 Pod,使其更易于管理和选择。 - 在每个 Pod 内的容器中运行 Nginx 版本 1.14.2。
- 在每个容器内开放端口 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://cloudvests.com/保护 Kubernetes 控制平面/>
https://www.wallarm.com/what/什么是Kubernetes集群以及它是如何运作的
点击这里了解更多信息
https://www.cloudzero.com/blog/horizontal-vs-vertical-scaling/