一、Kubernetes 中的资源

1、资源管理介绍

  • 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
  • kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务
  • 所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
  • kubernetes的最小管理单元是pod而不是容器,只能将容器放在Pod中,
  • kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。
  • Pod中服务的访问是由kubernetes提供的Service资源来实现。
  • Pod中程序的数据需要持久化是由kubernetes提供的各种存储系统来实现

在这里插入图片描述

2、资源管理方式

类型适用环境优点缺点
命令式对象管理测试简单只能操作活动对象,无法审计、跟踪
命令式对象配置开发可以审计、跟踪项目大时,配置文件多,操作麻烦
声明式对象配置开发支持目录操作意外情况下难以调试
  • 命令式对象管理:直接使用命令去操作kubernetes资源

    kubectl run webserver --image nginx --port=80

# 建立pod
[root@k8s-master ~]# kubectl run webserver --image nginx --port 80
pod/webserver created
[root@k8s-master ~]# kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
webserver   1/1     Running   0          6s
[root@k8s-master ~]# kubectl -n default get pods
NAME        READY   STATUS    RESTARTS   AGE
webserver   1/1     Running   0          21s
[root@k8s-master ~]# kubectl -n hxd get pods
No resources found in hxd namespace.

# 建立服务,暴露端口
[root@k8s-master ~]# kubectl expose pod webserver --port 80 --target-port 80 --external-ip 192.168.83.50

