跳转至

K8s Walkthrough-1

Reference:

  1. k8s Tutorial
  2. kubectl orders set

首先我们在下定义一个k8s文件夹,专门进行下列的测试

Bash
1
2
3
4
5
6
cd ~
mkdir k8s

# if not under this file, you can specify the detailed path
eg:
kubectl (detailed order)

安装

简介

用于管理容器化的工作负载和服务,可促进声明式配置和自动化

容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。Kubernetes 为你提供了一个可弹性运行分布式系统的框架。Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。

Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。

由于 Kubernetes 是在容器级别运行,而非在硬件级别,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡,允许用户集成他们的日志记录、监控和警报方案。 但是,Kubernetes 不是单体式(monolithic)系统,那些默认解决方案都是可选、可插拔的。

对象管理

使用构建在 kubectl 命令行工具中的指令式命令可以直接快速创建、更新和删除 Kubernetes 对象。

安装kubectl

必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。

要获知版本信息,请输入 kubectl version.

CLI传指令及参数

k8s obj-def 1

使用指令式命令时,用户可以在集群中的活动对象上进行操作。用户将操作传给 kubectl 命令作为参数或标志。

这是开始或者在集群中运行一次性任务的推荐方法,它直接在活跃对象上操作,不提供以前配置的历史记录。

创建 Deployment 对象来运行 nginx 容器的实例

Bash
1
kubectl create deployment nginx --image nginx

配置文件定义

k8s obj-def 2

在指令式对象配置中,kubectl 命令指定操作(创建,替换等),可选标志和至少一个文件名。

指定的文件必须包含 YAML 或 JSON 格式的对象的完整定义

创建配置文件中定义的对象:

Bash
1
2
3
4
5
6
7
8
9
kubectl create -f nginx.yaml

# if not under this file, you can specify the detailed path
eg:
kubectl create -f ./path/to/nginx.yaml

# evan can be an outside URL
eg:
kubectl create -f https://k8s.io/examples/pods/pod-nginx.yaml

删除两个配置文件中定义的对象:

Bash
1
kubectl delete -f nginx.yaml -f redis.yaml

通过覆盖活动配置来更新配置文件中定义的对象:

Bash
1
kubectl replace -f nginx.yaml

声明式自动化处理

使用声明式对象配置时,用户对本地存储的对象配置文件进行操作,但是用户未定义要对该文件执行的操作。 

kubectl 会自动检测每个文件的创建、更新和删除操作。 这使得配置可以在目录上工作,根据目录中配置文件对不同的对象执行不同的操作。(集成化处理)

处理 configs 目录中的所有对象配置文件,创建并更新活跃对象。 可以首先使用 diff 子命令查看将要进行的更改,然后在进行应用:

Bash
1
2
kubectl diff -f configs/
kubectl apply -f configs/

递归处理目录:

Bash
1
2
kubectl diff -R -f configs/
kubectl apply -R -f configs/

实践部分

指令式命令管理 Kubernetes 对象

创建对象

  • run:创建一个新的 Pod 来运行一个容器。
  • expose:创建一个新的 Service 对象为若干 Pod 提供流量负载均衡。
  • create <对象类别> [<子类别>] <实例名称>

某些对象类别拥有自己的子类别,可以在 create 命令中设置。 例如,Service 对象有 ClusterIP、LoadBalancer 和 NodePort 三种子类别。

下面是一个创建 NodePort 子类别的 Service 的示例:

Format

Bash
1
2
3
kubectl create service nodeport <服务名称>

# 可以使用 `-h` 标志找到一个子命令所支持的参数和标志

建立一个名字是test-1, tcp端口是101的NodePort

Bash
1
2
 kubectl create service nodeport test-1 --tcp=101
service/test-1 created

删除对象

delete <类别>/<名称>

下面是一个删除名为 nginx 的 Deployment 对象的命令:

Bash
1
kubectl delete deployment/nginx
Bash
1
2
3
4
 kubectl delete deployment/nginx
deployment.apps "nginx" deleted                                                                                                                      kubectl delete service/test-1
service "test-1" deleted

查看对象

  • get:打印匹配到的对象的基本信息。使用 get -h 可以查看选项列表。
  • describe:打印匹配到的对象的详细信息的汇集版本。
  • logs:打印 Pod 中运行的容器的 stdout 和 stderr 输出

配置文件对 Kubernetes 对象进行命令式管理

