kubernetes第八天

1.RBAC

角色:Role:某个空间的角色,属于局部资源

           ClusterRole:整个集群的角色,属于集群资源

           查看角色:kubectl get clusterrole

规则

主题:User:用户自定义名称,一般是给人用的

           ServiceAccount:服务账号,一般是给程序用的

           Gro up:给一个组使用

K8S内置集群角色:
        cluster-admin:超级管理员,有集群所有权限。
        admin:主要用于授权命名空间所有读写权限。
        edit:允许对大多数对象读写操作,不允许查看或者修改角色,角色绑定。
        view: 允许对命名空间大多数对象只读权限,不允许查看角色,角色绑定和secret。

2.基于用户的权限管理

1.使用k8s ca签发客户端证书
 解压证书管理工具包:tar xf cfssl.tar.gz -C /usr/bin/  && chmod +x /usr/bin/cfssl*

编写证书请求:

cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}
EOFcat >lxc-csr.json <<EOF
{"CN": "lxc","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}]
}
EOF

生成证书:cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lxc-csr.json | cfssljson -bare lxc

2.生成kubeconfig授权文件

2.1kubeconfig文件的脚本

vim kubeconfig.sh

# 配置集群
# --certificate-authority
#   指定K8s的ca根证书文件路径
# --embed-certs
#   如果设置为true,表示将根证书文件的内容写入到配置文件中,
#   如果设置为false,则只是引用配置文件,将kubeconfig
# --server
#   指定APIServer的地址。
# --kubeconfig
#   指定kubeconfig的配置文件名称
kubectl config set-cluster lxc-linux \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.0.0.231:6443 \--kubeconfig=lxc-linux.kubeconfig# 设置客户端认证
kubectl config set-credentials lxc \--client-key=lxc-key.pem \--client-certificate=lxc.pem \--embed-certs=true \--kubeconfig=lxc-linux.kubeconfig# 设置默认上下文
kubectl config set-context linux \--cluster=lxc-linux \--user=lxc \--kubeconfig=lxc-linux.kubeconfig# 设置当前使用的上下文
kubectl config use-context linux --kubeconfig=lxc-linux.kubeconfig

2.2生成kubeconfig文件

bash kubeconfig.sh

3. 创建RBAC授权策略
    3.1 创建rbac等配置文件

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: linux-role-reader
rules:# API组,""表示核心组,该组包括但不限于"configmaps","nodes","pods","services"等资源.
- apiGroups: ["","apps/v1"]# 资源类型,不支持写简称,必须写全称哟!!# resources: ["pods","deployments"]  resources: ["pods","deployments","services"]# 对资源的操作方法.# verbs: ["get", "list"]  verbs: ["get", "list","delete"]
- apiGroups: ["","apps"]resources: ["configmaps","secrets","daemonsets"]verbs: ["get", "list"]
- apiGroups: [""]resources: ["secrets"]verbs: ["delete"]---kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: lxc-linux81-resources-readernamespace: default
subjects:# 主体类型
- kind: User# 用户名name: lxcapiGroup: rbac.authorization.k8s.io
roleRef:# 角色类型kind: Role# 绑定角色名称name: linux-role-readerapiGroup: rbac.authorization.k8s.io

3.2应用rbac授权

kubectl apply -f rbac.yaml 

3.3访问测试(需要将kubeconfig传到对应的节点上)

kubectl get po,cm,secret --kubeconfig=lxc-linux.kubeconfig

3.RBAC基于组的方式认证:

CN: 代表用户,O: 组。上一个案例生成的csr证书请求就是使用CN,下面生成的csr证书请求则使用O

1.使用k8s ca签发客户端证书

1.1 编写证书请求

cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}
EOFcat > lxcgroup-csr.json <<EOF                                                            {                                                                                    "CN": "lxcgroup","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "lxcgroup","OU": "System"}]
}
EOF

1.2生成证书(需要安装cfssl,上一个案例已经安装):cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lxcgroup-csr.json | cfssljson -bare lxcgroup-groups

2.生成kubeconfig授权文件

2.1 编写生成kubeconfig文件的脚本

vim kubeconfig.sh

#!/bin/bash# 设置集群配置
kubectl config set-cluster lxc-groups \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.0.0.231:6443 \--kubeconfig=lxcgroups-linux.kubeconfig# 设置客户端认证
kubectl config set-credentials lxcgroups \--client-key=lxcgroup-groups-key.pem \--client-certificate=lxcgroup-groups.pem \--embed-certs=true \--kubeconfig=lxcgroups-linux.kubeconfig# 设置默认上下文
kubectl config set-context lxcgroups \--cluster=lxc-groups \--user=lxcgroups \--kubeconfig=lxcgroups-linux.kubeconfig# 设置当前使用的上下文
kubectl config use-context lxcgroups \--kubeconfig=lxcgroups-linux.kubeconfig

