kubernetes学习记录

kubernetes学习记录

1
腾讯汽车云

[kuboard官网](Kubernetes教程 | Kuboard)

kubernetes

1
2
3
4
5
6
7
8
9
10
11
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
Pod
Pod是Kubernetes中最小的部署单元,可以包含一个或多个容器。这些容器共享网络、存储和生命周期。Pod内的容器可以相互通信,而无需通过网络。
Service
Service是一种抽象资源,用于定义一组Pod的逻辑集合和访问策略。它允许外部流量访问Pod,同时隐藏Pod的具体实现细节。
Deployment
Deployment是一种控制器,用于管理Pod的副本数量和更新策略。它确保指定数量的Pod副本始终运行,并支持滚动更新。
Node
Node是Kubernetes集群中的一个工作机器,可以是物理机或虚拟机。每个Node上运行着kubelet、容器运行时(如Docker或containerd)等组件。
Cluster
Cluster是由多个Node组成的集群,用于运行容器化应用程序。集群由控制平面(Control Plane)和工作节点(Worker Nodes)组成。

deployment

1
2
3
4
Deployment 译名为 部署。在k8s中,通过发布 Deployment,可以创建应用程序 (docker image) 的实例 (docker container),这个实例会被包含在称为 Pod 的概念中,Pod 是 k8s 中最小可管理单元。
在 k8s 集群中发布 Deployment 后,Deployment 将指示 k8s 如何创建和更新应用程序的实例,master 节点将应用程序实例调度到集群中的具体的节点上。
创建应用程序实例后,Kubernetes Deployment Controller 会持续监控这些实例。如果运行实例的 worker 节点关机或被删除,则 Kubernetes Deployment Controller 将在群集中资源最优的另一个 worker 节点上重新创建一个新的实例。这提供了一种自我修复机制来解决机器故障或维护问题。
在容器编排之前的时代,各种安装脚本通常用于启动应用程序,但是不能够使应用程序从机器故障中恢复。通过创建应用程序实例并确保它们在集群节点中的运行实例个数,Kubernetes Deployment 提供了一种完全不同的方式来管理应用程序。
1
Deployment处于 master 节点上,通过发布 Deployment,master 节点会选择合适的worker节点创建 Container,Container 会被包含在 Pod里。

kubectl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# deployment.yaml
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
1
2
3
4
5
6
7
8
9
应用 YAML 文件
kubectl apply -f nginx-deployment.yaml


查看部署结果
# 查看 Deployment
kubectl get deployments
# 查看 Pod
kubectl get pods
1
2
可分别查看到一个名为 nginx-deployment 的 Deployment 和一个名为 nginx-deployment-xxxxxxx 的 Pod
任务二达成,至此你已经成功在k8s上部署了一个实例的nginx应用程序

kuboard

heml

pods

1
2
3
4
5
Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container,以及这些 container(容器)的一些共享资源。这些资源包括:
1.共享存储,称为卷(Volumes)
2.网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享该IP地址
3.container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等
例如,Pod可能既包含带有Node.js应用程序的 container 容器,也包含另一个非 Node.js 的 container 容器,用于提供 Node.js webserver 要发布的数据。Pod中的容器共享 IP 地址和端口空间(同一 Pod 中的不同 container 端口不能相互冲突),始终位于同一位置并共同调度,并在同一节点上的共享上下文中运行。(同一个Pod内的容器可以使用 localhost + 端口号互相访问)。
1
Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创建包含容器的 Pod (而不是直接创建容器)。每个Pod都与运行它的 worker 节点(Node)绑定,并保持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node)上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不同)。
1
2
Pod 是一组容器(可包含一个或多个应用程序容器),以及共享存储(卷 Volumes)、IP 地址和有关如何运行容器的信息。
如果多个容器紧密耦合并且需要共享磁盘等资源,则他们应该被部署在同一个Pod(容器组)中。
1
2
3
4
Pod(容器组)总是在 Node(节点) 上运行。Node(节点)是 kubernetes 集群中的计算机,可以是虚拟机或物理机。每个 Node(节点)都由 master 管理。一个 Node(节点)可以有多个Pod(容器组),kubernetes master 会根据每个 Node(节点)上可用资源的情况,自动调度 Pod(容器组)到最佳的 Node(节点)上。
每个 Kubernetes Node(节点)至少运行:
Kubelet,负责 master 节点和 worker 节点之间通信的进程;管理 Pod(容器组)和 Pod(容器组)内运行的 Container(容器)。
容器运行环境(如Docker)负责下载镜像、创建和运行容器等。
1
Worker节点是k8s中的工作计算机,可能是VM或物理计算机,具体取决于群集。多个Pod可以在一个节点上运行。

