当前位置: 首页 > news >正文

通过AWS EKS 生成并部署容器化应用

今天给大家分享一个实战例子,如何在EKS上创建容器化应用并通过ALB来发布。先介绍一下几个基本概念:

  • IAM, OpenID Connect (OIDC)

2014 年,AWS Identity and Access Management 增加了使用 OpenID Connect (OIDC) 的联合身份支持。此功能允许您使用支持的身份提供商对 AWS API 调用进行身份验证,并接收有效的 OIDC JSON Web 令牌 (JWT)。您可以将此令牌传递给 AWS STS AssumeRoleWithWebIdentity API 操作并接收 IAM 临时角色凭证。您可以使用这些凭证与任何 AWS 服务进行交互,包括 Amazon S3 和 DynamoDB。

每个 JWT 令牌都由签名密钥对签名。密钥由 Amazon EKS 管理的 OIDC 提供商提供,私钥每 7 天轮换一次。Amazon EKS 会保留公钥,直到它们过期。如果您连接外部 OIDC 客户端,请注意,您需要在公钥过期之前刷新签名密钥。了解如何获取签名密钥以验证 OIDC 令牌。

Kubernetes 长期以来一直使用服务账户作为自己的内部身份系统。Pod 可以使用自动挂载的令牌(非 OIDC JWT)向 Kubernetes API 服务器进行身份验证,只有 Kubernetes API 服务器才能验证该令牌。这些旧式服务账户令牌不会过期,并且轮换签名密钥是一个困难的过程。在 Kubernetes 1.12 版中,添加了对新 ProjectedServiceAccountToken 功能的支持。此功能是 OIDC JSON Web 令牌,还包含服务账户身份并支持可配置的受众。

Amazon EKS 为每个集群托管一个公共 OIDC 发现终端节点,其中包含 ProjectedServiceAccountToken JSON Web 令牌的签名密钥,因此外部系统(例如 IAM)可以验证和接受 Kubernetes 颁发的 OIDC 令牌。

通过下面的架构图能清晰地说明它们之间的关系:

图片

创建EKS cluster

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
export AWS_DEFAULT_REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" --silent http://169.254.169.254/latest/meta-data/placement/region)
echo $AWS_DEFAULT_REGIONeksctl create cluster \
--name eks-lab-cluster \
--nodegroup-name worknodes-1 \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 4 \
--managed \
--version 1.29 \
--region ${AWS_DEFAULT_REGION}

生成eks kubeconfig 文件

aws eks update-kubeconfig --name eks-lab-cluster --region ${AWS_DEFAULT_REGION}

检查EKS cluster 状态

ec2-user:~/environment $ kubectl get node
NAME                                                STATUS   ROLES    AGE     VERSION
ip-192-168-51-133.ap-southeast-2.compute.internal   Ready    <none>   5m26s   v1.29.3-eks-ae9a62a
ip-192-168-92-105.ap-southeast-2.compute.internal   Ready    <none>   5m25s   v1.29.3-eks-ae9a62a
ec2-user:~/environment $ kubectl get pod -A
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   aws-node-mm6xr             2/2     Running   0          6m
kube-system   aws-node-w6v9b             2/2     Running   0          6m1s
kube-system   coredns-57d946db4c-hjgb9   1/1     Running   0          9m38s
kube-system   coredns-57d946db4c-x5t68   1/1     Running   0          9m38s
kube-system   kube-proxy-6ffsn           1/1     Running   0          6m1s
kube-system   kube-proxy-sj5k2           1/1     Running   0          6m

创建docker 容器

创建website 的Dockerfile文件

FROM public.ecr.aws/docker/library/httpd:2.4RUN apt-get update && apt-get -y install cron && apt-get install vim -yCOPY cron /etc/cron.d/COPY index.html /usr/local/apache2/htdocs/COPY metadata.sh /usr/local/apache2/htdocs/COPY copy-metadata-file.sh /COPY font /usr/local/apache2/htdocs/fontCOPY images /usr/local/apache2/htdocs/imagesRUN mkdir /var/metadataRUN chmod -R 0777 /var/metadata/RUN chmod +x /usr/local/apache2/htdocs/metadata.shRUN chmod +x /copy-metadata-file.shRUN chmod 644 /etc/cron.d/cronRUN crontab /etc/cron.d/cronEXPOSE 80WORKDIR /usr/local/apache2/htdocs/CMD ./metadata.sh && crontab && crontab /etc/cron.d/cron && service cron restart && apachectl -D FOREGROUND

创建sidecar容器的Dockerfile

ROM public.ecr.aws/docker/library/python:alpine3.16RUN python3 --version
RUN pip3 --version
RUN apk add --no-cache aws-cli
RUN aws --version
RUN mkdir /var/metadata/
COPY metadata2.sh /
COPY metadata2.json /
RUN chmod +x /metadata2.sh
RUN chmod -R 0777 /var/metadata/
CMD ./metadata2.sh

创建镜像文件

docker build -t website .
docker build -t sidecar .

创建ecr