生成kubeconfig文件:sh kubeconfig.sh

3.创建rbac授权策略

vim rbac.yaml


kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: linux-role-reader
rules:# API组,""表示核心组,该组包括但不限于"configmaps","nodes","pods","services"等资源.
- apiGroups: ["","apps"]# 资源类型,不支持写简称,必须写全称哟!!resources: ["pods","nodes","services","deployments","configmaps"]# 对资源的操作方法.verbs: ["get", "watch", "list"]---kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: lxc-groups-role-readernamespace: default
subjects:# 主体类型
- kind: Group# 用户名name: lxcgroupapiGroup: rbac.authorization.k8s.io
roleRef:# 角色类型kind: Role# 绑定角色名称name: linux-role-readerapiGroup: rbac.authorization.k8s.io

5.创建新用户加入lxcgroup组

5.1编写证书请求

5.1.1 vim ca-config.json

{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}

5.1.2 vim yunwei01-csr.json

{"CN": "yunwei01","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "lxcgroup","OU": "System"}]
}

5.2 生成证书

cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes yunwei01-csr.json | cfssljson -bare lxcgroup-yunwei01

5.3生成kubeconfig文件

vim kubeconfig.sh

kubectl config set-cluster lxc-group-yunwei001  \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.0.0.231:6443 \--kubeconfig=lxc-group-yunwei001.kubeconfig# 设置客户端认证
kubectl config set-credentials yunwei001 \--client-key=lxcgroup-yunwei01-key.pem \--client-certificate=lxcgroup-yunwei01.pem \--embed-certs=true \--kubeconfig=lxc-group-yunwei001.kubeconfig# 设置默认上下文
kubectl config set-context yunwei001 \--cluster=lxc-group-yunwei001 \--user=yunwei001 \--kubeconfig=lxc-group-yunwei001.kubeconfig# 设置当前使用的上下文
kubectl config use-context yunwei001 --kubeconfig=lxc-group-yunwei001.kubeconfig

bash kubeconfig.sh

5.4配置文件传送

scp lxc-group-yunwei001.kubeconfig  10.0.0.233:/tmp/

5.5验证权限

kubectl get po,cm,deploy --kubeconfig=/tmp/lxc-group-yunwei001.kubeconfig

4.RBAC安全框架之serviceAccount主体案例

响应式创建serviceAccount:kubectl create serviceaccount lxc

声明式创建serviceAccount:

vim 01-sa.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: lxc

授权容器中的Python程序对K8S API访问权限案例

授权容器中Python程序对K8S API访问权限步骤:
    - 创建ServiceAccount;

    - 创建Role;
    - 将ServiceAccount于Role绑定;
    - 为Pod指定自定义的SA;
    - 进入容器执行Python程序测试操作K8S API权限;

创建ServiceAccount:

vim 01-sa.yaml

apiVersion: v1
kind: ServiceAccount 
metadata:name: web-python

创建Role:

vim 02-Role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list"]

创建RoleBinding将ServiceAccount于Role绑定

vim 03-RoleBinding.yaml

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: sa-to-role
subjects:
- kind: ServiceAccountname: web-python
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io

创建pod,为Pod指定自定义的SA

vim 04-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: linux-web
spec:replicas: 1selector:matchExpressions:- key: appsoperator: Existstemplate:metadata:labels:apps: webspec:# 指定sa的名称,请确认该账号是有权限访问K8S集群的哟!serviceAccountName: web-pythoncontainers:- image: harbor.lxcedu.com/base-img/python:3.9.16name: webcommand: ["tail","-f","/etc/hosts"]

运行这四个资源:kubectl apply -f .

进入python的容器:kubectl exec linux-web-78d965b968-wh5sb -it -- sh

编写Python程序,执行以下Python代码即可