kubectl get

1
2
3
4
5
6
7
kubectl get - 显示资源列表
#获取类型为Deployment的资源列表
kubectl get deployments
#获取类型为Pod的资源列表
kubectl get pods
#获取类型为Node的资源列表
kubectl get nodes

名称空间

1
2
3
4
5
6
7
8
在命令后增加 -A 或 --all-namespaces 可查看所有 名称空间中 的对象,使用参数 -n 可查看指定名称空间的对象,例如
# 查看所有名称空间的 Deployment
kubectl get deployments -A
kubectl get deployments --all-namespaces
# 查看 kube-system 名称空间的 Deployment
kubectl get deployments -n kube-system

并非所有对象都在名称空间里

kubectl describe

1
2
3
4
5
6
 - 显示有关资源的详细信息
# kubectl describe 资源类型 资源名称
#查看名称为nginx-XXXXXX的Pod的信息
kubectl describe pod nginx-XXXXXX
#查看名称为nginx的Deployment的信息
kubectl describe deployment nginx

kubectl logs

1
2
3
4
5
kubectl logs - 查看pod中的容器的打印日志(和命令docker logs 类似)
# kubectl logs Pod名称
#查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
#本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
kubectl logs -f nginx-pod-XXXXXXX

kubectl exec

1
2
3
4
kubectl exec - 在pod中的容器环境内执行命令(和命令docker exec 类似)
# kubectl exec Pod名称 操作命令
# 在名称为nginx-pod-xxxxxx的Pod中运行bash
kubectl exec -it nginx-pod-xxxxxx /bin/bash

Kubernetes Service(服务)

1
2
3
4
5
6
7
8
9
10
事实上,Pod(容器组)有自己的 生命周期 (opens new window)。当 worker node(节点)故障时,节点上运行的 Pod(容器组)也会消失。然后,Deployment (opens new window)可以通过创建新的 Pod(容器组)来动态地将群集调整回原来的状态,以使应用程序保持运行。
举个例子,假设有一个图像处理后端程序,具有 3 个运行时副本。这 3 个副本是可以替换的(无状态应用),即使 Pod(容器组)消失并被重新创建,或者副本数由 3 增加到 5,前端系统也无需关注后端副本的变化。由于 Kubernetes 集群中每个 Pod(容器组)都有一个唯一的 IP 地址(即使是同一个 Node 上的不同 Pod),我们需要一种机制,为前端系统屏蔽后端系统的 Pod(容器组)在销毁、创建过程中所带来的 IP 地址的变化。
Kubernetes 中的 Service(服务) 提供了这样的一个抽象层,它选择具备某些特征的 Pod(容器组)并为它们定义一个访问方式。Service(服务)使 Pod(容器组)之间的相互依赖解耦(原本从一个 Pod 中访问另外一个 Pod,需要知道对方的 IP 地址)。一个 Service(服务)选定哪些 Pod(容器组) 通常由 LabelSelector(标签选择器) 来决定。
在创建Service的时候,通过设置配置文件中的 spec.type 字段的值,可以以不同方式向外部暴露应用程序:
ClusterIP(默认)
在群集中的内部IP上公布服务,这种方式的 Service(服务)只在集群内部可以访问到
NodePort
使用 NAT 在集群中每个的同一端口上公布服务。这种方式下,可以通过访问集群中任意节点+端口号的方式访问服务 <NodeIP>:<NodePort>。此时 ClusterIP 的访问方式仍然可用。
LoadBalancer
在云环境中(需要云供应商可以支持)创建一个集群外部的负载均衡器,并为使用该负载均衡器的 IP 地址作为服务的访问地址。此时 ClusterIP 和 NodePort 的访问方式仍然可用。

服务和标签

