【云原生之k8s】k8s控制器

2023-10-26


在这里插入图片描述

引言

控制器:又称之为工作负载,分别包含以下类型控制器

  1. Deployment(无状态)
  2. StatefulSet(有状态)
  3. DaemonSet(只要)
  4. Job
  5. CronJob

Pod与控制器之间的关系

  1. controllers:在集群上管理和运行容器的对象通过label-selector相关联
  2. Pod通过控制器实现应用的运维,如伸缩,升级等
    在这里插入图片描述

1、Deployment(无状态)

  1. 部署无状态应用
  2. 管理Pod和ReplicaSet
  3. 具有上线部署、副本设定、滚动升级、回滚等功能
  4. 提供声明式更新,例如只更新一个新的Image
  5. 应用场景:web服务
[root@master ~]# vim nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

在这里插入图片描述

kubectl create -f nginx-deployment.yaml
kubectl get pods,deploy,rs

在这里插入图片描述

查看控制器

kubectl edit deployment/nginx-deployment

在这里插入图片描述

查看历史版本

kubectl rollout history deployment/nginx-deployment

在这里插入图片描述

2、SatefulSet(有状态)

  1. 部署有状态应用
  2. 解决Pod独立生命周期,保持Pod启动顺序和唯一性
  3. 稳定,唯一的网络标识符,持久存储(例如:etcd配置文件,节点地址发生变化,将无法使用)
  4. 有序,优雅的部署和扩展、删除和终止(例如:mysql主从关系,先启动主,再启动从)
  5. 有序,滚动更新
  6. 应用场景:数据库

2.1 有状态与无状态的区别

无状态

  1. deployment认为所有的pod都是一样的
  2. 不用考虑顺序的要求
  3. 不用考虑在哪个node节点上运行
  4. 可以随意扩容和缩容

有状态

  1. 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
  2. 实例之间不对等的关系,以及依靠外部存储的应用

2.2 常规service和无头服务区别

  1. service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
  2. Headless service :无头服务,不需要cluster-IP,直接绑定具体的Pod的IP
2.2.1 Service类型
  1. Cluster_IP
  2. NodePort:使用Pod所在节点的IP和其端口范围
  3. Headless
  4. HostPort(ingress、kubesphere)
  5. LoadBalance负载均衡(F5硬件负载均衡器)

ps:k8s暴露方式主要就3种:ingress loadbalance(SLB/ALB K8S集群外的负载均衡器、Ng、harproxy、KONG、traefik等等) service

vim nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
[root@master ~]# kubectl create -f nginx-service.yaml 
service/nginx-svc created
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        5d7h
nginx-svc    NodePort    10.105.83.81   <none>        80:30676/TCP   2s

在这里插入图片描述
在node节点操作,查看集群间通讯
在这里插入图片描述

2.2.2 headless方式

因为Pod动态IP地址,所以常用于绑定DNS访问—来尽可能固定Pod的位置

[root@master demo]# vim headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

在这里插入图片描述

kubectl apply -f headless.yaml
kubectl get svc

在这里插入图片描述
再定义一个pod

[root@master demo]# vim dns-test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    args:
    - /bin/sh
    - -c
    - sleep 36000
  restartPolicy: Never

在这里插入图片描述

验证dns解析

kubectl create -f dns-test.yaml
kubectl get svc

在这里插入图片描述
解析kubernetes和nginx-svc名称

kubectl exec -it dns-test sh

在这里插入图片描述
创建StatefulSet.yaml文件

vim statefulSet.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta1  
kind: StatefulSet  
metadata:
  name: nginx-statefulset  
  namespace: default
spec:
  serviceName: nginx  
  replicas: 3  
  selector:
    matchLabels:  
       app: nginx
  template:  
    metadata:
      labels:
        app: nginx  
    spec:
      containers:
      - name: nginx
        image: nginx:latest  
        ports:
        - containerPort: 80 

清理所有pod

kubectl delete -f .

在这里插入图片描述

kubectl create -f statefulSet.yaml
kubectl get pods,svc

在这里插入图片描述
解析pod的唯一域名和自身的ip

kubectl apply -f dns-test.yaml

kubectl exec -it dns-test sh

nslookup nginx-statefulset-0.nginx
nslookup nginx-statefulset-1.nginx
nslookup nginx-statefulset-2.nginx

在这里插入图片描述
总结
StatefulSet与Deployment区别:有身份的!
身份三要素:

  1. 域名 nginx-statefulset-0.nginx
  2. 主机名 nginx-statefulset-0
  3. 存储(PVC)

