笔记Kubernetes核心技术-之Controller
2、Controller
2.1、概述
在集群上管理和运行容器的对象,控制器(也称为:工作负载),Controller实际存在的,Pod是抽象的;
2.2、Pod和Controller关系
- Pod是通过Controller实现应用运维,比如:弹性伸缩、滚动升级等等;
- Pod和Controller之间通过
labe和selectorl标签建立关系,通过labels名称找到selector;


2.3、常用控制器(deployment)
2.3.1、应用场景
- 部署无状态应用(例如:nginx);
- 管理Pod和ReplicaSet;
- 部署,滚动升级等功能;
- 应用场景:web服务,微服务;
2.3.2、通过yaml文件部署应用
- 使用yaml文件部署应用
#创建并导出yaml文件kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > nginx.yaml#通过yaml文件部署应用kubectl apply -f nginx.yaml #查看状态kubectl get pod

- 对外发布(暴露端口号)
#暴露端口号(target-port=80)
kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name nginx -o yaml > nginx1.yaml
#通过yaml文件暴露端口
kubectl apply -f nginx1.yaml

2.4、应用升级回滚和弹性伸缩
2.4.1、应用升级
升级过程中保证服务不中断,会一个Pod一个Pod逐步替换,升级实质image版本升级;
(1)先指定应用版本部署,这里指定nginx版本为1.14

#创建指定版本应用
kubectl apply -f nginx1.yaml

在Node节点查看镜像,会看到下载的1.14版本;

(2)应用升级,此处nginx版本为1.15
#nginx:第一个表示名称,nginx第二个表示镜像
kubectl set image deployment nginx nginx=nginx:1.15

在Node节点查看镜像,会看到下载的1.15版本;

(3)查看升级状态
kubectl rollout status deployment nginx

2.4.2、应用版本回滚
(1)查看历史版本
kubectl rollout history deployment nginx

(2)回滚操作
- 回滚到上一个版本
#回滚到上一个版本
kubectl rollout undo deployment nginx
#查看回滚后状态
kubectl rollout status deployment nginx


- 回滚到指定版本
#回滚到指定版本
kubectl rollout undo deployment nginx --to-revision=2

2.4.3、应用弹性伸缩
#弹性伸缩命令
kubectl scale deployment nginx --replicas=5

2.5、部署有状态应用(StatefulSet)
2.5.1、无状态和有状态
(1)无状态
- 认为Pod都是一样;
- 无顺序要求;
- 不用考虑在任意node运行;
- 可随意伸缩和控制;
(2)有状态 - 上面的因素都需要考虑到;
- 每个Pod都是独立的,保持Pod启动顺序和唯一性;
- 唯一的网络标识符,持久存储;
- 有序,比如:mysql主从;
2.5.2、部署有状态应用
(1)SatefulSet部署有状态应用
无头service,指ClusterIP:none。
- 无头的service
cat < sts.yaml << EOF
apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: nginxname: nginx
spec:ports:- port: 80name: webselector:app: nginxclusterIP: None---apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx-statefulsetnamespace: default
spec:serviceName: nginxreplicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:latestname: nginxports:- containerPort: 80EOF

- 查看pod: 有三个pod,每个名称(NAME)都不一样

- 查看创建无头Service:CLUSTER-IP=None
#查看服务
kubectl get svc
#删除statefulset
kubectl delete statefulset --all

(2)deployment和statefulset区别:
- statefulset特点
有唯一标识:根据主机名 + 按照一定规则生成域名;
每个pod有唯一主机名,唯一域名,格式:主机名称.service名称.名称空间.svc.cluster.local
nginx-statefulset-0.nginx.default.svc.cluster.local
2.6、部署守护进程(DaemonSet)
让每个node上运行同一个pod,新加入的node也同样运行在一个pod里面;
例如:在每个node节点安装数据采集工具(适用场景:每台虚拟机(Node) 进行日志采集);
- 创建daemonset文件
cat < daemon.yaml << EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:name: ds-testlabels:app: filebeatnamespace: default
spec:selector:matchLabels:app: filebeattemplate:metadata:labels:app: filebeatspec:containers:- name: logsimage: nginxports:- containerPort: 80volumeMounts:- name: varlogmountPath: /tmp/logvolumes:- name: varloghostPath:path: /var/logEOF

- 创建守护进程pod
#执行daemon.yaml文件
kubectl apply -f deamon.yaml
kubectl get pods


- 进入容器查看日志
kubectl get pods
#进入容器
kubectl exec -it ds-test-bg657 bash
#查看日志
ls /tmp/log
#退出
exit