cat > k8s.py <<'EOF'
from kubernetes import client, configwith open('/var/run/secrets/kubernetes.io/serviceaccount/token') as f:token = f.read()# print(token)
configuration = client.Configuration()
configuration.host = "https://kubernetes"  # APISERVER地址
configuration.ssl_ca_cert="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"  # CA证书 
configuration.verify_ssl = True   # 启用证书验证
configuration.api_key = {"authorization": "Bearer " + token}  # 指定Token字符串
client.Configuration.set_default(configuration)
apps_api = client.AppsV1Api() 
core_api = client.CoreV1Api() 
try:print("###### Deployment列表 ######")#列出default命名空间所有deployment名称for dp in apps_api.list_namespaced_deployment("default").items:print(dp.metadata.name)
except:print("没有权限访问Deployment资源!")try:#列出default命名空间所有pod名称print("###### Pod列表 ######")for po in core_api.list_namespaced_pod("default").items:print(po.metadata.name)
except:print("没有权限访问Pod资源!")
EOF

安装Python程序依赖的软件包并测试:

1.安装:pip install kubernetes -i https://pypi.tuna.tsinghua.edu.cn/simple/

2.测试:python3 k8s.py

如图所示表示可以访问到k8s集群的pod资源

5.pv与pvc

PV是Kubernetes集群中的一块网络存储,它独立于Pod存在,可以被视为集群级别的资源,用于存储Pod产生的数据。

PV提供了稳定的存储资源给Pod使用,确保Pod即使在被重新调度或删除后,其数据也能保持不变。PV可以是各种存储系统,如云提供商的存储、NFS、iSCSI、本地存储等。

PVC是对PV的请求,它定义了Pod对存储的需求。

PVC声明了对持久卷的需求,而PV则提供了实际的存储资源。K8s会自动将PVC与合适的PV进行匹配和绑定,实现了Pod与存储资源的解耦,使得Pod可以独立于存储资源的变化而运行。

传统方式的缺陷:

在Kubernetes(K8s)中,如果不使用PersistentVolume(PV)和PersistentVolumeClaim(PVC)进行存储管理,那么容器的存储挂载通常需要在Pod的资源清单(如YAML文件)中硬编码指定。

集群依赖性:如果Pod的存储挂载依赖于特定的集群资源(如NFS服务器),那么当Pod被迁移到另一个没有该资源的集群时,它将无法访问其存储。

灵活性不足:硬编码的存储挂载方式使得Pod的存储配置缺乏灵活性。如果需要更改存储配置(如存储容量、访问模式等),则需要修改Pod的资源清单,并重新部署Pod。

管理复杂性:在多个集群或环境中管理硬编码的存储挂载配置会增加管理的复杂性。每个集群或环境可能需要不同的存储配置,这导致需要维护多个版本的Pod资源清单。

使用PV和PVC进行存储管理具有以下优势:

解耦与灵活性:PV和PVC的设计实现了Pod与存储资源的解耦。Pod可以通过PVC声明对存储的需求,而不需要关心具体的存储实现。这使得Pod可以独立于存储资源的变化而运行,提高了系统的灵活性和可移植性。

动态匹配与资源优化:PVC可以指定所需的存储容量、访问模式等参数,而不需要指定具体的PV。K8s会自动根据PVC的要求选择合适的PV进行绑定。这种动态匹配机制使得存储资源的分配更加灵活和高效。

简化存储管理:通过PV和PVC的使用,K8s提供了简化的存储管理机制。集群管理员可以集中管理PV资源,而用户则可以通过PVC来请求所需的存储资源。这种集中管理机制使得存储资源的管理更加简单和高效。

提高可移植性和兼容性:使用PV和PVC可以使得Pod在不同的K8s集群之间迁移时更加容易。只要目标集群提供了与PVC相匹配的PV资源,Pod就可以无缝地访问其存储,而无需修改Pod的资源清单。

6.pv的回收策略

Retain:
"保留回收"策略允许手动回收资源,删除pvc时,pv仍然存在,并且该卷被视为"已释放(Released)"。
 在管理员手动回收资源之前,使用该策略其他Pod将无法直接使用。

Recycle:
对于"回收利用"策略官方已弃用。相反,推荐的方法是使用动态资源调配。                                  删除pv时候nfs存储卷的数据被删除

如果Retain需要重新使用,可以备份数据,然后删除pv,重新创建pv资源

7.动态存储类StorageClass

storageclasses

PersistentVolume(PV):PV是Kubernetes集群中的一块持久存储资源,可以是物理存储设备、网络存储或云存储等。PV独立于Pod的生命周期,并可以在不同的Pod之间共享和重用。PersistentVolumeClaim(PVC):PVC是Pod对PV的请求,用于声明Pod所需的持久存储资源。Pod可以通过PVC来请求所需的存储资源,而无需关心存储的实际配置细节。

pv,pvc,sc关系

  • PVC可以引用StorageClass来请求动态供应的PV。这意味着管理员无需手动创建PV,而是根据PVC的请求和指定的StorageClass动态创建PV。
  • 另一方面,PVC也可以引用现有的PV来静态绑定PV。这种情况下,PV需要由管理员手动创建。