$ aws ecr create-repository  --repository-name website  --region ${AWS_DEFAULT_REGION}
{"repository": {"repositoryArn": "arn:aws:ecr:ap-southeast-2:654654314383:repository/website","registryId": "654654314383","repositoryName": "website","repositoryUri": "654654314383.dkr.ecr.ap-southeast-2.amazonaws.com/website","createdAt": "2024-07-18T01:31:42.098000+00:00","imageTagMutability": "MUTABLE","imageScanningConfiguration": {"scanOnPush": false},"encryptionConfiguration": {"encryptionType": "AES256"}}
}
ec2-user:~/environment/environment/eksLabRepo (main) $ aws ecr create-repository \
>  --repository-name sidecar \
>  --region ${AWS_DEFAULT_REGION}
{"repository": {"repositoryArn": "arn:aws:ecr:ap-southeast-2:654654314383:repository/sidecar","registryId": "654654314383","repositoryName": "sidecar","repositoryUri": "654654314383.dkr.ecr.ap-southeast-2.amazonaws.com/sidecar","createdAt": "2024-07-18T01:33:09.150000+00:00","imageTagMutability": "MUTABLE","imageScanningConfiguration": {"scanOnPush": false},"encryptionConfiguration": {"encryptionType": "AES256"}}
}

给变量赋值

ec2-user:~/environment/environment/eksLabRepo (main) $ export ECR_REPO_URI_WEBSITE=$(aws ecr describe-repositories \>  --repository-names website \>  --region ${AWS_DEFAULT_REGION} \>  --query 'repositories[*].repositoryUri' \>  --output text)ec2-user:~/environment/environment/eksLabRepo (main) $ export ECR_REPO_URI_SIDECAR=$(aws ecr describe-repositories \>  --repository-names sidecar \>  --region ${AWS_DEFAULT_REGION} \>  --query 'repositories[*].repositoryUri' \>  --output text)ec2-user:~/environment/environment/eksLabRepo (main) $ echo ECR_REPO_URI_WEBSITE=$ECR_REPO_URI_WEBSITE && echo ECR_REPO_URI_SIDECAR=$ECR_REPO_URI_SIDECARECR_REPO_URI_WEBSITE=654654314383.dkr.ecr.ap-southeast-2.amazonaws.com/websiteECR_REPO_URI_SIDECAR=654654314383.dkr.ecr.ap-southeast-2.amazonaws.com/sidecar

登录ECR

ec2-user:~/environment/environment/eksLabRepo (main) $ aws ecr get-login-password \> --region ${AWS_DEFAULT_REGION} \>  | docker login \>  --username AWS \>  --password-stdin $ACCOUNT_NUMBER.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.comWARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

上传镜像到ECR

c2-user:~/environment/environment/eksLabRepo (main) $ docker tag website:latest $ECR_REPO_URI_WEBSITE:latest
ec2-user:~/environment/environment/eksLabRepo (main) $ docker push $ECR_REPO_URI_WEBSITE:latest
The push refers to repository [654654314383.dkr.ecr.ap-southeast-2.amazonaws.com/website]
5f70bf18a086: Pushed
latest: digest: sha256:35d429413b45d69f42da254cb875bc77774a0df50f1327888b071b6038b886da size: 4480
ec2-user:~/environment/environment/eksLabRepo (main) $ docker tag sidecar:latest $ECR_REPO_URI_SIDECAR:latest
ec2-user:~/environment/environment/eksLabRepo (main) $ docker push $ECR_REPO_URI_SIDECAR:latest
The push refers to repository [654654314383.dkr.ecr.ap-southeast-2.amazonaws.com/sidecar]
254e6068aa48: Pushed 
latest: digest: sha256:da1998c5b425dc986463ca94578c11f32ec10fcab0f9711f07f0c9185e4e8e86 size: 3242

检查eks cluster 状态

ec2-user:~/environment/environment/eksLabRepo (main) $ aws eks describe-cluster \
>  --name eks-lab-cluster \
>  --query 'cluster.status' \
>  --output text
ACTIVE

在EKS上创建AWS Load Balancer Controller

export ACCOUNT_NUMBER=$(aws sts get-caller-identity --query 'Account' --output text)eksctl utils associate-iam-oidc-provider --region ap-southeast-2 --cluster eks-lab-cluster --approveeksctl create iamserviceaccount --cluster=eks-lab-cluster --namespace=kube-system --name=aws-load-balancer-controller --role-name "AmazonEKSLoadBalancerControllerRole" --attach-policy-arn=arn:aws:iam::$ACCOUNT_NUMBER:policy/AWSLoadBalancerControllerIAMPolicy --approve
sleep 5helm repo add eks https://aws.github.io/eks-chartshelm repo updatehelm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=eks-lab-cluster --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

分析每条命令的作用

下面的命令将 oidc provider和 eks 关联起来

eksctl utils associate-iam-oidc-provider --region ap-southeast-2 --cluster eks-lab-cluster --approve

下面的命令在eks中创建服务账号并和aws role , policy 关联起来。

eksctl create iamserviceaccount --cluster=eks-lab-cluster --namespace=kube-system --name=aws-load-balancer-controller --role-name "AmazonEKSLoadBalancerControllerRole" --attach-policy-arn=arn:aws:iam::$ACCOUNT_NUMBER:policy/AWSLoadBalancerControllerIAMPolicy --approve