3、DaemonSet(守护进程集)

  1. 在每一个Node上运行一个Pod
  2. 新加入的Node也同样会自动运行一个Pod
  3. 应用场景:Agent
[root@master demo]# vim daemonSet.yaml

apiVersion: apps/v1
kind: DaemonSet 
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

在这里插入图片描述
DaemonSet会在每个node节点都创建一个Pod

kubectl apply -f daemonSet.yaml
kubectl get pods

在这里插入图片描述

4、Job

  1. Job分为普通任务(Job)和定时任务(CronJob)
  2. 一次性执行
  3. 应用场景:离线数据处理,视频解码等业务

示例
重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。

[root@master demo]# vim job.yaml 

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

在这里插入图片描述

在node1节点下载perl镜像,因为镜像比较大所以提前下载好

docker pull perl

在这里插入图片描述
在这里插入图片描述

创建
在这里插入图片描述
查看到完成状态
在这里插入图片描述

结果输出到控制台
在这里插入图片描述
清除job资源

kubectl get job
kubectl delete -f job.yaml

在这里插入图片描述

5、CronJob

  1. 周期性任务,像Linux的Crontab一样。
  2. 周期性任务
  3. 应用场景:通知,备份

示例

[root@master demo]# vim cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: lcdb
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: lcdb
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo lcdb from the Kubernetes cluster
          restartPolicy: OnFailure

在这里插入图片描述

kubectl apply -f cronjob.yaml

在这里插入图片描述

kubectl get pod
kubectl get cronjob

在这里插入图片描述
清除cronjob资源