8.动态存储类sc实战:

(1)k8s组件原生并不支持NFS动态存储

https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner

(2)NFS不提供内部配置器实现动态存储,但可以使用外部配置器。 

git clone https://gitee.com/yinzhengjie/k8s-external-storage.git

(3)进入项目修改配置文件

cd k8s-external-storage/nfs-client/deploy

vim deployment.yaml (修改nfs服务器地址和挂载点即共享路径)

(4)nfs服务器端创建sc需要共享路径

(5)创建动态存储类

kubectl apply -f class.yaml && kubectl get sc 

(6)创建授权角色

kubectl apply -f rbac.yaml

(7)部署nfs动态存储配置器 

需要先将镜像改为gmoney23/nfs-client-provisioner:latest

kubectl apply -f deployment.yaml

(8)查看是否部署成功


(9)此时可以看到,nfs共享的目录已经有文件写入

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

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

相关文章

微信小程序-Docker+Nginx环境配置业务域名验证文件

在实际开发或运维工作中&#xff0c;我们时常需要在 Nginx 部署的服务器上提供一个特定的静态文件&#xff0c;用于域名验证或第三方平台验证。若此时使用 Docker 容器部署了 Nginx&#xff0c;就需要将该验证文件正确地映射&#xff08;挂载&#xff09;到容器中&#xff0c;并…

腾讯云AI代码助手编程挑战赛-智能聊天助手

作品简介 本作品开发于腾讯云 AI 代码助手编程挑战赛&#xff0c;旨在体验腾讯云 AI 代码助手在项目开发中的助力。通过这一开发过程&#xff0c;体验到了 AI 辅助编程的高效性。 技术架构 前端: 使用 VUE3、TypeScript、TDesign 和 ElementUI 实现。 后端: 基于 Python 开发…

计算机视觉算法实战——面部特征点检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​​​​​​​​​​​​ 1. 领域介绍✨✨ 面部特征点检测&#xff08;Facial Landmark Detection&#xff09;是计算机视觉中…

【STM32-学习笔记-8-】I2C通信

文章目录 I2C通信Ⅰ、硬件电路Ⅱ、IIC时序基本单元① 起始条件② 终止条件③ 发送一个字节④ 接收一个字节⑤ 发送应答⑥ 接收应答 Ⅲ、IIC时序① 指定地址写② 当前地址读③ 指定地址读 Ⅳ、MPU6050---6轴姿态传感器&#xff08;软件I2C&#xff09;1、模块内部电路2、寄存器地…

Android SDK下载安装(图文详解)

安装完sdk&#xff0c;就可以直接使用adb命令了&#xff0c;我们做app自动化测试&#xff0c;也需要sdk环境的依赖。 1. 下载Android SDK 网盘下载地址&#xff1a;https://pan.quark.cn/s/8398e52cefc9 官网下载地址&#xff1a;https://www.androiddevtools.cn/ &#xff08;…

农业移动式水肥一体机全面解析:开启精准农业新篇章

在当今科技飞速发展的时代&#xff0c;农业领域也迎来了众多创新设备&#xff0c;农业移动式水肥一体机便是其中的佼佼者。它正悄然改变着传统的农业灌溉与施肥模式&#xff0c;为实现精准农业提供了强有力的支持。 一、什么是农业移动式水肥一体机 农业移动式水肥一体机&…

2008-2020年各省社会消费品零售总额数据

2008-2020年各省社会消费品零售总额数据 1、时间&#xff1a;2008-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、社会消费品零售总额 4、范围&#xff1a;31省 5、指标解释&#xff1a;社会消费品零售总额指企业&#x…

江科大STM32入门——读写备份寄存器(BKP)实时时钟(RTC)笔记整理

wx&#xff1a;嵌入式工程师成长日记 https://mp.weixin.qq.com/s/hDk7QaXP8yfYIj1gUhtMrw?token1051786482&langzh_CNhttps://mp.weixin.qq.com/s/hDk7QaXP8yfYIj1gUhtMrw?token1051786482&langzh_CN RTC是一个独立的定时器&#xff0c;BKP并不能完全掉电不丢失&am…

GitLab CI/CD使用runner实现自动化部署前端Vue2 后端.Net 7 Zr.Admin项目