检查aws load balancer创建成功

kubectl get pods \ -n kube-system \ --selector=app.kubernetes.io/name=aws-load-balancer-controller

图片

部署应用

  • 创建命令空间

kubectl create namespace containers-lab
  • 准备yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:namespace: containers-labname: eks-lab-deploylabels:app: eks-app
spec:replicas: 3selector:matchLabels:app: lab-apptemplate:metadata:labels:app: lab-appspec:containers:- name: websiteimage: $ECR_REPO_URI_WEBSITE:latest ## <-- Placeholder replaced with environment variableports:- containerPort: 80volumeMounts:- mountPath: /var/metadataname: metadata-vol- name: sidecarimage: $ECR_REPO_URI_SIDECAR:latest ## <-- Placeholder replaced with environment variablevolumeMounts:- mountPath: /var/metadataname: metadata-volvolumes:- name: metadata-volemptyDir: {}
---
apiVersion: v1
kind: Service
metadata:name: lab-servicenamespace: containers-lab
spec:ports:- port: 80targetPort: 80protocol: TCPtype: NodePortselector:app: lab-app
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:namespace: containers-labname: lab-ingressannotations:alb.ingress.kubernetes.io/scheme: internet-facingalb.ingress.kubernetes.io/target-type: ipkubernetes.io/ingress.class: alb
spec:rules:- http:paths:- path: /pathType: Prefixbackend:service:name: lab-serviceport:number: 80
  • 部署应用

kubectl apply -f k8s-all.yamlkubectl get all -n containers-labkubectl get ingress -n containers-lab

图片

通过浏览器访问该地址

图片

Amazon EKS 支持服务账户的 IAM 角色 (IRSA),允许集群操作员将 AWS IAM 角色映射到 Kubernetes 服务账户。

这为在 EKS 上运行并使用其他 AWS 服务的应用程序提供了细粒度的权限管理。这些应用程序可能是使用 S3、任何其他数据服务(RDS、MQ、STS、DynamoDB)或 Kubernetes 组件(如 AWS 负载均衡器控制器或 ExternalDNS)的应用程序。

您可以使用 eksctl 轻松创建 IAM 角色和服务账户对。

工作原理

它通过 EKS 公开的 IAM OpenID Connect 提供程序 (OIDC) 工作,并且必须参考 IAM OIDC 提供程序(特定于给定的 EKS 集群)以及对其将绑定到的 Kubernetes 服务帐户的引用来构建 IAM 角色。创建 IAM 角色后,服务帐户应将该角色的 ARN 作为注释 (eks.amazonaws.com/role-arn)。默认情况下,将创建或更新服务帐户以包含角色注释,可以使用标志 --role-only 禁用此功能。

在 EKS 内部,有一个准入控制器,它根据 pod 使用的服务帐户上的注释将 AWS 会话凭据分别注入角色的 pod 中。凭据将由 AWS_ROLE_ARN 和 AWS_WEB_IDENTITY_TOKEN_FILE 环境变量公开。

在 eksctl 中,资源的名称是 iamserviceaccount,它代表 IAM 角色和服务帐户对。

在开始之前,我先介绍一下IAM 角色和策略:

角色

您可以在账户中创建具有特定权限的 IAM 身份。IAM 角色与 IAM 用户有一些相似之处。角色和用户都是具有权限策略的 AWS 身份,这些权限策略决定了身份在 AWS 中可以做什么和不能做什么。但是,角色并非唯一地与一个人相关联,而是由任何需要它的人担任。此外,角色没有与之关联的标准长期凭证(例如密码或访问密钥)。相反,当您担任角色时,它会为您的角色会话提供临时安全凭证。

角色可供以下人员使用:

  • 与角色位于同一 AWS 账户中的 IAM 用户

  • 与角色位于不同 AWS 账户中的 IAM 用户

  • AWS 提供的 Web 服务,例如 Amazon Elastic Compute Cloud (Amazon EC2)

  • 由与 SAML 2.0 或 OpenID Connect 兼容的外部身份提供商 (IdP) 服务或定制的身份代理进行身份验证的外部用户。

策略

您可以通过创建策略并将其附加到 IAM 身份(用户、用户组或角色)或 AWS 资源来管理 AWS 中的访问权限。策略是 AWS 中的对象,当与身份或资源关联时,它定义其权限。当 IAM 主体(用户或角色)发出请求时,AWS 会评估这些策略。策略中的权限决定是允许还是拒绝请求。大多数策略都以 JSON 文档的形式存储在 AWS 中。AWS 支持六种类型的策略:基于身份的策略、基于资源的策略、权限边界、组织 SCP、ACL 和会话策略。

IAM 策略定义操作的权限,无论您使用何种方法执行操作。例如,如果策略允许 GetUser 操作,则具有该策略的用户可以从 AWS 管理控制台、AWS CLI 或 AWS API 获取用户信息。创建 IAM 用户时,您可以选择允许控制台或编程访问。如果允许控制台访问,则 IAM 用户可以使用其登录凭证登录控制台。如果允许编程访问,用户可以使用访问密钥来使用 CLI 或 API。

