Kubernetes中的容器类型

1 Yaml文件

k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到YAML 格式文件中,我们把这种文件叫做资源清单文件,通过kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。

1.1 语法

YAML 基本语法如下:

  • 使用空格做为缩进
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 低版本缩进时不允许使用Tab 键,只允许使用空格
  • 使用#表示注释,从这个字符一直到行尾,都会被解释器忽略
  • 使用 --- 表示新的yaml文件开始

YAML 支持如下的数据结构

对象:键值对的集合,又称为映射(mapping) / 哈希(hashes) / 字典(dictionary)

# 对象类型:对象的一组键值对,使用冒号结构表示
name: Tom
age: 18

# yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash: {name: Tom, age: 18}

数组

# 数组类型:一组连词线开头的行,构成一个数组
People
- Tom
- Jack

# 数组也可以采用行内表示法
People: [Tom, Jack]

YAML文件主要分为了两部分,一个是控制器 和 被控制的对象

1.2 属性

在一个YAML文件的控制器定义中,有很多属性名称

属性名称介绍
apiVersionAPI版本
kind资源类型
metadata资源元数据
spec资源规格
replicas副本数量
selector标签选择器
templatePod模板
metadataPod元数据
specPod规格
containers容器配置

1.3 编写YAML文件

一般来说,我们很少自己手写YAML文件,而是借助工具来创建

使用kubectl create命令,一般用于资源没有部署的时候,我们可以直接创建一个YAML配置文件

# 尝试运行,并不会真正的创建镜像
kubectl create deployment web --image=nginx -o yaml --dry-run
# 输出到一个文件中
kubectl create deployment web --image=nginx -o yaml --dry-run > hello.yaml

使用kubectl get命令导出yaml文件,生成一个 nginx.yaml 的配置文件

kubectl get deploy nginx -o=yaml --export > nginx.yaml

2 Controller

Controller是在集群上管理和运行容器的对象。Pod 和 Controller之间是通过label标签来建立关系,从而实现应用的运维,比如弹性伸缩,滚动升级等。

2.1 Deployment控制器

应用部署

Deployment控制器可以部署无状态应用,管理Pod和ReplicaSet,进行部署、滚动升级、自我修复等功能。自愈:例如当容器临时挂掉后,kubelet会尝试对容器进行重启;故障转移(failover):当某个机器节点故障时,会将机器上运行的pod转移到其他机器继续运行。

直接使用deployment部署应用

kubectrl create deployment web --image=nginx

为了更好地重用和配置,所以我们都是通过YAML进行部署。首先将部署配置输出到一个文件

kubectl create deployment web --image=nginx --dry-run -o yaml > nginx.yaml

yaml配置文件 nginx.yml ,配置文件如下所示

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

通过YAML文件创建应用“web”,并对外暴露端口

kubectl apply -f nginx.yaml
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1

其中

  • –port:是内部的端口号
  • –target-port:暴露外面访问的端口号
  • –name:名称
  • –type:类型,这里通过NodePort对外暴露端口

将上面的操作一起写入配置文件中

kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml

得到的web1.yaml如下所示

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2020-11-16T02:26:53Z"
  labels:
    app: web
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:app: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: kubectl
    operation: Update
    time: "2020-11-16T02:26:53Z"
  name: web2
  namespace: default
  resourceVersion: "113693"
  selfLink: /api/v1/namespaces/default/services/web2
  uid: d570437d-a6b4-4456-8dfb-950f09534516
spec:
  clusterIP: 10.104.174.145
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 32639
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

查看对外暴露的服务

在这里插入图片描述

升级回滚

通过controller可以便捷地将应用升级到最新版本或切换回之前的某个版本

首先创建一个 1.14版本的nginx

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx:1.14
        name: nginx
        resources: {}
status: {}
kubectl apply -f nginx.yaml

我们使用下面的命令,可以将nginx从 1.14 升级到 1.15

kubectl set image deployment web nginx=nginx:1.15

在我们执行完命令后,能看到升级的过程

  • 首先是开始的nginx 1.14版本的Pod在运行,然后 1.15版本的在创建
  • 1.15版本创建完成后,就会暂停1.14版本
  • 最后才把1.14版本的Pod移除,从而保证在升级过程中服务并不会中断

在这里插入图片描述

也可以将应用进行回滚

# 查看升级状态
kubectl rollout status deployment web
# 查看历史版本
kubectl rollout history deployment web
# 回滚到上一个版本
kubectl rollout undo deployment web
# 回滚到指定版本
kubectl rollout undo deployment web --to-revision=2
弹性伸缩

但应用访问遇到瓶颈时,可以通过如下命令增加节点来缓解访问压力

kubectl scale deployment web --replicas=10

能够清晰看到,新增了10个副本

在这里插入图片描述

2.2 Statefulset

Statefulset主要是用来部署有状态应用

  • 无状态应用中所有Pod之间是无法区分的,它们都是一样的,从而不需要考虑应用在哪个node上运行,能够进行随意伸缩和扩展。
  • 有状态应用中每个Pod都是各不相同的,各自具有唯一的网络标识符和存储

