K8S哲学 - Pod、RC、RS、deployment

pod(最小的可部署单元)

容器组(运行一个或多个容器)

Pod(容器组)是Kubernetes 中最小的可部署单元。
一个Pod(容器组)包含了一个应用程序容器(某些情况下是多个容器)、存储资源、
一个唯一的网络 iP 地址、以及一些确定容器该如何运行的选项。Pod 容器组代表了 Kubernetes 中一个独立的应用程中运行实例,该实例可能由单个容器或几个紧藕合在一
起的容器组成。


Docker 是 Kubernetes Pod 中使用最广泛的容器引擎;
Kubernetes Pod 同时也支诗其他类型的容器引擎

Kubernetes 集群中的Pod 存在如下两种使用途径

一个Pod 中只运行一个容器。"one-container-per-pod " 是Kubernetes 中最常见的使用方式。此时、可以认为 Pod容器组是该容器的 wrapper. Kubernetes 通过 Pod 管理容器,而不是直接管理容器。


一个pod中运行多个需要互相协作的容器。可以将多个紧密耦合、共享资源且始终

在一起运行的容器编排在同一个Pod 中,

pod 副本(replicas)

一个pod可以被复制成多份,每一份可被称之为一个"副本”,这些副本-除了一些描述性的信息 (Pod的名字、uid 等)不一样以外,其它信息都是一样的,譬如Pod
内部的容器 容器数量,容器里面运行的应用等的这些信息都是一样的,这些副本提供同样的功能。
Pod 的“控制器“通常包含一个名为“replicas” 的厲性。“replicas”属性则指定了特定 Pod 的副本的数量,当前集群中该 Pod 的数量与该属性指定的值不一致时,k8s 会采取一些策路去使得当前状态满足配置的要求。

如何共享容器间的 网络?

每个容器有自己独立的网络,

java(容器一) 和 mysql (容器二) 不能通过  locallost连接(相当于容器一本身)

docker 连接同一网络 或  容器间  --links (/etc/host加链接容器ip)

如何共享文件系统? 

docker  连接同一个 volume、

k8s 延伸出pod 来实现 网络、文件系统共享

pod 里面的 基础服务 pause 容器 是 多容器间实现 网络、文件系统共享的基础

控制器

在 Kubernetes 中,Pod 控制器是用于管理 Pod 生命周期的对象。它们可以确保指定数量和类型的 Pod 始终在运行。

无状态:nginx

有状态(statefulSet):mysql、redies

守护进程:日志收集

定时任务:

rc:replicationController 

动态更新 pod副本数 、v1.11后被废弃,用replicaSet替代

repilcas = 3

Kubernetes 官方建议使用 RS (Replicaset)替代RC(ReplicationController)进行部署,RS 跟 RC 没有本质的不同,只是名字不一样,井且 RS 支持集合式的 selector

rs:replicaSet

相较于 replicationController 增加了 lable 和 selector 的机制、可以更为精确对某一个 pod打标签,后期可以只对 选中标签的pod进行操作

lable :app1 、app2 ,将lable为app2的pod的副本设置为 3个 

如果你在 Pod 模板的 metadata.labels 部分定义了多个标签,
如 app=nginx、app2=gyk 和 app3=cnm,
那么 Kubernetes 将在创建每个 Pod 时都会包含这些标签。
这意味着,如果 replicas=3,
那么将会有三个 Pod,每个 Pod 
都包含 app=nginx、app2=gyk 和 app3=cnm 这三个标签

在这个例子中,Deployment 将创建三个 Pod,
每个 Pod 都包含 app=nginx、app2=gyk 和 app3=cnm 这三个标签。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        app2: gyk
        app3: cnm
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80



在 Kubernetes 的 Deployment 配置中,
selector.matchLabels 定义了 Deployment 
如何找到它应该管理的 Pod。

selector.matchLabels 是一个标签选择器,
它会匹配所有具有指定标签的 Pod。在你的例子中,
selector.matchLabels 是 {app: nginx},
这意味着这个 Deployment 
将管理所有带有 app=nginx 标签的 Pod。

在你的配置中,template.metadata.labels 
定义了由这个 Deployment 
创建的每个 Pod 的标签,
包括 app: nginx、app2: gyk 和 app3: cnm。
因为这些 Pod 都有 app=nginx 标签,
所以它们都会被这个 Deployment 管理。



deployment

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将正在 k8s-node1 节点上运行的名为 apache-podpod 扩容到 k8s-node2 节点,并同时在这两个节点上运行 pod,请按照以下步骤操作: 1. 创建一个 deployment,指定 pod 的副本数为 2,并使用 nodeSelector 将这两个 pod 分别调度到 k8s-node1 和 k8s-node2 节点上。可以使用以下 YAML 文件创建 deployment: ``` apiVersion: apps/v1 kind: Deployment metadata: name: apache-pod spec: replicas: 2 selector: matchLabels: app: apache-pod template: metadata: labels: app: apache-pod spec: nodeSelector: kubernetes.io/hostname: k8s-node1 containers: - name: apache-container image: httpd:latest ports: - containerPort: 80 ``` 在这个 YAML 文件中,我们使用 nodeSelector 将第一个 pod 调度到 k8s-node1 节点上,第二个 pod 调度到 k8s-node2 节点上。注意,我们在 template.spec.containers 中指定了容器的镜像和端口号,这里使用的是 httpd 镜像,端口号是 80。 2. 使用 kubectl apply 命令应用这个 YAML 文件: ``` kubectl apply -f deployment.yaml ``` 3. 使用 kubectl get pods 命令检查 pod 状态,确认这两个 pod 都在运行: ``` kubectl get pods -o wide ``` 在输出中,你会看到两个 apache-pod 的副本都在运行,其中一个在 k8s-node1 节点上,另一个在 k8s-node2 节点上。 需要注意的是,使用 nodeSelector 指定 pod 调度到特定节点上可能会降低集群的灵活性,因为这样做会使节点的资源分配不均衡。如果你的集群中有多个节点,最好使用 Kubernetes 的调度器来自动地将 pod 调度到空闲节点上。你可以使用 nodeAffinity 和 podAntiAffinity 等特性来控制 pod 的调度行为。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值