默认情况下,当 Amazon EKS 集群具有 EC2 实例工作节点时,Pod 调用 AWS API 的权限有限。它们继承了工作节点的 EC2 实例配置文件。实例配置文件附加了以下 AWS 托管策略:

  • AmazonEKSWorkerNodePolicy

  • AmazonEC2ContainerRegistryReadOnly

  • AmazonSSMManagedInstanceCore

  • AmazonEKS_CNI_Policy

在这种情况下,已部署的应用程序会调用 API 来检索数据,但没有所需的权限。最佳实践是使用服务账户的 IAM 角色功能为在 Kubernetes pod 上运行的应用程序提供所需的权限。服务账户的 IAM 角色功能提供以下好处:

  • 最小权限:通过使用服务账户的 IAM 角色功能,您无需为该节点上的 pod 提供节点 IAM 角色的扩展权限来调用 AWS API。您可以将 IAM 权限范围限定到服务账户,只有使用该服务账户的 pod 才能访问这些权限。此功能还意味着您不需要第三方解决方案,例如 kiam 或 kube2iam。

  • 凭证隔离:容器只能检索与其所属服务账户关联的 IAM 角色的凭证。容器永远无法访问属于另一个 pod 的另一个容器的凭证。

  • 可审计性:可通过 AWS CloudTrail 提供访问和事件日志记录,以帮助确保追溯审计。
    需要为EKS pod创建IAM role.

提前创建一个policy eks-lab-read-policy,这里我用了默认的管理员权限,实际生产环境中不建议这样做。

{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "*","Resource": "*"}]
}

然后运行下面的命令来创建 iamserviceaccount

ec2-user:~/environment/environment/eksLabRepo/eks-lab-app (main) $ eksctl create iamserviceaccount     --name iampolicy-sa-3     --namespace containers-lab     --cluster eks-lab-cluster     --role-name "eksRole4serviceaccount3"     --attach-policy-arn arn:aws:iam::$ACCOUNT_NUMBER:policy/eks-lab-read-policy     --approve     --override-existing-serviceaccounts                                                                                                           
2024-07-19 04:51:43 [ℹ]  2 existing iamserviceaccount(s) (default/s3-read-only,kube-system/aws-load-balancer-controller) will be excluded
2024-07-19 04:51:43 [ℹ]  1 iamserviceaccount (containers-lab/iampolicy-sa-3) was included (based on the include/exclude rules)
2024-07-19 04:51:43 [!]  metadata of serviceaccounts that exist in Kubernetes will be updated, as --override-existing-serviceaccounts was set
2024-07-19 04:51:43 [ℹ]  1 task: { 2 sequential sub-tasks: { create IAM role for serviceaccount "containers-lab/iampolicy-sa-3",create serviceaccount "containers-lab/iampolicy-sa-3",} }2024-07-19 04:51:43 [ℹ]  building iamserviceaccount stack "eksctl-eks-lab-cluster-addon-iamserviceaccount-containers-lab-iampolicy-sa-3"
2024-07-19 04:51:44 [ℹ]  deploying stack "eksctl-eks-lab-cluster-addon-iamserviceaccount-containers-lab-iampolicy-sa-3"
2024-07-19 04:51:44 [ℹ]  waiting for CloudFormation stack "eksctl-eks-lab-cluster-addon-iamserviceaccount-containers-lab-iampolicy-sa-3"
2024-07-19 04:52:14 [ℹ]  waiting for CloudFormation stack "eksctl-eks-lab-cluster-addon-iamserviceaccount-containers-lab-iampolicy-sa-3"
2024-07-19 04:52:14 [ℹ]  created serviceaccount "containers-lab/iampolicy-sa-3"

验证服务账号的状态

ec2-user:~/environment/environment/eksLabRepo/eks-lab-app (main) $ kubectl get sa iampolicy-sa-3 -n containers-lab -o yaml                                  
apiVersion: v1
kind: ServiceAccount
metadata:annotations:eks.amazonaws.com/role-arn: arn:aws:iam::654654314383:role/eksRole4serviceaccount3creationTimestamp: "2024-07-19T04:52:14Z"labels:app.kubernetes.io/managed-by: eksctlname: iampolicy-sa-3namespace: containers-labresourceVersion: "316598"uid: 6d8b23ce-b9ca-4c67-be54-fb58eca29a82

更新deployment 的服务账号

ec2-user:~/environment/environment/eksLabRepo/eks-lab-app (main) $ kubectl set serviceaccount \
>  deployment eks-lab-deploy \
>  iampolicy-sa-3 -n containers-lab
deployment.apps/eks-lab-deploy serviceaccount updated

验证deployment服务账号已经更新

ec2-user:~/environment/environment/eksLabRepo/eks-lab-app (main) $ kubectl describe deployment.apps/eks-lab-deploy \
>  -n containers-lab | grep 'Service Account'Service Account:  iampolicy-sa-3

获得 ingress的ALB地址