1、查看gitlab版本 建议安装的runner版本和gitlab保持一致 2、查找runner 执行 yum list gitlab-runner --showduplicates | sort -r 找到符合gitlab版本的runner&#xff0c;我这里选择 14.9.1版本 如果执行出现找不到下载源&#xff0c;添加官方仓库 执行 curl -L &quo…

MySQL解压版(保姆级教程)

文章目录 1. 下载MySQL2. 解压压缩包3. 添加环境变量4. 创建配置文件5. 启动管理员模式下的CMD6. 重启mysql7. 检查服务是否成功启动8. 可能遇见的错误&#x1f3af; 数据目录未正确初始化&#x1f3af; MySQL服务已存在但路径错误&#x1f3af; 端口被占用&#x1f3af; MySQL…

人工智能实验(四)-A*算法求解迷宫寻路问题实验

零、A*算法学习参考资料 1.讲解视频 A*寻路算法详解 #A星 #启发式搜索_哔哩哔哩_bilibili 2.A*算法学习网站 A* 算法简介 一、实验目的 熟悉和掌握A*算法实现迷宫寻路功能&#xff0c;要求掌握启发式函数的编写以及各类启发式函数效果的比较。 二、实验要求 同课本 附录…

【Vue实战】Vuex 和 Axios 拦截器设置全局 Loading

目录 1. 效果图 2. 思路分析 2.1 实现思路 2.2 可能存在的问题 2.2.1 并发请求管理 2.2.2 请求快速响应和缓存带来的问题 3. 代码实现 4. 总结 1. 效果图 如下图所示&#xff0c;当路由变化或发起请求时&#xff0c;出现 Loading 等待效果&#xff0c;此时页面不可见。…

Github配置ssh key,密钥配对错误怎么解决?

解决密钥配对的方案如下&#xff1a; 方法一、最有效的方案&#xff1a;重新配置&#xff0c;验证 SSH 密钥是否已添加到 GitHub 确保您的 SSH 密钥已经正确添加到了 GitHub 账户中。您可以打开命令行控制台&#xff08;cmd/powerShell都可以&#xff09;&#xff0c;按照以下…

Java基础知识(六) -- 常用类

1.包装类 1.1 概述 Java提供了两个类型系统&#xff0c;基本类型与引用类型&#xff0c;使用基本类型在于效率&#xff0c;但当使用只针对对象设计的API或新特性(例如泛型)&#xff0c;那么基本数据类型的数据就需要用包装类来包装。 序号基本数据类型包装类&#xff08;java…

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 &#x1f4cc;补充&#xff1a; &#x1f4cc;通常网络中用高低电平&#xff0c;磁盘中用磁化方向来表示。以下是具体说明&#xff1a; &#x1f4cc;如果有一块磁盘要进行销毁该怎么办&#xff1f; 1-2 磁盘存储结构 ​编辑…

【硬件介绍】Type-C接口详解

一、Type-C接口概述 Type-C接口特点&#xff1a;以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验&#xff0c;避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构&#xff1a;内部上下两排引脚的设计虽然可能不…

Linux第二课:LinuxC高级 学习记录day02

2.4、shell中的特殊字符 2.4.4、命令置换符 或者 $() 反引号&#xff1a;esc下面的按键&#xff0c;英文状态下直接按 功能&#xff1a;将一个命令的输出作为另一个命令的参数 echo 不会认为hostname是一个命令 加上 之后&#xff0c;先执行hostname&#xff0c;拿到主机名…

图生生AI描述生图:一句话生成蛇年海报素材

2025年春晚吉祥物“巳升升”的亮相&#xff0c;引发了广泛讨论。其整体造型参考甲骨文中的“巳”字&#xff0c;以青绿色为主调&#xff0c;象征春意盎然、蓬勃生机。从头部轮廓、脸颊螺旋形状到五官设计&#xff0c;都蕴含着丰富的传统文化元素。巳升升的亮相&#xff0c;春节…

KMP前缀表 ≈ find() 函数——28.找出字符串中第一个匹配项的下标【力扣】

class Solution { public: //得到前缀表void getNext(int *next,string needle){int j0;for(int i1;i<needle.size();i){while(j>0 && needle[j]!needle[i]) jnext[j-1];//**j>0**>j0是出口if(needle[i]needle[j]) j;next[i]j;//若写入if中&#xff0c;则该…

前端笔记----

在我的理解里边一切做页面的代码都是属于前端代码。 之前用过qt框架&#xff0c;也是用来写界面的&#xff0c;但是那是用来写客户端的&#xff0c;而html是用来写web浏览器的&#xff0c;相较之下htmlcssJavaScript写出来的界面是更加漂亮的。这里就记录我自个学习后的一些笔…