# 查看服务
[root@k8s-master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   61m
[root@k8s-master ~]# kubectl describe service webserver 
Name:                     webserver
Namespace:                default
Labels:                   run=webserver
Annotations:              <none>
Selector:                 run=webserver
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.103.65.125
IPs:                      10.103.65.125
External IPs:             192.168.83.50
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
Endpoints:                10.244.2.3:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>


# 删除服务
[root@k8s-master ~]# kubectl delete services webserver 
  • 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源

    kubectl create/patch -f webserver.yml

# 试运行
[root@k8s-master ~]# kubectl run webserver --image nginx --port 80 --dry-run=client -o yaml

# 建立命令
[root@k8s-master pod]# kubectl run webserver --image nginx --port 80 --dry-run=client -o yaml > webserver.yml

[root@k8s-master pod]# cat webserver.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: nginx
    name: webserver
    ports:
    - containerPort: 80
  restartPolicy: Always
[root@k8s-master pod]# kubectl create  -f webserver.yml 
pod/webserver created
[root@k8s-master pod]# kubectl  get pods 
NAME        READY   STATUS    RESTARTS   AGE
webserver   1/1     Running   0          21s

# 追加信息
[root@k8s-master pod]# kubectl expose pod webserver --port 80 --target-port 80 --external-ip 192.168.83.50 --dry-run=client -o yaml >> webserver.yml

# 进行修改
[root@k8s-master pod]# cat webserver.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: nginx
    name: webserver
    ports:
    - containerPort: 80
  restartPolicy: Always



---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  externalIPs:
  - 192.168.83.50
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: webserver


[root@k8s-master pod]# kubectl delete pods webserver 
pod "webserver" deleted
[root@k8s-master pod]# kubectl create -f webserver.yml 
pod/webserver created
service/webserver created
[root@k8s-master pod]# curl 192.168.83.50

# 该方式不能更改
[root@k8s-master pod]# kubectl create -f webserver.yml 
Error from server (AlreadyExists): error when creating "webserver.yml": pods "webserver" already exists
Error from server (AlreadyExists): error when creating "webserver.yml": services "webserver" already exists

# 删除
[root@k8s-master pod]# kubectl delete -f webserver.yml
  • 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源

    kubectl apply -f webserver.yml

# 既可以创建也可以更改
[root@k8s-master pod]# kubectl apply -f webserver.yml

2.1、命令式对象管理

kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署

kubectl命令的语法如下:

kubectl [command] [type] [name] [flags]

comand:指定要对资源执行的操作,例如create、get、delete

type:指定资源类型,比如deployment、pod、service

name:指定资源的名称,名称大小写敏感

flags:指定额外的可选参数

# 查看所有pod
kubectl get pod 

# 查看某个pod
kubectl get pod pod_name

# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

2.2、资源类型

kubernetes中所有的内容都抽象为资源

kubectl api-resources

常用资源类型

在这里插入图片描述

kubect 常见命令操作

在这里插入图片描述

2.3、基本命令示例

kubectl的详细说明地址:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

#显示集群版本
[root@k8s-master ~]# kubectl version
Client Version: v1.30.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.0
#显示集群信息
[root@k8s-master ~]# kubectl  cluster-info
Kubernetes control plane is running at https://172.25.254.100:6443
CoreDNS is running at https://172.25.254.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
# 查看命名空间
[root@k8s-master ~]# kubectl get namespace 
NAME              STATUS   AGE
default           Active   47m
kube-flannel      Active   45m
kube-node-lease   Active   47m
kube-public       Active   47m
kube-system       Active   47m

# 创建命名空间(不指定会创建在默认的default中)
[root@k8s-master ~]# kubectl create namespace hxd
namespace/hxd created
[root@k8s-master ~]# kubectl get namespace 
NAME              STATUS   AGE
default           Active   50m
hxd               Active   3s
kube-flannel      Active   48m
kube-node-lease   Active   50m
kube-public       Active   50m
kube-system       Active   50m

# 删除
[root@k8s-master ~]# kubectl delete namespace hxd
# 创建一个webcluster控制器,控制器中pod数量为2
[root@k8s-master ~]# kubectl create deployment webserver --image myapp:v1 --replicas 2
# 查看控制器
[root@k8s-master ~]# kubectl get  deployments.apps
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    3/3     3            3           69m
# 查看资源帮助
[root@k8s-master ~]# kubectl explain deployment
GROUP:      apps
KIND:       Deployment
VERSION:    v1

DESCRIPTION:
    Deployment enables declarative updates for Pods and ReplicaSets.

FIELDS:
  apiVersion    <string>
    APIVersion defines the versioned schema of this representation of an object.
    Servers should convert recognized schemas to the latest internal value, and
    may reject unrecognized values. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

  kind  <string>
    Kind is a string value representing the REST resource this object
    represents. Servers may infer this from the endpoint the client submits
    requests to. Cannot be updated. In CamelCase. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

  metadata      <ObjectMeta>
    Standard object's metadata. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

  spec  <DeploymentSpec>
    Specification of the desired behavior of the Deployment.

  status        <DeploymentStatus>
    Most recently observed status of the Deployment.

# 查看控制器参数帮助 
[root@k8s-master ~]# kubectl explain deployment.spec
GROUP:      apps
KIND:       Deployment
VERSION:    v1

FIELD: spec <DeploymentSpec>


DESCRIPTION:
    Specification of the desired behavior of the Deployment.
    DeploymentSpec is the specification of the desired behavior of the
    Deployment.

FIELDS:
  minReadySeconds       <integer>
    Minimum number of seconds for which a newly created pod should be ready
    without any of its container crashing, for it to be considered available.
    Defaults to 0 (pod will be considered available as soon as it is ready)

  paused        <boolean>
    Indicates that the deployment is paused.

  progressDeadlineSeconds       <integer>
    The maximum time in seconds for a deployment to make progress before it is
    considered to be failed. The deployment controller will continue to process
    failed deployments and a condition with a ProgressDeadlineExceeded reason
    will be surfaced in the deployment status. Note that progress will not be
    estimated during the time a deployment is paused. Defaults to 600s.

  replicas      <integer>
    Number of desired pods. This is a pointer to distinguish between explicit
    zero and not specified. Defaults to 1.

  revisionHistoryLimit  <integer>
    The number of old ReplicaSets to retain to allow rollback. This is a pointer
    to distinguish between explicit zero and not specified. Defaults to 10.

  selector      <LabelSelector> -required-
    Label selector for pods. Existing ReplicaSets whose pods are selected by
    this will be the ones affected by this deployment. It must match the pod
    template's labels.

  strategy      <DeploymentStrategy>
    The deployment strategy to use to replace existing pods with new ones.

  template      <PodTemplateSpec> -required-
    Template describes the pods that will be created. The only allowed
    template.spec.restartPolicy value is "Always".
# 编辑控制器配置
[root@k8s-master ~]# kubectl edit deployments.apps web
@@@@省略内容@@@@@@
spec:
  progressDeadlineSeconds: 600
  replicas: 2

[root@k8s-master ~]# kubectl get deployments.apps
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    2/2     2            2           73m
# 利用补丁更改控制器配置
[root@k8s-master ~]# kubectl patch  deployments.apps web -p '{"spec":{"replicas":4}}'
deployment.apps/web patched
[root@k8s-master ~]# kubectl get deployments.apps
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    4/4     4            4           74m
# 删除资源
[root@k8s-master ~]# kubectl delete deployments.apps web
deployment.apps "web" deleted
[root@k8s-master ~]# kubectl get deployments.apps
No resources found in default namespace.

2.4、运行和调试命令示例

# 运行pod
[root@k8s-master ~]# kubectl run test --image myapp:v1
pod/testtest created
[root@k8s-master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          7s
# 端口暴漏
[root@k8s-master ~]# kubectl get  services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   2d14h

[root@k8s-master ~]# kubectl expose pod testpod --port 80 --target-port 80
service/testpod exposed

[root@k8s-master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   2d14h
testpod      ClusterIP   10.106.78.42   <none>        80/TCP    18s
[root@k8s-master ~]# curl  10.106.78.42
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
#查看资源详细信息 
[root@k8s-master ~]# kubectl describe pods test
#查看资源日志
[root@k8s-master ~]# kubectl logs pods/testpod
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2024/08/29 05:37:29 [notice] 1#1: using the "epoll" event method
2024/08/29 05:37:29 [notice] 1#1: nginx/1.27.1
2024/08/29 05:37:29 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/08/29 05:37:29 [notice] 1#1: OS: Linux 5.14.0-427.13.1.el9_4.x86_64
2024/08/29 05:37:29 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2024/08/29 05:37:29 [notice] 1#1: start worker processes
2024/08/29 05:37:29 [notice] 1#1: start worker process 29
10.244.0.0 - - [29/Aug/2024:05:41:11 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.76.1" "-"
10.244.0.0 - - [29/Aug/2024:05:42:51 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.76.1" "-"
# 运行交互pod
[root@k8s-master ~]# kubectl run -it test --image busybox

If you don't see a command prompt, try pressing enter.
/ #
/ #	              #ctrl+pq退出不停止pod

# 运行非交互pod
[root@k8s-master ~]# kubectl run  test  --image myapp:v1
pod/myapp:v1 created

#进入到已经运行的容器,且容器有交互环境
[root@k8s-master ~]# kubectl attach pods/test  -it
If you don't see a command prompt, try pressing enter.
/ #
/ #

#在已经运行的pod中运行指定命令
[root@k8s-master ~]# kubectl exec  -it pods/test  /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@test:/#

2.5、高级命令示例

#利用命令生成yaml模板文件
[root@k8s-master pod]# kubectl create deployment webserver --image  myapp:v1 --replicas 2 --dry-run=client -o yaml  > webserver.yml


#利用yaml文件生成资源
[root@k8s-master ~]# vim webserver.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webserver
  name: webserver
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      labels:
        app: webserver
    spec:
      containers:
      - image: myapp:v1
        name: myapp


[root@k8s-master pod]# kubectl apply -f webserver.yml 
deployment.apps/webserver created

[root@k8s-master pod]# kubectl get deployments.apps 
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
webserver   2/2     2            2           7s
[root@k8s-master pod]# kubectl get deployments.apps  --show-labels 
NAME        READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
webserver   2/2     2            2           11s   app=webserver



[root@k8s-master pod]# kubectl delete -f webserver.yml 
deployment.apps "webserver" deleted
# 管理资源标签
[root@k8s-master pod]# kubectl get pods --show-labels 
NAME                         READY   STATUS              RESTARTS   AGE   LABELS
webserver-6f77cbf6fb-cgn48   1/1     Running             0          10s   app=webserver,pod-template-hash=6f77cbf6fb

# 更改标签
[root@k8s-master ~]# kubectl label pods webserver-6f77cbf6fb-sfsfp app=test

# 删除标签
[root@k8s-master ~]# kubectl label pods webserver-6f77cbf6fb-sfsfp app- --overwrite
[root@k8s-master ~]# kubectl get pods nginx --show-labels


# 标签时控制器识别pod示例的标识
[root@k8s-master ~]# kubectl get pods --show-labels


# 删除pod上的标签
[root@k8s-master ~]# kubectl label pods webserver-6f77cbf6fb-sfsf app=test --overwrite

# 控制器会重新启动新pod
[root@k8s-master ~]# kubectl get pods --show-labels

二、什么是pod

1、pod的介绍

  • Pod是可以创建和管理Kubernetes计算的最小可部署单元
  • 一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
  • 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker)
  • 多个容器间共享IPC、Network和UTC namespace。

2、创建自主式pod (生产不推荐)

优点:

灵活性高:

  • 可以精确控制 Pod 的各种配置参数,包括容器的镜像、资源限制、环境变量、命令和参数等,满足特定的应用需求。

学习和调试方便:

  • 对于学习 Kubernetes 的原理和机制非常有帮助,通过手动创建 Pod 可以深入了解 Pod 的结构和配置方式。在调试问题时,可以更直接地观察和调整 Pod 的设置。

适用于特殊场景:

  • 在一些特殊情况下,如进行一次性任务、快速验证概念或在资源受限的环境中进行特定配置时,手动创建 Pod 可能是一种有效的方式。

缺点:

管理复杂:

  • 如果需要管理大量的 Pod,手动创建和维护会变得非常繁琐和耗时。难以实现自动化的扩缩容、故障恢复等操作。

缺乏高级功能:

  • 无法自动享受 Kubernetes 提供的高级功能,如自动部署、滚动更新、服务发现等。这可能导致应用的部署和管理效率低下。

可维护性差:

  • 手动创建的 Pod 在更新应用版本或修改配置时需要手动干预,容易出现错误,并且难以保证一致性。相比之下,通过声明式配置或使用 Kubernetes 的部署工具可以更方便地进行应用的维护和更新。
#查看所有pods
[root@k8s-master ~]# kubectl get pods
No resources found in default namespace.

# 建立一个名为websever的pod
[root@k8s-master ~]# kubectl run timinglee --image myapp:v1
pod/websever created


[root@k8s-master ~]# kubectl get pods

# 显示pod的较为详细的信息
[root@k8s-master ~]# kubectl get pods -o wide

3、利用控制器管理pod(推荐)

高可用性和可靠性:

  • 自动故障恢复:如果一个 Pod 失败或被删除,控制器会自动创建新的 Pod 来维持期望的副本数量。确保应用始终处于可用状态,减少因单个 Pod 故障导致的服务中断。
  • 健康检查和自愈:可以配置控制器对 Pod 进行健康检查(如存活探针和就绪探针)。如果 Pod 不健康,控制器会采取适当的行动,如重启 Pod 或删除并重新创建它,以保证应用的正常运行。

可扩展性:

  • 轻松扩缩容:可以通过简单的命令或配置更改来增加或减少 Pod 的数量,以满足不同的工作负载需求。例如,在高流量期间可以快速扩展以处理更多请求,在低流量期间可以缩容以节省资源。
  • 水平自动扩缩容(HPA):可以基于自定义指标(如 CPU 利用率、内存使用情况或应用特定的指标)自动调整 Pod 的数量,实现动态的资源分配和成本优化。

版本管理和更新:

  • 滚动更新:对于 Deployment 等控制器,可以执行滚动更新来逐步替换旧版本的 Pod 为新版本,确保应用在更新过程中始终保持可用。可以控制更新的速率和策略,以减少对用户的影响。
  • 回滚:如果更新出现问题,可以轻松回滚到上一个稳定版本,保证应用的稳定性和可靠性。

声明式配置:

  • 简洁的配置方式:使用 YAML 或 JSON 格式的声明式配置文件来定义应用的部署需求。这种方式使得配置易于理解、维护和版本控制,同时也方便团队协作。
  • 期望状态管理:只需要定义应用的期望状态(如副本数量、容器镜像等),控制器会自动调整实际状态与期望状态保持一致。无需手动管理每个 Pod 的创建和删除,提高了管理效率。

服务发现和负载均衡:

  • 自动注册和发现:Kubernetes 中的服务(Service)可以自动发现由控制器管理的 Pod,并将流量路由到它们。这使得应用的服务发现和负载均衡变得简单和可靠,无需手动配置负载均衡器。
  • 流量分发:可以根据不同的策略(如轮询、随机等)将请求分发到不同的 Pod,提高应用的性能和可用性。

多环境一致性:

  • 一致的部署方式:在不同的环境(如开发、测试、生产)中,可以使用相同的控制器和配置来部署应用,确保应用在不同环境中的行为一致。这有助于减少部署差异和错误,提高开发和运维效率。

示例:

# 建立控制器并自动运行pod
[root@k8s-master ~]# kubectl run test --image myapp:v1 --dry-run=client -o yaml > test.yml

[root@k8s-master pod]# cat test.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: test
  name: test
spec:
  containers:
  - image: myapp:v1
    name: test
  - image: myapp:v2
    name: test2
    command:
      - /bin/sh
      - -c
      - sleep 10000


[root@k8s-master pod]# kubectl get pods 
NAME   READY   STATUS    RESTARTS   AGE
test   2/2     Running   0          5s


# 缠绕
# 失败
[root@k8s-master pod]# kubectl attach pods/test -c test
If you don't see a command prompt, try pressing enter.

[root@k8s-master pod]# kubectl -it exec  pods/test -c test /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # 
/ # curl localhost

# 查看日志
[root@k8s-master pod]# kubectl logs pods/test -c test2


# kube-flannel控制器
[root@k8s-master pod]# kubectl  -n kube-flannel get daemonsets.apps 
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
kube-flannel-ds   3         3         3       3            3           <none>          30m
[root@k8s-master pod]# kubectl  -n kube-flannel get daemonsets.apps -o wide

[root@k8s-master pod]#  kubectl  -n kube-flannel get pods
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-fsmmc   1/1     Running   0          33m
kube-flannel-ds-lxsw4   1/1     Running   0          33m
kube-flannel-ds-sklkp   1/1     Running   0          33m
[root@k8s-master pod]#  kubectl  -n kube-flannel get pods -o wide

# 为webserver扩容
[root@k8s-master pod]# kubectl scale deployment webserver --replicas 2
deployment.apps/webserver scaled

# 监控
[root@k8s-master pod]# watch -n1 kubectl get pods -o wide

# 为webserver缩容
[root@k8s-master pod]# kubectl scale deployment webserver --replicas 1
deployment.apps/webserver scaled
[root@k8s-master pod]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
webserver-6f77cbf6fb-qnz5r   1/1     Running   0          11m

4、应用版本的更新

# 利用控制器建立pod
[root@k8s-master ~]# kubectl create  deployment webserver --image myapp:v1 --replicas 2

# 暴漏端口
[root@k8s-master ~]# kubectl expose deployment webserver --port 80 --target-port 80  external-ip 192.168.83.50

[root@k8s-master ~]# kubectl describe service webserver


# 访问服务
[root@k8s-master ~]# curl  10.104.163.6
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

# 产看历史版本
[root@k8s-master ~]# kubectl rollout history deployment webserver 
deployment.apps/webserver 
REVISION  CHANGE-CAUSE
1         <none>

# 更新控制器镜像版本
[root@k8s-master ~]# kubectl set image deployments/webserver myapp=myapp:v2
deployment.apps/webserver image updated

# 查看历史版本
[root@k8s-master pod]# kubectl rollout history deployment webserver 
deployment.apps/webserver 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

# 访问内容测试
[root@k8s-master pod]# curl  10.104.163.6
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>


# 版本回滚
[root@k8s-master ~]# kubectl rollout undo deployment webserver --to-revision 1
deployment.apps/webserver rolled back
[root@k8s-master pod]# curl  10.104.163.6
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

5、利用yaml文件部署应用

5.1、用yaml文件部署应用有以下优点

声明式配置:

  • 清晰表达期望状态:以声明式的方式描述应用的部署需求,包括副本数量、容器配置、网络设置等。这使得配置易于理解和维护,并且可以方便地查看应用的预期状态。
  • 可重复性和版本控制:配置文件可以被版本控制,确保在不同环境中的部署一致性。可以轻松回滚到以前的版本或在不同环境中重复使用相同的配置。
  • 团队协作:便于团队成员之间共享和协作,大家可以对配置文件进行审查和修改,提高部署的可靠性和稳定性。

灵活性和可扩展性:

  • 丰富的配置选项:可以通过 YAML 文件详细地配置各种 Kubernetes 资源,如 Deployment、Service、ConfigMap、Secret 等。可以根据应用的特定需求进行高度定制化。
  • 组合和扩展:可以将多个资源的配置组合在一个或多个 YAML 文件中,实现复杂的应用部署架构。同时,可以轻松地添加新的资源或修改现有资源以满足不断变化的需求。

与工具集成:

  • 与 CI/CD 流程集成:可以将 YAML 配置文件与持续集成和持续部署(CI/CD)工具集成,实现自动化的应用部署。例如,可以在代码提交后自动触发部署流程,使用配置文件来部署应用到不同的环境。
  • 命令行工具支持:Kubernetes 的命令行工具 kubectl 对 YAML 配置文件有很好的支持,可以方便地应用、更新和删除配置。同时,还可以使用其他工具来验证和分析 YAML 配置文件,确保其正确性和安全性。

5.2、资源清单参数

参数名称类型参数说明
versionString这里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查询
kindString这里指的是yaml文件定义的资源类型和角色,比如:Pod
metadataObject元数据对象,固定值就写metadata
metadata.nameString元数据对象的名字,这里由我们编写,比如命名Pod的名字
metadata.namespaceString元数据对象的命名空间,由我们自身定义
SpecObject详细定义对象,固定值就写Spec
spec.containers[]list这里是Spec对象的容器列表定义,是个列表
spec.containers[].nameString这里定义容器的名字
spec.containers[].imagestring这里定义要用到的镜像名称
spec.containers[].imagePullPolicyString定义镜像拉取策略,有三个值可选: (1) Always: 每次都尝试重新拉取镜像 (2) IfNotPresent:如果本地有镜像就使用本地镜像 (3) )Never:表示仅使用本地镜像
spec.containers[].command[]list指定容器运行时启动的命令,若未指定则运行容器打包时指定的命令
spec.containers[].args[]list指定容器运行参数,可以指定多个
spec.containers[].workingDirString指定容器工作目录
spec.containers[].volumeMounts[]list指定容器内部的存储卷配置
spec.containers[].volumeMounts[].nameString指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPathString指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnlyString设置存储卷路径的读写模式,ture或false,默认为读写模式
spec.containers[].ports[]list指定容器需要用到的端口列表
spec.containers[].ports[].nameString指定端口名称
spec.containers[].ports[].containerPortString指定容器需要监听的端口号
spec.containers[] ports[].hostPortString指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocolString指定端口协议,支持TCP和UDP,默认值为 TCP
spec.containers[].env[]list指定容器运行前需设置的环境变量列表
spec.containers[].env[].nameString指定环境变量名称
spec.containers[].env[].valueString指定环境变量值
spec.containers[].resourcesObject指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers[].resources.limitsObject指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpuString指定CPU的限制,单位为核心数,1=1000m
spec.containers[].resources.limits.memoryString指定MEM内存的限制,单位为MIB、GiB
spec.containers[].resources.requestsObject指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpuStringCPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memoryString内存请求,单位为MIB、GIB,容器启动的初始化可用数量
spec.restartPolicystring定义Pod的重启策略,默认值为Always. (1)Always: Pod-旦终止运行,无论容器是如何 终止的,kubelet服务都将重启它 (2)OnFailure: 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubelet将不会重启它 (3) Never: Pod终止后,kubelet将退出码报告给Master,不会重启该
spec.nodeSelectorObject定义Node的Label过滤标签,以key:value格式指定
spec.imagePullSecretsObject定义pull镜像时使用secret名称,以name:secretkey格式指定
spec.hostNetworkBoolean定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机 上启动第二个副本

5.3、如何获得资源帮助

kubectl explain pod.spec.containers

5.4、编写示例

示例1:运行简单的单个容器pod

用命令获取yaml模板

[root@k8s-master pod]# kubectl run webserver --image myapp:v1 --dry-run=client -o yaml > pod.yml
[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver			# pod标签
  name: webserver		# pod名称
spec:
  containers:
    - image: myapp:v1		# pod镜像
      name: webserver		# 容器名称

示例2:运行多个容器pod

[!WARNING]

注意如果多个容器运行在一个pod中,资源共享的同时在使用相同资源时也会干扰,比如端口

# 一个端口干扰示例:
[root@k8s-master pod]# vim pod.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
    - image: myapp:v1
      name: webserver

    - image: busyboxplus
      name: busybox 
      
[root@k8s-master pod]# kubectl apply -f pod.yml

[root@k8s-master pod]# kubectl get pods
NAME        READY   STATUS             RESTARTS        AGE
webserver   1/2     CrashLoopBackOff   6 (3m15s ago)   9m8s


# 查看日志
[root@k8s-master pod]# kubectl logs webserver webserver2

[!NOTE]

在一个pod中开启多个容器时一定要确保容器彼此不能互相干扰

[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
    - image: myapp:v1
      name: webserver

    - image: busyboxplus
      name: busybox
      command:
        - /bin/sh
        - -c
        - sleep 10000

[root@k8s-master pod]# kubectl apply -f pod.yml

[root@k8s-master pod]# kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
webserver   2/2     Running   0          19s

示例3:理解pod间的网络整合

同在一个pod中的容器公用一个网络

[root@k8s-master ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: hxd
  name: test
spec:
  containers:
    - image: myapp:v1
      name: webserver

    - image: busyboxplus
      name: busybox
      command:
        - /bin/sh
        - -c
        - sleep 10000


[root@k8s-master pod]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
test   2/2     Running   0          3m19s
[root@k8s-master pod]# kubectl exec test -c busybox -- curl -s localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

示例4:端口映射

[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: hxd	
  name: test		
spec:
  containers:
    - image: myapp:v1		
      name: webserver
      ports:
        - name: http
          containerPort: 80
          hostPort: 80
          protocol: TCP


# 测试
[root@k8s-master pod]# kubectl apply -f pod.yml
pod/test created

[root@k8s-master pod]# kubectl get pods -o wide 
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
test   1/1     Running   0          60s   10.244.2.14   k8s-node2   <none>           <none>
[root@k8s-master pod]# curl  k8s-node2 hxd.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

示例5:如何设定环境变量

[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: hxd
  name: test
spec:
  containers:
    - image: busybox
      name: busybox
      command: ["/bin/sh","-c","echo $NAME;sleep 3000000"]
      env:
      - name: NAME
        value: dyy

        
[root@k8s-master pod]# kubectl apply -f pod.yml
pod/test created
[root@k8s-master pod]# kubectl logs pods/test busybox
dyy

更多推荐