ec2-user:~/environment/environment/eksLabRepo/eks-lab-app (main) $ kubectl get ingress -n containers-lab
NAME          CLASS    HOSTS   ADDRESS                                                                        PORTS   AGE
lab-ingress   <none>   *       k8s-containe-labingre-3207ffb4ea-1472706054.ap-southeast-2.elb.amazonaws.com   80      17m

打开浏览器访问该地址,可以看到 aws account, cluster name kubernetes version 信息已经可以正常显示。

图片

相关文章:

通过AWS EKS 生成并部署容器化应用

今天给大家分享一个实战例子&#xff0c;如何在EKS上创建容器化应用并通过ALB来发布。先介绍一下几个基本概念&#xff1a; IAM, OpenID Connect (OIDC) 2014 年&#xff0c;AWS Identity and Access Management 增加了使用 OpenID Connect (OIDC) 的联合身份支持。此功能允许…...

GNSS静态数据处理

1 安装数据处理软件&#xff1a;仪器之星&#xff08;InStar &#xff09;和 Trimble Business Center 做完控制点静态后&#xff0c;我们需要下载GNSS数据&#xff0c;对静态数据进行处理。在处理之前需要将相关软件在自己电脑上安装好&#xff1a; 仪器之星&#xff08;InS…...

NVIDIA H100 vs A100:新一代GPU架构性能对比分析

一、核心架构演进对比 ‌Ampere架构&#xff08;A100&#xff09;‌采用台积电7nm工艺&#xff0c;集成540亿晶体管&#xff0c;配备6,912个CUDA核心和432个第三代Tensor Core&#xff0c;支持FP16、TF32和INT8精度计算。其显存子系统采用HBM2e技术&#xff0c;80GB版本带宽可…...

AI图像生成

要通过代码实现AI图像生成&#xff0c;可以使用深度学习框架如TensorFlow、PyTorch或GANs等技术。下面是一个简单的示例代码&#xff0c;演示如何使用GANs生成手写数字图像&#xff1a; import torch import torchvision import torchvision.transforms as transforms import …...

计算机考研一战上岸宁波大学经验分享

目录 话不多说先上分数 个人介绍 政治 英语二 数学二 408 复试 话不多说先上分数 初试排名15/65 复试79.81分&#xff0c;复试排名13/65 总成绩13/65&#xff0c;研招网招考50人 &#xff08;均为公开数据&#xff0c;非泄露复试信息&#xff09; 个人介绍 本人山东…...

泛微ECOLOGY9 记 数据展现集成 自定义开窗测试中对SQL 的IN语法转换存在BUG

背景 搭建流程时&#xff0c;需将明细表1中的合同字段 供明细表2中的合同开窗查询使用。 最终实现如下图&#xff1a; 选择 发票号时&#xff0c;自动带出明细表1中的采购合同号清单&#xff0c;然后在明细表2中开窗采购合同号时&#xff0c;只跳出明细表1中有的采购合同号&am…...

【Nginx】Nginx代理Tomcat配置及404问题解决

当Tomcat返回HTTP 404未找到错误时&#xff0c;可以通过以下两种方式设置跳转到指定地址&#xff1a; ① 在Tomcat应用内部配置错误页面跳转&#xff08;直接修改Tomcat的Web应用配置&#xff09; ② 在Nginx反向代理层拦截404错误并跳转&#xff08;无需修改Tomcat&#xff0c…...

【Vue】案例——To do list:

【Vue】案例——To do list&#xff1a; 一、案例介绍&#xff1a;二、效果展示&#xff08;如图&#xff09;三、主要功能&#xff1a;四、技术要点&#xff1a;补充&#xff1a;【Vue】Vue模板语法(点击可跳转)补充&#xff1a;【Vue】数据绑定&#xff08;单双向&#xff09…...

JVM不同环境不同参数配置文件覆盖

背景 需要在启动Java服务并且参数不同的场景&#xff0c;例如端口号在yml中的配置是这样的&#xff1a; server:port: 9100 覆盖配置对应JVM参数&#xff1a; java -jar xxxx.jar -Dserver.port12306 [JVM其他参数] 这样12306就会覆盖掉9100端口的配置作为启动配置 IDE…...

游戏引擎学习第215天

总结并为今天做铺垫 今天的工作内容是解决调试系统中的一个小问题。昨天我们已经完成了大部分的调试系统工作&#xff0c;但还有一个小部分没有完全处理&#xff0c;那就是关于如何层次化组织数据的问题。我们遇到的一个问题是&#xff0c;演示代码中仍有一个尚未解决的部分&a…...

C语言--求n以内的素数(质数)

求n以内的素数&#xff0c;可以用试除法或者埃拉托斯特尼筛法&#xff08;埃氏筛法&#xff09; 输入&#xff1a;数字n 输出&#xff1a;n以内所有的素数 不管是哪个方法&#xff0c;都有一个数学结论可以减少循环次数&#xff1a; 如果有一个数不是质数&#xff0c;那么它至…...

多版本go冲突问题

今天执行go build时遇到一个报错&#xff1a; compile: version “go1.22.7 (Red Hat 1.22.7-1.moduleel8.10.0700fd5cfc7a)” does not match go tool version “go1.23.4” 结果一查 which -a go 发现 当前系统居然有四个不同的位置都安装了go 于是先看go version&#xf…...