可以使用 kubectl 命令行工具以及用 YAML 或 JSON 编写的对象配置文件来创建、更新和删除 Kubernetes 对象

  1. 手写完yaml文件 vim XXX.yaml
  2. 通过yaml生成对象 kubectl create -f XXX.yaml (从XXX.yaml这个配置文件中生成一个对象)
  3. 调用对象的相关自属性 `kubectl get -f XXX.yaml - arg1 ...

创建对象

Bash
1
 cd ~/k8s                                                                 vim nginx-deployment.yaml

(1) 准备配置文件

首先,我们准备一个简单的 nginx-deployment.yaml 配置文件,用于创建一个 Nginx Deployment(基于Nginx的Deployment类型对象)。

YAML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

(2) 创建对象

使用 kubectl create -f 命令从配置文件创建对象。

Bash
1
kubectl create -f nginx-deployment.yaml
Bash
1
2
 kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

更新对象

(1) 修改配置文件

假设我们要更新 Nginx Deployment,将副本数量从 3 改为 5。

修改后的 nginx-deployment.yaml 文件:

YAML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

(2) 更新对象

使用 kubectl replace -f 命令根据配置文件更新对象。

Bash
1
kubectl replace -f nginx-deployment.yaml
Bash
1
2
 kubectl replace -f nginx-deployment.yaml
deployment.apps/nginx-deployment replaced

删除对象

(1) 删除对象

使用 kubectl delete -f 命令删除配置文件中描述的对象。

Bash
1
kubectl delete -f nginx-deployment.yaml

查看对象

(1) 查看对象信息

使用 kubectl get -f 查看有关配置文件中描述的对象的信息。

Bash
1
kubectl get -f nginx-deployment.yaml -o yaml
  • 读取 nginx-deployment.yaml 文件
  • get -f 根据文件中的定义,找到名为 nginx-deployment 的 Deployment 资源
  • -o yaml 以 YAML 格式输出该 Deployment 资源的详细信息
Bash
 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 kubectl get -f nginx-deployment.yaml -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2024-07-02T11:43:43Z"
  generation: 2
  name: nginx-deployment
  namespace: default
  resourceVersion: "1422026"
  uid: 4b0e7edc-c69f-4cd2-ae22-3eb5d955da81
spec:
  progressDeadlineSeconds: 600
  replicas: 5
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 5
  conditions:
  - lastTransitionTime: "2024-07-02T11:43:43Z"
    lastUpdateTime: "2024-07-02T11:43:59Z"
    message: ReplicaSet "nginx-deployment-86dcfdf4c6" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  - lastTransitionTime: "2024-07-02T11:44:39Z"
    lastUpdateTime: "2024-07-02T11:44:39Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  observedGeneration: 2
  readyReplicas: 5
  replicas: 5
  updatedReplicas: 5

从 URL 创建和编辑对象

假设你有一个对象配置文件的 URL,你可以在创建对象之前使用 kubectl create --edit 对配置进行更改。

Bash
1
kubectl create -f https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/controllers/nginx-deployment.yaml --edit
Bash
1
2
3
 kubectl create -f nginx-deployment.yaml --edit
这里它会自动拉出我本地的编辑器 (neovim)
Edit cancelled, no changes made.

从命令式命令迁移到命令式对象配置

(1) 将活动对象导出到本地对象配置文件

Bash
1
kubectl get deployment/nginx-deployment -o yaml > nginx-deployment-generated.yaml
Bash
1
2
3
4
 kubectl get deployment/nginx-deployment -o yaml > nginx-deployment-generated.yaml

❯ ls
 configs   nginx-deployment-generated.yaml   nginx-deployment.yaml   nginx.yaml

如果我现在对原来的nginx-deployment.yaml 做了一些修改,只用 kubectl replace 进行更新,此时会发现nginx-deployment-generated.yaml 并没有产生变化,因为它在本地,还没有进行对object的Fetch (完全类比Git)

(2) 从对象配置文件中手动删除状态字段

打开 nginx-deployment.yaml 文件,删除 status 字段。

(3) 使用 kubectl replace -f 进行管理

Bash
1
kubectl replace -f nginx-deployment.yaml

定义控制器选择器和 PodTemplate 标签

定义一个选择器和 PodTemplate 标签,以确保控制器只选择特定的 Pod。

YAML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      controller-selector: "apps/v1/deployment/nginx"
  template:
    metadata:
      labels:
        controller-selector: "apps/v1/deployment/nginx"
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

配置文件对 Kubernetes 对象进行声明式管理

Ref

此处从略,用到再看 (🤡)

对象名称和 ID

集群中的每一个对象都有一个名称来标识在 同类资源 中的唯一性。

每个 Kubernetes 对象也有一个 UID 来标识在 整个集群 中的唯一性。

比如,在同一个名字空间 中只能有一个名为 myapp-1234 的 Pod,但是可以命名一个 Pod 和一个 Deployment 同为 myapp-1234

对于用户提供的非唯一性的属性,Kubernetes 提供了标签(Label)和 注解(Annotation)机制。

名称

某一时刻,只能有一个 给定类型的对象 具有给定的名称。但是,如果删除该对象,则可以创建同名的新对象。

名称在同一资源的所有 API 版本中必须是唯一的。

这些 API 资源通过各自的 API 组、资源类型、名字空间(对于划分名字空间的资源)和名称来区分。

当对象所代表的是一个物理实体(例如代表一台物理主机的 Node)时, 如果在 Node 对象未被删除并重建的条件下,重新创建了同名的物理主机, 则 Kubernetes 会将新的主机看作是老的主机,即:同名的同类型实体会实现覆盖,这可能会带来某种不一致性。

路径分段名称

某些资源类型要求名称能被安全地用作路径中的片段。 换句话说,其名称不能是 ...,也不可以包含 / 或 % 这些字符。

下面是一个名为 nginx-demo 的 Pod 的配置清单:

YAML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

UID

Kubernetes 系统生成的字符串,整个集群内的唯一标识对象。

在 Kubernetes 集群的整个生命周期中创建的每个对象都有一个不同的 UID,它旨在区分类似实体的历史事件。

Kubernetes UID 是全局唯一标识符(也叫 UUID)。