对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续以它的状态提供服务。适合StatefulSet的业务包括数据库服务MySQL 和 PostgreSQL,集群化管理服务Zookeeper、etcd等有状态服务

使用StatefulSet,Pod仍然可以通过漂移到不同节点提供高可用,而存储也可以通过外挂的存储来提供高可靠性,StatefulSet做的只是将确定的Pod与确定的存储关联起来保证状态的连续性。

使用 StatefulSet部署有状态应用

apiVersion: apps
kind: StatefulSet
metadata:
  name: nginx-statefulset
  namespace: default
spec:
  serviceName: nginx
  replicas:
    selector:
      matchLabels:
      - app: nginxj
    template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx:latest
          ports:
          - containerPort: 80

然后通过查看pod,能否发现每个pod都有唯一的名称

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x4Sq1jCD-1661438498263)(https://gitee.com/moxi159753/LearningNotes/raw/master/K8S/11_Kubernetes%E6%8E%A7%E5%88%B6%E5%99%A8Controller%E8%AF%A6%E8%A7%A3/images/image-20201117203217016.png)]

在deployment中是有身份的,有唯一标识,而statefulset是根据主机名 + 按照一定规则生成域名,每个pod有唯一的主机名,并且有唯一的域名

  • 格式:主机名称.service名称.名称空间.svc.cluster.local
  • 举例:nginx-statefulset-0.default.svc.cluster.local

2.3 DaemonSet

DaemonSet 即后台支撑型服务,主要是用来部署守护进程。从而保证Pod运行在所有集群节点,或者是nodeSelector选定的全部节点。典型的后台支撑型服务包括:存储、日志和监控等。在每个节点上支撑K8S集群运行的服务。

守护进程在我们每个节点上,运行的是同一个pod,新加入的节点也同样运行在同一个pod里面

  • 例子:在每个node节点安装数据采集工具FileBeat
apiVersion: apps/vl
kind: DaemonSet
metadata:
  name: ds-test
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
    template:
      metadata:
        labels:
          app: filebeat
      spec:
        containers:
        - name: logs
          image: nginx
          ports:
          - containerPort: 8 0
          volumeMount s:
          - name: varlog
            mountPath: /tmp/log
        volumes:
          -name: varlog
          hostPath:
            path: /var/log

2.4 Job

Job也即一次性任务,一次性执行完就结束。

Job是K8S中用来控制批处理型任务的API对象。批处理业务与长期伺服业务的主要区别就是批处理业务的运行有头有尾,而长期伺服业务在用户不停止的情况下永远运行。Job管理的Pod根据用户的设置把任务成功完成就自动退出了。成功完成的标志根据不同的 spec.completions 策略而不同:单Pod型任务有一个Pod成功就标志完成;定数成功行任务保证有N个任务全部成功;工作队列性任务根据应用确定的全局成功而标志成功。

apiVersion: batch/vl
# 一次性任务
kind: Job                    
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
        - name: pi
          image: perl
          command: ["perl", "-Mbignum=bpi", "-wle", "print bpi (2000)"]
        restartPolicy: Never
  backoffLimit: 4

使用下面命令,能够看到目前已经存在的Job

kubectl get jobs

2.5 CronJob

定时任务,根据cron表达式配置的规则每隔一段时间执行一次

apiVersion: batch/vl
# 定期任务
kind: CronJob
metadata: 
  name: dailyJob
spec:
  # 设置执行周期
  schedule: "*/l * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: dailyJob
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes
          restartPolicy: OnFailure

然后下面命令就是每个一段时间输出

我们首先用上述的配置文件,创建一个定时任务

kubectl apply -f cronjob.yaml

创建完成后,我们就可以通过下面命令查看定时任务

kubectl get cronjobs

2.6 Service

在K8S集群中,Service可以将一组 Pods 抽象为一个公开的网络服务,只需要对使用者统一暴露一个服务地址,不必区分内部具体实现的pod。通过Service可以提供服务发现和负载均衡的功能。

服务发现:Pod应用将自己的地址注册到Service中,从而把请求路由到指定的节点进行处理并返回。例如当Pod对应的某个节点停止工作时,另一个节点以一个新的IP启动一个新的Pod,并向Service中注册自己的IP和端口号以替换原来的Pod,这样当请求再次到达时可以路由到新的节点。

负载均衡:当请求过多时,将请求分散到不同的节点进行处理以缓解压力。微服务的负载均衡是由kube-proxy实现的,它是一个分布式代理服务器,在K8S的每个节点上都有一个。

访问类型

在访问service的时候,其实也是需要有一个ip地址,这个ip肯定不是pod的ip地址,而是 虚拟IP vip

Service常用类型有三种

  • ClusterIp:集群内部访问
  • NodePort:对外访问应用使用,会在每个pod随机开一个端口供外部进行访问
  • LoadBalancer:对外访问应用使用,公有云

通过expose命令暴露App名为web的服务,并将服务的8000端口和pod内的80端口建立映射。如果我们没有做设置的话,默认使用的是第一种方式 ClusterIp,也就是只能在集群内部使用,可以通过--type参数设置service类型

kubectl expose deployment web --port=8000 --target-port=80 --dry-run -o yaml > service.yaml

导出包含service的配置信息如下

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  type: NodePort
status:
  loadBalancer: {}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kubernetes 是一个开源的容器编排工具,可以帮助用户自动化部署、扩展和管理容器化应用程序。在 Kubernetes ,资源对象是指用于描述和管理集群各种资源的抽象概念。 以下是 Kubernetes 常见的资源对象类型: 1. Pod(容器组):Pod 是 Kubernetes 最小的可部署对象,通常包含一个或多个容器,共享同一个网络命名空间和存储卷。 2. ReplicaSet(副本集):ReplicaSet 用于管理一组相同的 Pod 副本,保证在集群的任何时间都有指定数量的副本运行。 3. Deployment(部署):Deployment 是一种管理 Pod 和 ReplicaSet 的高级对象,用于实现容器化应用程序的滚动更新和回滚。 4. Service(服务):Service 提供了一种逻辑方式来访问一组 Pod,通常用于将网络流量路由到后端的 Pod。 5. ConfigMap(配置映射):ConfigMap 用于存储集群的配置数据,例如应用程序的环境变量和配置文件。 6. Secret(密钥):Secret 用于存储敏感信息,例如密码和证书,以安全地在集群传输和存储。 7. PersistentVolume(持久卷):PersistentVolume 用于将持久化存储抽象出来,使其在不同的存储系统之间具有可移植性。 8. StatefulSet(有状态集):StatefulSet 用于管理具有唯一标识和稳定网络标识符的 Pod,通常用于运行需要持久化存储和有状态服务的应用程序。 这些资源对象是 Kubernetes 集群的基本构建块,使用它们可以轻松地管理和扩展容器化应用程序。 ### 回答2: Kubernetes的资源对象是指在Kubernetes集群由用户定义和管理的各种资源类型,用于表示和控制应用程序、服务和基础设施等方面的相关资源。 Kubernetes提供了多种资源对象,包括但不限于以下几种: 1. Pod(容器组):Pod是Kubernetes最小的可调度和部署单元,可以包含一个或多个容器。Pod通常将相关的容器组合在一起,共享网络和存储,并提供容器之间的通信和数据共享。 2. ReplicaSet(副本集):ReplicaSet用于定义和管理Pod的集合。它确保指定数量的Pod副本运行,并根据需要自动进行缩放,以实现应用程序的高可用性和负载均衡。 3. Deployment(部署):Deployment是ReplicaSet的高级抽象,用于实现无缝的应用程序部署和升级。它可以定义应用程序的副本数、升级策略和滚动升级等参数,并确保在应用程序版本变更时无需停机。 4. Service(服务):Service定义了一组Pod的访问方式和网络连接,提供了一个稳定的地址和端口,使得其他Pod或外部用户能够与应用程序进行通信。 除了上述常用资源对象,还有诸如ConfigMap(配置映射)、Secret(密钥)、Namespace(命名空间)等资源对象,它们用于管理和传递应用程序的配置信息、敏感数据和资源隔离等方面的需求。 通过使用这些资源对象,用户可以方便地定义和管理各种不同类型的应用程序和服务,并通过Kubernetes提供的强大的调度和管理功能,实现高可用性、弹性伸缩和自动化的应用程序部署和运维。 ### 回答3: Kubernetes 的资源对象是指在集群定义和管理的可部署的计算资源。它们用来描述和控制应用程序的部署、扩展和管理。Kubernetes 有多种资源对象可供使用,如下所示: 1. Pod: Pod 是 Kubernetes 最小的可部署对象单元。它由一个或多个容器组成,并共享相同的网络和存储资源。Pod 可以用来运行一个或多个容器应用程序。 2. Deployment: Deployment 是用来管理 Pod 的资源对象。它定义了一组 Pod 的副本,并负责监控和维护这些 Pod 的状态。通过 Deployment,可以方便地进行应用的部署、升级和回滚操作。 3. Service: Service 是用来暴露 Pod 的网络服务的资源对象。它为一组 Pod 提供了一个统一的访问入口,并负责将请求按照相应的负载均衡算法分发给后端的 Pod。 4. Volume: Volume 是用来管理 Pod 的存储资源的资源对象。它可以将外部存储系统挂载到 Pod ,以便应用程序可以进行持久化数据的存储。 此外,Kubernetes 还提供了许多其他类型的资源对象,如 StatefulSet、DaemonSet、Job、CronJob 等,用于满足不同应用程序的需求。这些资源对象可以通过 YAML 或 JSON 文件进行定义和配置,并通过 Kubernetes API 进行管理和操作。 通过使用 Kubernetes 的资源对象,我们可以更方便地管理和部署应用程序,实现高可用性和弹性的系统架构,提高应用程序的可靠性和可扩展性。它为开发人员和运维人员提供了一种简单而强大的方式来管理和扩展应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值