1
2
3
4
5
TIP
Service是一个抽象层,它通过 LabelSelector 选择了一组 Pod(容器组),把这些 Pod 的指定端口公布到到集群外部,并支持负载均衡和服务发现。
公布 Pod 的端口以使其可访问
在多个 Pod 间实现负载均衡
使用 Label 和 LabelSelector
1
2
3
4
5
Service 将外部请求路由到一组 Pod 中,它提供了一个抽象层,使得 Kubernetes 可以在不影响服务调用者的情况下,动态调度容器组(在容器组失效后重新创建容器组,增加或者减少同一个 Deployment 对应容器组的数量等)。
Service使用 Labels、LabelSelector(标签和选择器) (opens new window)匹配一组 Pod。Labels(标签)是附加到 Kubernetes 对象的键/值对,其用途有多种:
将 Kubernetes 对象(Node、Deployment、Pod、Service等)指派用于开发环境、测试环境或生产环境
嵌入版本标签,使用标签区别不同应用软件版本
使用标签对 Kubernetes 对象进行分类

命令

kubectl get nodes

1
2
3
4
5
6
7
8
9
10
检查节点状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.226.0.10 Ready <none> 196d v1.28.3-tke.18
10.226.0.15 Ready <none> 190d v1.28.3-tke.18
10.226.16.2 Ready <none> 190d v1.28.3-tke.18
10.226.16.4 Ready <none> 190d v1.28.3-tke.18
10.226.18.16 Ready <none> 58d v1.28.3-tke.22
10.226.18.3 Ready <none> 58d v1.28.3-tke.22
10.226.2.70 Ready,SchedulingDisabled <none> 43d v1.28.3-tke.22

kubectl config view

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
检查 kubectl 使用的配置文件。默认路径是 ~/.kube/config。通过以下命令查看当前使用的配置
kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.226.0.33
name: cls-ps6hub9f
contexts:
- context:
cluster: cls-ps6hub9f
user: "100038521123"
name: cls-ps6hub9f-100038521123-context-default
- context:
cluster: cls-ps6hub9f
namespace: dagster-app-test
user: "100038521123"
name: dagster-app-context
current-context: dagster-app-context
kind: Config
preferences: {}
users:
- name: "100038521123"
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED

kubectl get svc -n namespace

1
2
3
# 查看所有 Service
~ kubectl get svc dagster-dagster-webserver -n dagster-app-test
dagster-dagster-webserver ClusterIP 192.168.92.189 <none> 80/TCP 78d

kubectl get svc xxxx -n namespace -o yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
执行以下命令,查看 Service 的具体端口配置
~ kubectl get svc dagster-dagster-webserver -n dagster-app-test -o yaml
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: dagster
meta.helm.sh/release-namespace: dagster-app-test
service.cloud.tencent.com/sync-begin-time: "2025-12-23T11:12:33+08:00"
service.cloud.tencent.com/sync-end-time: "2025-12-23T11:12:33+08:00"
creationTimestamp: "2025-12-23T03:12:33Z"
labels:
app.kubernetes.io/instance: dagster
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: dagster
app.kubernetes.io/version: dev
component: dagster-webserver
helm.sh/chart: dagster-0.0.1-dev-git
name: dagster-dagster-webserver
namespace: dagster-app-test
resourceVersion: "12770797908"
uid: 2e475843-19ba-40f3-88b5-31642d159049
spec:
clusterIP: 192.168.92.189
clusterIPs:
- 192.168.92.189
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app.kubernetes.io/instance: dagster
app.kubernetes.io/name: dagster
component: dagster-webserver
sessionAffinity: None
type: ClusterIP
status:
conditions:
- lastTransitionTime: "2025-12-23T03:12:33Z"
message: ""
reason: Success
status: "True"
type: Ready
loadBalancer: {}
1
2
3
4
查询 Service 入口(推荐)
Dagster 部署时通常会创建一个 Service 来对外暴露服务。你需要找到这个 Service 的访问地址:
# 查看所有 Service
kubectl get svc -n <namespace>

kubectl get svc xxxx -n namespace -o wide

1
2
3
4
5
6
7
8
9
10
# 查看 Service 详情(找到 External-IP 或 ClusterIP)
kubectl get svc dagster-webserver -n <namespace> -o wide
~ kubectl get svc dagster-dagster-webserver -n dagster-app -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
dagster-dagster-webserver ClusterIP 192.168.79.21 <none> 80/TCP 33d app.kubernetes.io/instance=dagster,app.kubernetes.io/name=dagster,component=dagster-webserver
Service 可能有几种类型:
Service 类型 访问方式 适用场景
LoadBalancer 有公网 IP(External-IP) 公网访问
ClusterIP 集群内 IP(10.x.x.x) 仅集群内访问
NodePort 节点 IP + 端口 通过节点 IP 访问