笔记Kubernetes核心技术-之Controller

news2024/11/26 4:41:55

2、Controller

2.1、概述

在集群上管理和运行容器的对象,控制器(也称为:工作负载),Controller实际存在的,Pod是抽象的;

2.2、Pod和Controller关系

  • Pod是通过Controller实现应用运维,比如:弹性伸缩、滚动升级等等;
  • Pod和Controller之间通过labeselectorl标签建立关系,通过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: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    name: web
  selector:
    app: nginx
  clusterIP: None

---

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

EOF

在这里插入图片描述

  • 查看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-test
  labels:
    app: filebeat
  namespace: default
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
      - name: logs
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: varlog
          mountPath: /tmp/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

EOF

在这里插入图片描述

  • 创建守护进程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-calculate
  namespace: default
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
  
EOF

在这里插入图片描述

  • 创建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-world
  namespace: default
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello-world
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the kubernetes
          restartPolicy: OnFailure

EOF

在这里插入图片描述

  • 创建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: nginx
    image: nginx
    env: 
      - name: SECRET_USERNAME
        valueFrom: 
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: 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: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
  volumes:
  - name: foo
    secret:
      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=123456

EOF

(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: busybox
    image: busybox
    command: ["/bin/sh", "-c", "cat /etc/config/redis.properties"]
    volumeMounts:
    - name: config-volume
      mountPath: "/etc/config"
  volumes:
  - name: config-volume
    configMap:
      name: redis-config
  restartPolicy: Never
  
EOF

在这里插入图片描述

  • 创建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: cmconfig
  namespace: default
data:
  special.level: info
  special.type: hello

EOF

在这里插入图片描述

  • 生成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: busybox
    image: busybox
    command: ["/bin/sh", "-c", "echo $(LEVEL) $(TYPE)"]
    env:
      - name: LEVEL
        valueFrom:
          configMapKeyRef:
            name: cmconfig
            key: special.level
      - name: TYPE
        valueFrom:
          configMapKeyRef:
            name: cmconfig
            key: special.type
  restartPolicy: 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-reader
  namespace: roledemo
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["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-pods
  namespace: roledemo
subjects:
- kind: User
  name: ["pods"]
  verbs: ["get", "watch", "list"]

EOF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前馈神经网络处理二分类任务

此文建议看完基础篇再来&#xff0c;废话不多说&#xff0c;进入正题 目录 1.神经元 1.1 活性值 1.2 激活函数 1.2.1 Sigmoid函数 1.2.2 Relu函数 2.基于前馈神经网络的二分类任务 2.1 数据集的构建 2.2 模型的构建 2.2.1 线性层算子 2.2.2 Logistic算子 2.2.3 层的串行组合…

FL Studio 21.2.0.3842中文破解版发布啦,支持 Cloud 在线采样库和 AI 音乐制作功能

好消息&#xff01;FL Studio 21.2 在 10 月 26 日正式发布啦&#xff0c;它新增了 FL Cloud 在线采样库和 AI 音乐制作功能&#xff0c;还提供音乐分发到 Spotify、Apple Music 等主要音乐平台的服务。此外&#xff0c;还有新的音频分离功能、自定义波形颜色和新的合成器 Kepl…

改进YOLOv3!IA-YOLO:恶劣天气下的目标检测

恶劣天气条件下从低质量图像中定位目标还是极具挑战性的任务。现有的方法要么难以平衡图像增强和目标检测任务&#xff0c;要么往往忽略有利于检测的潜在信息。本文提出了一种新的图像自适应YOLO (IA-YOLO)框架&#xff0c;可以对每张图像进行自适应增强&#xff0c;以提高检测…

Windows一键添加命名后缀(文件)

温馨提示&#xff1a;使用前建议先进行测试和原文件备份&#xff0c;避免引起不必要的损失。 &#xff08;一&#xff09;需求描述 之前老板让我给大量文件添加命名前缀&#xff0c;如今为了防患于未然&#xff0c;我决定把添加命名后缀的功能也实现一下&#xff0c;虽然这与添…

EASYX键盘交互

eg1:使用键盘的上下左右按钮控制小球的上下左右移动 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <conio.h> #define PI 3.14int main() {// 键盘交互initgraph(800, 600);setorigin(400, 300);set…

Linux网卡

网卡 网卡&#xff08;Network Interface Card&#xff0c;NIC&#xff09;是一种计算机硬件设备&#xff0c;也称为网络适配器或网络接口控制器。一个网卡就是一个接口 网卡组成和工作原理参考https://blog.csdn.net/tao546377318/article/details/51602298 每个网卡都拥有唯…

Mac删除照片快捷键ctrl加什么 Mac电脑如何批量删除照片

Mac电脑是很多人喜欢使用的电脑&#xff0c;它有着优美的设计、高效的性能和丰富的功能。如果你的Mac电脑上存储了很多不需要的照片&#xff0c;那么你可能会想要删除它们&#xff0c;以节省空间和提高速度。那么&#xff0c;Mac删除照片快捷键ctrl加什么呢&#xff1f;Mac电脑…

双目视觉计算三维坐标

一、原理 双目视觉的基本原理&#xff0c;以及公式推导&#xff0c;我参考的b站上的视频&#xff0c;链接如下&#xff1a; 2-线性相机模型-Linear Camera Model-Camera Calibration_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q34y1n7ot/?p2&spm_id_from333.…

链表加法与节点交换:数据结构的基础技能

目录 两两交换链表中的节点单链表加一链表加法使用栈实现使用链表反转实现 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点…

13年测试老鸟,性能压测-死锁定位分析/内存溢出实例(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 死锁问题定位与分…

0029Java程序设计-家政服务平台管理系统

文章目录 摘要目录系统设计开发环境 摘要 本文首先研究并介绍国内外目前的背景和现状&#xff0c;在此基础上给出论文的主要研究内容&#xff0c;其次&#xff0c;对家政服务平台管理系统的需求进行了分析。再次&#xff0c;对家政服务平台管理系统进行了总体设计&#xff0c;…

虚拟机安装详细步骤(简单版)

虚拟机作为工作以及学习的工具&#xff0c;是很多人必不可少的一款软件&#xff0c;今天就给大家讲一讲如何将虚拟机成功安装上系统&#xff0c;其中呢也将部分问题在文章中表达&#xff0c;因为很多人表示出现了一些问题&#xff0c;却没有办法解决&#xff0c;所以写了这一篇…

0032Java程序设计-基于JavaEE的智能化酒店点餐收款系统的设计与实现论文

文章目录 摘 要目录系统设计开发环境 摘 要 酒店点餐收款系统是为了实现酒店餐饮自动化管理而设计的&#xff0c;它完全取代了原来酒店餐饮管理一直使用的人工处理的工作方式&#xff0c;并且避免了由于管理人员的工作疏忽以及管理质量问题所造成的各种错误&#xff0c;为及时…

给定两个单链表,编写算法找出两个链表的公共结点

给定两个单链表&#xff0c;编写算法找出两个链表的公共结点 算法思路&#xff1a; 如果两个链表有公共结点&#xff0c;那从某个公共结点开始&#xff0c;就两路并一路了&#xff0c;类似下图 知道这个性质之后我们就可以解决问题了&#xff0c;先判断出两个链表哪个是长链…

【Jenkins】新建任务FAQ

问题1. 源码管理处填入Repository URL&#xff0c;报错&#xff1a;无法连接仓库&#xff1a;Error performing git command: ls-remote -h https://github.com/txy2023/GolangLearning.git HEAD 原因&#xff1a; jenkins全局工具配置里默认没有添加git的路径&#xff0c;如果…

Openssl数据安全传输平台017:客户端在Linux上的编译与调试记录

文章目录 1 在windows上先预编译2 Centos上进入项目文件夹进行编译2.1 找不到protobuf的google文件夹2.2 找不到动态库ljson2.3 动态库软链接失效2.4 undefined reference to Json::Value::asString[abi:cxx11]() const![在这里插入图片描述](https://img-blog.csdnimg.cn/5a8e…

快递单号批量查询教程,掌握包裹动态,让你成为物流达人!

亲爱的读者们&#xff0c;你是否曾经为了追踪快递包裹而烦恼&#xff1f;是否曾经为了查询多个快递单号而感到繁琐&#xff1f;现在&#xff0c;我们为你带来一个高效便捷的解决方案——快递单号批量查询教程&#xff01;让你轻松掌握包裹动态&#xff0c;成为物流达人&#xf…

【深入浅出】寄存器精讲第一期

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板、汇编语言 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️开篇1.1 &#x1f514;CPU 概述&#xff08;简单了解&#xff09…

两数和的目标 python (初学者vs程序员)

题目描述 1&#xff09;给定一个整数列表&#xff0c;在列表中&#xff0c;从前向后查找两个元素使其相加之和等于目标数&#xff0c;并返回两个整数在列表中的下标。如果没有符合条件的数字&#xff0c;输出False&#xff0c;本题假设题目的解唯一。‬‪‬‪‬‪‬‪‬‮‬‪…

07. 蜂鸣器

07. 蜂鸣器 硬件原理分析代码编写 硬件原理分析 此处为PNP型三极管&#xff0c;BEEP为低的时候三极管才会导通&#xff0c;也就是BEEP0时&#xff0c;蜂鸣器会叫。BEEP是通过SNVS_TAMPER1这个IO控制的 代码编写 将前面的bsp、imx6ul、obj和project拷贝过来 初始化SNVS_TAMPE…