2.6、一次性任务和定时任务
2.6.1、Job(一次性任务)
- 创建job.yaml文件
#创建job文件,计算PI的值
cat < job.yaml <<EOF
apiVersion: batch/v1
kind: Job
metadata:name: pi-calculatenamespace: default
spec:template:spec:containers:- name: piimage: perlcommand: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: NeverbackoffLimit: 4EOF

- 创建job
#创建job,应用yaml文件
$kubectl apply -f job.yaml
#Node: 【Completed】表示一次性任务完成
$kubectl get pods -o wide
#查看一次性job
$kubectl get jobs
#查看日志: 格式: kubectl logs pod名称
$kubectl logs pi-calculate-dgxtr
#删除job
$kubectl delete -f job.yaml

2.6.2、CornJob(定时任务)
- 创建cronjob.yaml文件
cat < cronjob.yaml << EOF
apiVersion: batch/v1beta1
kind: CronJob
metadata:name: hello-worldnamespace: default
spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:- name: hello-worldimage: busyboxargs:- /bin/sh- -c- date; echo Hello from the kubernetesrestartPolicy: OnFailureEOF

- 创建cronjob
#创建cronjob,应用yaml文件
$kubectl apply -f cronjob.yaml
#Node: 【Completed】表示一次性任务完成,此处会定时输出
$kubectl get pods -o wide
#查看一次性job
$kubectl get cronjobs
#查看日志: 格式: kubectl logs pod名称
$kubectl logs hello-world-1624xxx
#删除job
$kubectl delete -f cronjob.yaml

4、配置管理
4.1、Secret
作用:存储加密数据到etcd,让Pod容器以变量或者挂载Volume方式进行访问数据,适用场景:凭证(认证)。
(1)创建secret加密数据
- base64 编码用户名或密码
#编码base64
echo -n 'admin' | base64
- 创建加密数据文件
cat < secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4= password: MWYyZDF1MmU2N2Rm EOF

- 生成加密数据
$kubectl create -f secret.yaml
#获取加密数据,注此处加密名称为:mysecret
$kubectl get secret
#辅助命令:kubectl delete secret --all (删除secret)

(2)以变量方式挂载到Pod容器中
- 创建带有加密的pod yaml文件
环境变量名称分别为:SECRET_USERNAME,SECRET_PASSWORD
加密名称(name):mysecret,和(1)中mysecret要相同;
cat < secret-val.yaml << EOF
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: nginximage: nginxenv: - name: SECRET_USERNAMEvalueFrom: secretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: password
EOF

- 创建pod并访问加密数据
$kubectl apply -f secret-val.yaml
$kubectl get pods
#进入pod
$kubectl exec -it mypod bash
#查看环境变量
echo $SECRET_USERNAME
echo $SECRET_PASSWORD

(3)以Volume方式挂载到Pod容器中
- 创建带有加密的pod yaml文件
加密名称(secretName):mysecret,和(1)中mysecret要相同;
挂载目录(mountPath):容器/etc/foo目录;
cat < secret-vol.yaml << EOF
apiVersion: v1
kind: Pod
metadata:name: myfoo
spec:containers:- name: nginximage: nginxvolumeMounts:- name: foomountPath: "/etc/foo"volumes:- name: foosecret:secretName: mysecret
EOF

- 创建pod并访问加密数据
$kubectl apply -f secret-vol.yaml
$kubectl get pods
#进入pod
$kubectl exec -it myfoo bash
#进入目录
ls /etc/foo
cd /etc/foo
#查看文件
cat password
cat username

4.2、ConfigMap
作用:存储不加密数据到etcd,让Pod容器以变量或者挂载Volume方式进行访问数据,适用场景:配置文件(IP、端口号、不加密的用户名和密码)。
4.2.1、挂载Volume方式访问
(1)创建配置文件
cat < redis.properties << EOF
redis.host=127.0.0.1
redis.port=6379
redis.password=123456EOF
(2)创建configmap(名称:redis-config)
#从配置文件创建configmap
$kubectl create configmap redis-config --from-file=redis.properties
#获取cm(configmap)
$kubectl get cm
#查看cm(configmap)
$kubectl describe cm redis-config
#辅助命令:kubectl delete cm --all 删除所有cm

(4)以Volume方式挂载到Pod容器
- 创建cmpod yaml文件
mountPath:将上面redis.properties文件挂载到/etc/config目录;
command:输入redis.properties信息;
name:名称redis-config;
cat < cm.yaml << EOF
apiVersion: v1
kind: Pod
metadata:name: cmpod
spec:containers:- name: busyboximage: busyboxcommand: ["/bin/sh", "-c", "cat /etc/config/redis.properties"]volumeMounts:- name: config-volumemountPath: "/etc/config"volumes:- name: config-volumeconfigMap:name: redis-configrestartPolicy: NeverEOF