kubectl delete -f cronjob.yaml

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【云原生之k8s】k8s控制器 的相关文章

  • Kubernetes - 容器启动后执行就绪探针

    有没有办法在容器成功启动后阻止执行就绪探针 我认为活性探针应该足以监控容器的健康状况 就绪探针和活性探针的用途略有不同 就绪探针控制 Pod IP 是否包含在服务的端点列表中 以及通过外部 URL 公开时是否作为路由的目标 liveness
  • 无法在 Istio 代理后面的 k8s 中建立与 VerneMQ 集群的 mqtt 连接

    我正在设置 k8s 本地 k8s 集群 对于测试 我在使用 kubeadm 设置的虚拟机上使用单节点集群 我的要求包括在 k8s 中运行 MQTT 集群 vernemq 并通过 Ingress istio 进行外部访问 无需部署 ingre
  • Kubernetes 应用服务但端点没有

    当我尝试将服务应用于 pod 时 端点始终为 none 有人可以知道任何根本原因吗 我还检查选择器是否与deployment yaml 中定义的内容匹配 下面是我使用的部署 服务文件 我还附上了服务描述 部署 yaml apiVersion
  • 如何忽略多容器 Pod 中容器的故障?

    我有一个多容器应用程序 app sidecar 两个容器都应该一直处于活动状态 但 sidecar 并不是那么重要 Sidecar 依赖于外部资源 如果该资源不可用 Sidecar 就会崩溃 它会导致整个吊舱瘫痪 Kubernetes 尝试
  • Pod 副本如何相互同步 - Kubernetes?

    我有一个带有 3 个副本的 MySQL 数据库 Pod 现在我正在一个 Pod 中进行一些更改 Pod 数据 而不是 Pod 配置 假设我要添加一张表 该更改将如何影响 Pod 的其他副本 我正在使用带有 3 个工作节点的 kubernet
  • kubernetes POD IP什么时候会改变?

    我正在尝试将一个整体应用程序移植到 k8s pod 理论上 Pod 被认为是短暂的 建议使用服务概念来提供静态 IP 但到目前为止 在我的测试中 我还没有看到 POD IP 被更改 那么现在的问题是 k8s 什么时候会为我的 POD 分配一
  • 如何从 kubernetes 集群内部访问主机的 localhost

    在此应用程序中 nodejs pod 在 kubernetes 内部运行 而 mongodb 本身作为 localhost 位于主机外部 这确实不是一个好的设计 但它只适用于开发环境 在生产中 将有一个单独的 mongodb 服务器 因为这
  • 一个持久卷是否可以被多个持久卷声明消耗?

    假设一个 PV 可以被多个 PVC 消耗并且每个 pod 实例需要一个 PVC 绑定 这样的假设是否正确 我这么问是因为我创建了一个 PV 然后创建了一个具有不同尺寸要求的 PVC 例如 kind PersistentVolume apiV
  • 在 Kubernetes 中向 MySQL 添加另一个用户

    这是我的MySQL apiVersion apps v1beta1 kind Deployment metadata name abc def my mysql namespace abc sk test labels project ab
  • 将代码/文件直接注入 Google Cloud Engine 上的 Kubernetes 容器中

    如何将代码 文件直接注入 Google Cloud Engine 上的 Kubernetes 容器中 类似于使用 Docker 挂载主机文件 目录的方式 例如 docker run d name nginx p 443 443 v ngin
  • Jenkinsfile 泊坞窗

    我正在 docker 容器内的 GCE 上运行一个 jenkins 实例 并希望从此 Jenkinsfile 和 Github 执行多分支管道 我正在使用GCE詹金斯 https cloud google com solutions con
  • 如何在 microk8s 中使用本地 docker 镜像?

    我一直在使用 minikube 在本地测试 Kubernetes 在 minikube 中 我们可以使用本地 docker 镜像eval minikube docker env 命令 我开始探索microk8s 在我运行 Ubuntu 18
  • Kubernetes 1.8 支持的 Docker 版本

    我要将我的 Kubernetes 集群升级到该版本1 8 7 有谁知道哪个 docker 版本与其最兼容 这是我在 Kubernetes 官方页面上找到的 但我想它可能是针对最新的 k8s 版本的 1 9 在每台计算机上安装 Docker
  • kubernetes 集群中 django 应用程序的 Nginx 配置

    我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难 Nginx 和 app 是同一集群中的两个独立容器 据我了解 容器可以通过 127 0 0 1 XX 和主机名相互通信 我为此使用 min
  • Kubernetes Pod 中现在几点了?

    假设我有一些 NET Core 代码在 k8s pod 中运行 我要求 DateTime Now 我假设我将从运行 pod 的主机获取日期时间 有没有办法获得在 k8s 集群中一致的日期时间值 容器中的时钟与主机相同 因为它由内核控制 时区
  • Istio 允许所有出口流量

    如何允许 Istio 的所有出站流量 我尝试了以下方法 禁用出口网关并 使用 set global proxy includeIPRanges 0 0 0 0 0 0 0 0 0 0 绕过 sidecar 所有选项都不起作用 值得一提的是我
  • 在容器中运行多个相似的进程有意义吗?

    提供有关该问题的背景的简要背景 目前 我和我的团队正在将微服务迁移到 k8s 以减少维护多个部署工具和管道的工作量 我们计划迁移的微服务之一是 ETL Worker 它监听 SQS 上的消息并执行多阶段处理 它是使用 PHP Laravel
  • 除了 80 / 443 之外,我还可以为 Kubernetes 入口设置自定义端口来侦听吗?

    我并不是说能够路由到特定端口 我的意思是实际更改入口侦听的端口 这可能吗 如何 这是在哪里记录的 不 从Kubernetes 文档 https kubernetes io docs concepts services networking
  • 各种 Istio 端口是如何使用的?

    Question 我正在尝试学习 Istio 并且正在设置我的 Istio Ingress Gateway 当我设置它时 有以下端口选项 如此处所示 https istio io latest docs reference config i
  • Spring OAuth2 Keycloak Kubernetes 内部/外部访问

    我在 Kubernetes 集群内配置了 Keycloak 10 0 3 服务器 keycloak 服务器必须处理外部用户的身份验证 使用外部 url 并处理用于 Spring 微服务通信的 oauth2 令牌 然后Web应用程序Sprin