Windows 10系统出现无法使用键鼠的问题

有一位系统之家的小伙伴在升级Windows 10系统电脑的时候&#xff0c;出现键盘鼠标不能正常工作打问题&#xff0c;其实&#xff0c;遇到这个问题&#xff0c;有时只需重新启动计算机或断开连接并重新连接鼠标或键盘可以提供帮助&#xff0c;如果没有&#xff0c;可以看看下面系…...

NFC 数据传输

前言 初次接触NFC协议&#xff0c;很多人都会感觉困惑&#xff0c;搜索相关资料&#xff0c;大多数都介绍协议的理论及应用领域&#xff0c;数据传输的内容却很少&#xff0c;但对与开发人员来说&#xff0c;除了理论知识外&#xff0c;数据传输也是非常重要环节&#xff0c;尤…...

基于Streamlit的智能创业计划生成器开发实践

一、应用概述 在数字经济时代&#xff0c;创业者亟需高效工具进行系统化的商业规划。本文介绍的智能创业计划生成器基于Streamlit框架构建&#xff0c;整合了财务建模、时间轴规划、智能文档生成等核心功能。该工具通过模块化设计实现了九大创业要素的系统化配置&#xff0c;显…...

蓝桥杯单片机刷题——按键控制距离显示精度

设计要求 驱动超声波传感器&#xff0c;启动距离测量功能,并将其结果显示到数码管上&#xff0c;距离数据单位为m。 按键“S4”定义为“切换”按键&#xff0c;通过此按键切换距离的显示精度&#xff08;一位或两位小数&#xff09;。切换顺序如图所示。 数码管显示格式如下图…...

c++拷贝构造函数(深浅拷贝)+运算符重载

1拷贝构造函数 1.1定义 只有一个形参&#xff0c;且该形参是对本类类型对象的引用&#xff08;一般用const 修饰&#xff09;&#xff0c;在用已经存在的类类型对象穿件新对象是由编译器自动调用。&#xff08;是一种特殊构造&#xff0c;即初始化一个一模一样的新对象&#…...

操作系统 3.5-内存换入-请求调页

案例分析内存换入 内存换入分析&#xff1a; 内存换入&#xff08;Swapping&#xff09;是指操作系统将不常使用的内存页从物理内存&#xff08;RAM&#xff09;移动到磁盘上的交换空间&#xff08;Swap Space&#xff09;&#xff0c;以释放物理内存供其他进程使用。当需要访…...

stm32工程,拷贝到另一台电脑编译,错误提示头文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 这个头文件 . 于是我在原电脑工程文件里找也没有找到这个头文件 接下来查看原电脑keil的头文件引入配置,发现只引入了工程文件下的头文件, 那么core_cm4.h到底哪里来的? (到现在我也不清楚怎…...

使用platformio如何定位hard fault错误

这里写自定义目录标题 前言过程记录结语前言 hard fault是单片机开发过程中经常会遇到的问题,通常是内存溢出、野指针访问等导致,对于有经验的工程师,在代码改动不大的情况下,一般可以通过代码审查定位到问题原因,但也有很多情况下需要借助调试工具进行定位,像Keil就有比…...

全局异常处理器的基本使用

那使用全局异常处理器可以么&#xff1f; 是的&#xff0c;使用全局异常处理器是一个非常好的选择&#xff0c;因为它可以将异常处理逻辑集中化&#xff0c;避免在 Service 层或 Controller 层中重复编写异常处理代码。以下是使用全局异常处理器来处理添加用户时 username 唯一…...

python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)

Python 目前是 AI 开发的首选语言 软件安装 python解释器 官网下载 Python |Python.org 勾选 Add python.exe to PATH 将python.exe添加到PATH 勾选这个选项会将Python的可执行文件路径添加到系统的环境变量PATH中。这样做的好处是&#xff0c;你可以在命令行中从任何位置直…...

众趣科技助力商家“以真示人”,让消费场景更真实透明

在当今的消费环境中&#xff0c;消费者权益保护问题日益凸显。无论是网购商品与实物不符、预定酒店民宿与图文描述差异大&#xff0c;还是游览景区遭遇“照骗”&#xff0c;这些问题不仅让消费者在消费和决策过程中倍感困扰&#xff0c;也让商家面临信任危机。 消费者在享受便…...

【Redis】string类型

目录 1、介绍2、底层实现【1】SDS【2】int编码【3】embstr编码【4】raw编码【5】embstr和raw的区别 3、常用指令【1】字符串基本操作&#xff1a;【2】批量操作【3】计数器【4】过期时间【5】不存在就插入 4、使用场景 1、介绍 string是redis中最简单的键值对形式&#xff0c;…...

EPLAN许可证更新教程

随着电气设计软件的不断更新和优化&#xff0c;确保您的EPLAN许可证始终是最新版本对于顺畅的项目管理至关重要。本文将为您提供一份详尽的EPLAN许可证更新教程&#xff0c;帮助您轻松完成更新操作&#xff0c;确保您的软件始终保持最佳状态。 一、为什么需要更新EPLAN许可证&…...

学习笔记五——Rust 控制流全解析