- 创建pod以volume挂载并输出配置
$kubectl apply -f cm.yaml
$kubectl get pods
#查看日志,Completed状态,只能以查看日志方式,不能进入容器
$kubectl logs cmpod

4.2.2、变量方式访问
(1)以变量方式挂载到Pod容器
- 创建cm yaml文件
变量名称为:special.level,special.type
kind:类型为ConfigMap
name:名称为cmconfig
cat < cmconfig.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:name: cmconfignamespace: default
data:special.level: infospecial.type: helloEOF

- 生成cm(configMap)

- 创建pod以变量挂载并输出配置
name:名称为上面cmconfig
key:为上面定义变量special.level、special.info
cat < cmconfig-var.yaml << EOF
apiVersion: v1
kind: Pod
metadata:name: cmvarpod
spec:containers:- name: busyboximage: busyboxcommand: ["/bin/sh", "-c", "echo $(LEVEL) $(TYPE)"]env:- name: LEVELvalueFrom:configMapKeyRef:name: cmconfigkey: special.level- name: TYPEvalueFrom:configMapKeyRef:name: cmconfigkey: special.typerestartPolicy: Never
EOF

输出变量special.level和special.type值

5、集群安全机制
5.1、概述
(1)访问K8s集群资源的时候,需要经过三个步骤完成具体操作;
- 认证
传输安全:对外不暴露8080端口,只能内部访问,对外使用端口6443;
认证方式(客户端身份认证常用方式):https证书认证,基于ca证书;
http token认证,通过token识别用户;
http基本认证,用户名+密码认证,使用较少; - 鉴权(授权)
基于RBAC进行鉴权操作(基于角色访问控制); - 准入控制
就是准入控制器的列表,如果列表中找到请求内容则通过,没有拒绝;

(2)访问集群时候,都需要经过apiserver,apiserver做统一协调,类似门卫职责,在访问过程中需要证书、token、或者用户名+密码,进行相关操作和授权,如果访问Pod还需要serviceAccount。
5.2、RBAC
基于角色的访问控制;
(1)角色
- role:针对特定的命名空间访问权限
- ClusterRole:针对所有命名空间访问权限
(2)角色绑定
- roleBinding:角色绑定到主体;
- ClusterRoleBinding:集群角色绑定到主体;
(3)主体
- user:用户
- group:用户组;
- serviceaccount:服务账号(一般用于pod访问);

5.3、RBAC实现鉴权
5.3.1、创建命名空间
#查看命名空间
$kubectl get ns
#创建命名空间,名称为roledemo
$kubectl create ns roledemo

(2)在新创建的命名空间创建pod
#在namespace(roledemo)下创建pod
$kubectl run nginx --image=nginx -n roledemo
#查看指定命名空间下pod
$kubectl get pods -n roledemo

(3)创建角色
cat < rbac-role.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: pod-readernamespace: roledemo
rules:
- apiGroups: [""] # "" indicates the core API groupresources: ["pods"]verbs: ["get", "watch", "list"]EOF

#在命名空间中创建角色
$kubectl apply -f rbac-role.yaml
#查看命名空间下角色
$kubectl get role -n roledemo
#辅助命令:kubectl get role 查看所有命名空间角色