随机推荐

  • 使用matlab修改单张或多张图像大小

    使用matlab修改单张或多张图像大小 版权声明 本文为CSDN博主 berlinpand 的原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net berlin
  • 黑马程序员 《ios零基础教程》--全局和局部变量、结构体、枚举 2014-4-2总结

    a href http edu csdn net target self ASP Net Unity开发 a a href http edu csdn net target self Net培训 a 期待与您交流 前几天出差有事儿没学习 今
  • ChatGPT-4.5:AI技术的最新进展

    文章目录 创作者 全栈弄潮儿 个人主页 全栈弄潮儿的个人主页 个人社区 欢迎你的加入 全栈弄潮儿的个人社区 专栏地址 AI大模型 OpenAI最新发布的GPT 4 在聊天机器人的功能上取得了显著的改进 虽然GPT 4仍处于早期阶段 但有传言
  • 在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务

    1 前言 此前rtsp转webRTC的本地服务运行的不错 但是使用的某个免费stun服务突然被关停了 造成一些rtspToWebRTC的服务受到影响 因此 目前打算在我闲置的阿里云服务器上搭建stun turn服务 我的域名xiaoyaoy
  • openssl的RSA加密(base64编码)

    openssl的RSA加密 base64编码 同AES加密 开头先给出openssl实现base64编码代码 base64编码 解码 Function base64Encode Description base64 编码 Input 1 i
  • Python:pandas groupby实现类似excel中averageifs函数的功能

    从exccel切换到python进行数据处理 处理的主要还是excel的思路 希望实现类似excel中某个函数的功能 日常主要参考蓝鲸的 从excel到python 目前在做一些统计指标 excel中用了countifs sumifs和av
  • VBA学习基础之1.4条件语句

    VBA学习基础之条件语句 1 4 1 If Then 一个if语句由一个布尔表达式和一个或多个语句组成 如果条件被评估为True 则执行If条件块下的语句 如果条件被评估为False 则执行If循环块后面的语句 If boolean exp
  • Leetcode169.多数元素——摩尔投票

    文章目录 引入 摩尔投票 引入 Leetcode上有如下的题 169 多数元素 给定一个大小为 n 的数组 找到其中的多数元素 多数元素是指在数组中出现次数大于 n 2 的元素 你可以假设数组是非空的 并且给定的数组总是存在多数元素 示例
  • 批量提取PDF和图片发票信息 2.2

    人工录入发票信息真的好烦 有什么软件可以快速解决这个问题吗 那天看到这个问题后 自己写了一个批量提取发票信息的小软件 打开软件之后 选择大量发票文件所在的文件夹就可以了 会自动把发票识别的结果输出为一个Excel 文件 应较多使用者的提议
  • 面试小结

    百度内推一面 1 深浅拷贝 2 const char char const 3 对象的复制拷贝 注意的四个点 初级 高级程序员做法4 介绍项目 5 函数指针 指针函数 6 给定二叉树的前序和中序确定二叉树 前序和后续不能确定 7 SVM分类
  • yum安装dhcp安装包时报错的解决办法([Errno 256] No more mirrors to try.-----或者睡眠中)

    安装环境 CentOS 7 6 问题描述1 报错 无法安装 root localhost yum y install dhcp 已加载插件 fastestmirror langpacks Loading mirror speeds from
  • vue3(1)

    Vue3 0 了解vue3 0 1 简要了解 Vue js 3 0 one Piece 正式版再20年9月份发布 Vue3支持vue2的大多数特性 更好的支持TS 性能提升 打包大小减少41 初次渲染快55 重新渲染快133 内存减少54
  • VSCode: Conda activate base error - The term “conda“ is not recongised

    If you have your Anaconda installed and your VSCode can recognize it in interpreter selection like below then do not bot
  • mac os x 下五款播放器评测

    OS X上到底要用哪款播放器是永恒的主题 就我个人而言 1 4的Mac使用时间是在动漫中度过的 所以用过很多款视频播放器 比较多人用的播放器有QuickTime Movist MPlayerX VLC 射手影音 所以简单做个评测 评分带有主
  • 数据结构与算法:哈夫曼树与哈夫曼编码

    1 举例引入 我们先以成绩评级举例分析 一步一步的认识Haffman树和Haffman编码 分数 0 59 60 69 70 79 80 89 90 100 成绩 不及格 及格 中等 良好 优秀 所占比例 5 15 40 30 10 如果是
  • 安装系统键盘鼠标无法使用

    安装Windows原版系统 发现在BIOS中可以正常使用键盘鼠标 但是进入U盘 开始安装系统的时候键盘鼠标全部失灵 原因应该是U盘中的系统不能识别鼠标 这个大致是微软和Intel芯片之间兼容的问题 我也讲不清 直接上解决方案 我不是创造者
  • 【多人姿态估计】Alphapose_yolov8复现

    1 环境 参考此处安装docker nvidia docker https blog csdn net qq 35975447 article details 113248132 然后导入docker image https blog cs
  • 2021Java大厂面试经验分享,100%好评!

    Spring Security观后感 手绘思维脑 供参考 手绘的思维导图 是我自己根据自身的情况读完这套阿里出品的Spring Security王者晋级文档之后所绘的 相当于是一个知识的总结与梳理 我将其分为 核心组件 与 工作原理 认证流
  • 【从零开始学习C++

    目录 前言 委托构造函数 类内初始化 空指针 枚举类 总结 前言 C 的学习难度大 内容繁多 因此我们要及时掌握C 的各种特性 因此我们更新本篇文章 向大家介绍C 的新增特性 委托构造函数 委托构造函数是指一个类的构造函数调用另一个类的构造
  • 【云原生之k8s】k8s控制器

    文章目录 引言 Pod与控制器之间的关系 1 Deployment 无状态 2 SatefulSet 有状态 2 1 有状态与无状态的区别 2 2 常规service和无头服务区别 2 2 1 Service类型 2 2 2 headles