&#x1f4da; 目录 什么是控制流&#xff1f;Rust 有什么特别&#xff1f;if 表达式完整语法loop / while / for 三种循环写法match 表达式 _ 通配符深入解释if let 表达式用法与场景Option、Some、None 全面通俗讲解 "Tom" 和 "Tom".to_string() 有啥本…...

远程桌面协议(RDP)详解:原理、优势与局限和优化方案分享

文章目录 导言一. RDP的工作原理二. RDP的优势三. RDP的局限性四. RDP的优化与替代方案五. 内网穿透远程访问总结 导言 远程桌面协议(RDP)是一种微软开发的专有协议&#xff0c;允许用户通过网络连接到另一台计算机&#xff0c;并像操作本地计算机一样进行操作。它广泛应用于远…...

Linux 系统管理常用命令

以下是 Linux 系统管理常用命令 的详细介绍&#xff0c;涵盖 IP地址查看、端口管理、进程监控 等核心操作&#xff0c;并附上实际示例&#xff1a; 一、查看网卡 IP 地址 1. 使用 ip 命令 # 查看所有网络接口信息&#xff08;包括 IP 地址&#xff09; ip addr show# 查看特定…...

蓝桥杯篇---客观题

文章目录 前言 前言 本文简单介绍了蓝桥杯中客观题各个部分的知识点。 一、单片机相关 IAP15F2K61S2单片机的定时器0具有4种工作模式&#xff0c;当采用外部12MHz晶振时&#xff0c;定时器最大定时长度65535us。8051单片机的P0口&#xff0c;当使用外部存储器时它是一个传输低…...

RK3568 基于Gstreamer的多媒体调试记录

文章目录 1、环境介绍2、概念理清3、提前准备4、GStreamer编译5、GStreamer基础介绍6、视频播放初体验7、视频硬编码7.1、h2647.2、h265 8、视频硬解码8.1、解码视频并播放解码视频并播放带音频 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk356x …...

ZYNQ笔记(五):AXI GPIO 中断

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;使用 AXI GPIO IP 核以中断方式实现按键 KEY 控制 LED 亮灭翻转&#xff08;两个都在PL端&#xff09; 目录 一、介绍 二、硬件设计 三、软件设计 四、效果 一、介绍 AXI GPIO 中断通常…...

C++23 多维下标运算符:探索 P2128R6 提案

文章目录 一、背景与动机二、语法与实现2.1 语法2.2 实现方式 三、应用场景3.1 多维数组3.2 自定义数据结构3.3 并行计算 四、性能影响4.1 编译时优化4.2 自定义数据结构的优化 五、总结 C23 引入了许多新特性&#xff0c;其中之一便是多维下标运算符&#xff08;P2128R6&#…...

原理图设计准备:页面栅格模板应用设置

一、页面大小的设置 &#xff08;1&#xff09;单页原理图页面设置 首先&#xff0c;选中需要更改页面尺寸的那一页原理图&#xff0c;鼠标右键&#xff0c;选择“Schmatic Page Properties”选项&#xff0c;进行页面大小设置。 &#xff08;2&#xff09;对整个原理图页面设…...

LeeCode 409.最长回文串

给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s "abccccdd" 输出:7 解释: 我们可以构造的…...

保护PCBA的不同方法:喷三防漆 vs 镀膜

PCBA&#xff08;印刷电路板组件&#xff09;的防护工艺中&#xff0c;喷三防漆和镀膜&#xff08;如Parylene气相沉积&#xff09;是两种常见技 术。它们在防护目的上类似&#xff0c;但在具体实现方式和应用场景上有显著差异。以下从外观、工艺、性 能、物理性质和成本五个…...

XILINX FPGA万兆光电口PXIE板卡设计

主要性能指标 1、 FPGA 型号&#xff1a; XC7K325-TFFG676-2 &#xff1b; 2、 网络端口速率 &#xff1a; 10Gbps/1Gbps/2.5Gbps &#xff1b; 3、 网络端口形式 &#xff1a; 3 路 SFP 万兆光电口 &#xff1b; 4、 内存数量&#xff1a; 4Gb 4 &#xff1b; 5、 内存带宽&…...

LangChain4j实战-Java AI应用开源框架之LangChain4j和Spring AI

今天这篇文章我来分享LangChain4j实战-Java AI应用开源框架之LangChain4j和Spring AI。 在贝恩聊架构AI专栏中通过学习如何使用Java相关AI应用开源框架&#xff0c;到后续开发企业级Java AI应用&#xff0c;将大型语言模型和AI工具集成到现有系统中。我们将重点介绍如何使用Sp…...

机器学习十大算法全解析机器学习,作为人工智能的基石,涵盖了众多高效的算法。今天,我们就来深入探讨其中的十大核心算法!

1️⃣ 线性回归&#xff1a;通过最小化误差的平方和来寻找最佳函数匹配。 2️⃣ 逻辑回归&#xff1a;用于分类问题&#xff0c;通过逻辑函数来预测事件发生的概率。 3️⃣ 决策树&#xff1a;基于特征选择和阈值来构建树形结构&#xff0c;用于分类和回归。 4️⃣ 朴素贝叶…...