(4)创建角色绑定
cat < rbac-rolebinding.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-podsnamespace: roledemo
subjects:
- kind: Username: ["pods"]verbs: ["get", "watch", "list"]EOF
相关文章:
笔记Kubernetes核心技术-之Controller
2、Controller 2.1、概述 在集群上管理和运行容器的对象,控制器(也称为:工作负载),Controller实际存在的,Pod是抽象的; 2.2、Pod和Controller关系 Pod是通过Controller实现应用运维,比如:弹…...
Azure云工作站上做Machine Learning模型开发 - 全流程演示
目录 本文内容先决条件从“笔记本”开始设置用于原型制作的新环境(可选)创建笔记本开发训练脚本迭代检查结果 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕࿰…...
前端 : 用html ,css,js写一个你画我猜的游戏
1.HTML: <body><div id "content"><div id "box1">计时器</div><div id"box"><div id "top"><div id "box-top-left">第几题:</div><div id "box…...
Illustrator 2024(AI v28.0)
Illustrator 2024是一款功能强大的矢量图形编辑软件,由Adobe公司开发。它是设计师、艺术家和创意专业人士的首选工具,用于创建和编辑各种矢量图形、插图、图标、标志和艺术作品。 以下是Adobe Illustrator的主要功能和特点: 矢量图形编辑&…...
【Git企业开发】第二节.Git 的分支管理
作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Git企业级开发 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!࿰…...
第三章认识Node.js模块化开发
目录 认识Node.js 概述 作用 基本使用 Node.js的运行 Node.js的组成 Node.js的语法 Node.js全局对象 认识模块化开发 概述 场景 特点 模块成员的导入和导出 Node.js 模块化语法 导入模块 导出模块 ES6 模块化语法 导入模块 导出模块 项目 认识Node.js 概述…...
扩展Nginx的无限可能:掌握常见扩展模块和第三方插件的使用方法
Nginx是一款高性能的开源Web服务器和反向代理服务器。它具有模块化的架构,可以通过扩展模块和插件来增强其功能。在本文中,我将围绕Nginx的扩展模块和插件进行讲解,并提供一些常见的扩展模块和第三方插件的示例。 一、Nginx扩展模块 Nginx的…...
centos遇到的问题
lsof -i :8091 > 查看这个端口的线程 lsof : list open files 列出打开文件 -i : internet linux检测系统进程和服务: top : 实时监视系统的进程和资源的利用情况htop : top的增强版 问题: -bash: …...
本机spark 通idea连接Oracle的坑
1. 报错:Exception in thread "main" java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V 查询网上资料,是idea引入的scala运行环境版本与idea默认的scala版本不一样 也就是写的项目中的pom的spark版本与idea默认的版本不…...
网络协议--DNS:域名系统
14.1 引言 域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息。每个站点(如大学中的系、校园、…...
计算机视觉注意力机制小盘一波 (学习笔记)
将注意力的阶段大改分成了4个阶段 1.将深度神经网络与注意力机制相结合,代表性方法为RAM ⒉.明确预测判别性输入特征,代表性方法为STN 3.隐性且自适应地预测潜在的关键特征,代表方法为SENet 4.自注意力机制 通道注意力 在深度神经网络中…...
LVS+keepalive高可用集群
keepalive简介 keepalive为LVS应用延伸的高可用服务。lvs的调度器无法做高可用。但keepalive不是为lvs专门集群服务的,也可以为其他的的代理服务器做高可用。 keepalive在lvs的高可用集群,主调度器和备调度器(可以有多个) 一主两备或一主一备。 VRRP: k…...
Thread 和 Runnable 的区别
Thread 和 Runnable 接口的区别有四个: Thread 是一个类,Runnable 是接口,因为在 Java 语言里面的继承特性,接口可以支持多继承,而类只能单一继承。所以如果在已经存在继承关系的类里面要实现线程的话,只能…...
图神经网络和分子表征:5. Completeness
大家都知道 “两点确定一线,三点确定一平面”,那么多少个变量可以确定一个分子呢?这是最近顶刊们热烈讨论的话题。 (据笔者不完全统计)最早在 SphereNet (2022 ICLR)论文里,摘要上就…...
css-渐变色矩形
效果图: 代码: html: <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"initial-scale1.0, user-scalableno" /><title></title><link …...
使用easypoi-spring-boot-starter 4.1.1导入excel报错NoSuchMethodError和NoSuchMethodError
前言 使用easypoi进行excel的导入遇到的错误以及解决办法 easypoi项目地址:https://gitee.com/lemur/easypoi easypoi的Maven依赖: <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter<…...
matlab中类的分别之handle类和value类——matlab无法修改类属性值的可能原因
写在之前(吐槽) 最近由于变化了一些工作方向,开始需要使用matlab进行开发,哎哟喂,matlab使用的我想吐,那个matlab编辑器又没代码提示,又没彩色,我只好用vscode进行代码编辑…...
3. t2t_vit inference
前言 对vit 进行fp16推理 参考链接: https://github.com/open-mmlab/mmpretrain/tree/master/configs/t2t_vit run code : https://mmclassification.readthedocs.io/en/latest/getting_started.html#inference-and-test-a-dataset https://mmclassification.readthedo…...
SpringMVC Day 05 : Spring 中的 Model
前言 欢迎来到 SpringMVC 系列教程的第五天!在之前的教程中,我们已经学习了如何使用控制器处理请求和返回视图。今天,我们将深入探讨 Spring 中的 Model。 在 Web 应用程序开发中,数据的传递和展示是非常重要的。SpringMVC 提供…...
redis6.0源码分析:字典扩容与渐进式rehash
文章目录 字典数据结构结构设计dictType字典类型为什么字典有两个哈希表?哈希算法 扩容机制扩容前置知识字典存在几种状态?容量相关的关键字段定义字典的容量都是2的幂次方 扩容机制字典什么时候会扩容?扩容的阈值 & 扩容的倍数哪些方法会…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