day26图像处理OpenCV

文章目录 一、OpenCV1.介绍2.下载3.图像的表示4.图像的基本操作4.1图片读取或创建4.1.1读取4.1.2创建 4.2创建窗口4.3显示图片4.3.1设置读取的图片4.3.2设置显示多久4.3.3释放 4.4.保存图片4.5图片切片&#xff08;剪裁&#xff09;4.6图片大小调节 5.在图像中绘值5.1绘制直线5…...

怎么查询SQL Server AlwaysOn

1. SQL Server AlwaysOn 是什么&#xff1f; SQL Server AlwaysOn 是 Microsoft 提供的高可用性&#xff08;High Availability, HA&#xff09;和灾难恢复&#xff08;Disaster Recovery, DR&#xff09;解决方案&#xff0c;包含以下两个核心技术&#xff1a; 组件描述故障…...

10分钟做了一个投资回报计算器,欢迎大家使用

一、背景 今天突然想算一下1万本金&#xff0c;2%利率存2年情况下的投资回报收益情况&#xff0c;但是发现手上没有计算器&#xff0c;想着自己做一个网页简单实现一下&#xff0c;于是有了这个小工具&#xff08;FutureValueCalculator——未来价值计算器&#xff09;。 二、…...

报错:mount: unknown filesystem type ‘vfat’

服务器重启之后 进入 Ctrl D 界面 界面报错是 FAILED to mount /boot/efi 输入密码进去之后 (py38) [rootlocalhost data]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 1.5T 0 disk ├─sda1 8:1 0 50M 0 part /bo…...

Java学习手册:面向对象编程核心概念

面向对象编程&#xff08;OOP&#xff09;是Java语言的核心编程范式&#xff0c;它强调通过对象之间的交互来实现程序功能。OOP的核心思想是将现实世界中的事物抽象为对象&#xff0c;通过对象的属性和行为来描述和操作这些事物。本文将深入探讨Java中面向对象编程的三大核心概…...

工厂模式(简单工厂,工厂方法,抽象工厂)

工厂模式 工厂模式是java中最常用的设计模式&#xff0c;主要是用来完成对象的创建&#xff0c;使得对象创建过程和对象使用过程分离。 简单来说是取消对象创建者和使用者的耦合&#xff0c;简化new 对象的创建。 优势 &#xff1a;对象的属性创建完整。 缺点&#xff1a; 创建…...

【实际项目分享】多相机取图存图问题

1、项目介绍 针对 ​​5路相机同步取图​​ 场景&#xff0c;设计了一套高并发、低延迟的图像数据管理方案&#xff0c;重点解决多线程环境下的数据竞争与存储效率问题。 2、设计目标​​ ​​高并发写入​​&#xff1a;支持5个相机线程同时写入数据&#xff0c;无锁冲突​​…...

LLMs基础学习(七)DeepSeek专题(1)

LLMs基础学习&#xff08;七&#xff09;DeepSeek专题&#xff08;1&#xff09; 文章目录 LLMs基础学习&#xff08;七&#xff09;DeepSeek专题&#xff08;1&#xff09;DeepSeek 相关资料官方资料与基础文档实践指南和技术解析 热启动与冷启动**热启动&#xff08;主流&…...

安装vllm

ubuntu 22.04, RTX3080, cuda 12.1, cudnn 8.9.7&#xff0c;cuda和cudnn的安装参考&#xff1a;https://blog.csdn.net/m0_52111823/article/details/147154526?spm1001.2014.3001.5501。 查看版本对应关系&#xff0c;下载12.1对应的whl包&#xff0c;https://github.com/vl…...

SVMSPro分布式综合安防管理平台--地图赋能智慧指挥调度新高度

SVMSPro分布式综合安防管理平台–地图赋能智慧指挥调度新高度 在智慧城市建设和公共安全需求日益增长的背景下&#xff0c;SVMSPro分布式综合安防管理平台凭借其强大的地图功能与多协议兼容能力&#xff0c;正在成为公安、司法、消防、城管、交通等领域的指挥调度“智慧大脑”…...

科技快讯 | OpenAI:向Plus和Pro用户推出ChatGPT记忆提升功能;我国成功发射通信技术试验卫星十七号;芯片国产化率超九成

继 OpenAI 后&#xff0c;谷歌 Gemini 模型将支持 Anthropic 的 MCP 协议 4月10日&#xff0c;谷歌DeepMind宣布将支持Anthropic的模型上下文协议&#xff08;MCP&#xff09;&#xff0c;以实现大语言模型与外部数据源的集成。MCP由Anthropic推出&#xff0c;旨在建立安全双向…...

【教学类-102-08】剪纸图案全套代码08——Python点状虚线优化版本02(有空隙)+制作1图2图6图24图

背景需求 代码实现了点状虚线的全套流程,但是图片中主体图案和虚线与左右两边粘连。 【教学类-102-07】剪纸图案全套代码07——Python点状虚线优化版本01(无空隙)+制作1图2图6图24图-CSDN博客文章浏览阅读665次,点赞11次,收藏11次。【教学类-102-07】剪纸图案全套代码07…...