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

通过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) 的联合身份支持。此功能允许…...

nginx入门,部署静态资源,反向代理,负载均衡使用

Nginx在linux上部署静态资源 概念介绍 Nginx可以作为静态web服务器来部署静态资源。这里所说的静态资源是指在服务端真实存在&#xff0c;并且能够直接展示的一些文件&#xff0c;比如常见的html页面、css文件、js文件、图片、视频等资源。 相对于Tomcat&#xff0c;Nginx处理…...

智膳优选 | AI赋能的智慧食堂管理专家 —— 基于飞书多维表格和扣子(Coze)的智能解决方案

智膳优选 | AI赋能的智慧食堂管理专家 基于飞书多维表格和扣子&#xff08;Coze&#xff09;的智能解决方案 数据驱动餐饮管理&#xff0c;让每一餐都是营养与经济的完美平衡&#xff01; “智膳优选”通过整合飞书与Coze&#xff0c;将数据智能引入校园餐饮管理&#xff0…...

深入解析 MySQL 中的日期时间函数:DATE_FORMAT 与时间查询优化、DATE_ADD、CONCAT

深入解析 MySQL 中的日期时间函数&#xff1a;DATE_FORMAT 与时间查询优化 在数据库管理和应用开发中&#xff0c;日期和时间的处理是不可或缺的一部分。MySQL 提供了多种日期和时间函数来满足不同的需求&#xff0c;其中DATE_FORMAT函数以其强大的日期格式化能力&#xff0c;…...

最新的es版本忘记密码,重置密码

刚刚安装了最新的es版本,就忘了密码,怎么重置密码呢? 一、进入es的斌目录 #进入es文件/bin 目录 ./elasticsearch-reset-password -u elastic 二 、输入对应的密码 然后再次访问 我的是去掉了ssl的访问 三、如果报错:解决 [main] WARN...

Compose Multiplatform+Kotlin Multiplatfrom 第五弹跨平台 截图

截图功能 Compose MultiplatformKotlin Multiplatfrom下实现桌面端的截图功能&#xff0c;起码搞了两星期&#xff0c;最后终于做出来了&#xff0c;操作都很流畅&#xff0c;截取的文件大小也正常&#xff0c;可参考支持讨论&#xff01; 功能效果 代码实现 //在jvmMain下创…...

Elasticearch数据流向

Elasticearch数据流向 数据流向图 --- config: layout: elk look: classic theme: mc --- flowchart LR subgraph s1["图例"] direction TB W["写入流程"] R["读取流程"] end A["Logstash Pipeline"] -- 写入请求 --> B["Elas…...

在docker里装rocketmq-console

首先要到github下载&#xff08;这个一般是需要你有梯子&#xff09; GitHub - apache/rocketmq-externals at release-rocketmq-console-1.0.0 如果没有梯子&#xff0c;用下面这个百度网盘链接下 http://链接: https://pan.baidu.com/s/1x8WQVmaOBjTjss-3g01UPQ 提取码: fu…...

使用Python写入JSON、XML和YAML数据到Excel文件

在当今数据驱动的技术生态中&#xff0c;JSON、XML和YAML作为主流结构化数据格式&#xff0c;因其层次化表达能力和跨平台兼容性&#xff0c;已成为系统间数据交换的通用载体。然而&#xff0c;当需要将这类半结构化数据转化为具备直观可视化、动态计算和协作共享特性的载体时&…...

从零开始构建智能聊天机器人:Rasa与ChatGPT API实战教程

引言&#xff1a;AI对话系统的时代机遇 在数字化转型浪潮中&#xff0c;聊天机器人已成为连接用户与服务的关键纽带。无论是客服系统中的724小时即时响应&#xff0c;还是智能家居中的语音交互&#xff0c;聊天机器人正在重塑人机交互方式。本文将通过详细教程&#xff0c;手把…...

编码常见的 3类 23种设计模式——学习笔记

一、创建型(用于方便创建实例) 1. 单例模式 优点&#xff1a; 确保系统中只有一个实例存在&#xff0c;避免多个实例导致的资源冲突或数据不一致问题。例如&#xff0c;数据库连接池、线程池等全局资源管理器适合用单例实现。 减少频繁创建和销毁对象的开销&#xff0c;尤其适…...

# 实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现

实时人脸性别与年龄识别&#xff1a;基于OpenCV与深度学习模型的实现 在当今数字化时代&#xff0c;计算机视觉技术正以前所未有的速度改变着我们的生活与工作方式。其中&#xff0c;人脸检测与分析作为计算机视觉领域的重要分支&#xff0c;已广泛应用于安防监控、智能交互、…...

x-cmd install | Slumber - 告别繁琐,拥抱高效的终端 HTTP 客户端

目录 核心优势&#xff0c;一览无遗安装应用场景&#xff0c;无限可能示例告别 GUI&#xff0c;拥抱终端 还在为调试 API 接口&#xff0c;发送 HTTP 请求而苦恼吗&#xff1f;还在各种 GUI 工具之间切换&#xff0c;只为了发送一个简单的请求吗&#xff1f;现在&#xff0c;有…...

apijson 快速上手

apijson是强大的工具&#xff0c;简化了CRUD的操作&#xff0c;只要有数据库表&#xff0c;就能自动生成RESTFUL接口。但初次上手也是摸索了很长时间&#xff0c;尤其是部署与使用上&#xff0c;这里尝试以初学者角度来说下&#xff1a; 一、好处 1、对于简单的应用&#xff…...

3D激光轮廓仪知识整理

文章目录 1.原理和应用场景1.1 相机原理1.1.1 测量原理1.1.2 相机激光器1.1.3 沙姆镜头1.1.4 相机标定1.1.5 中心线提取 1.2 应用场景1.2.1 测量相关应用1.2.2 缺陷检测相关应用 2.相机参数介绍及选型介绍2.1 成像原理2.2 原始图成像2.3 生成轮廓图2.4 相机规格参数2.4.1 单轮廓…...

Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)

目录 &#x1f9e0; 前言 &#x1f9fe; 我的需求 &#x1f527; 实现过程&#xff08;按功能一步步来&#xff09; &#x1f6b6;‍♂️ Step 1&#xff1a;基本图像生成界面 &#x1f5c3;️ Step 2&#xff1a;保存图片并显示历史记录 &#x1f4cf; Step 3&#xff1a…...

使用WasmEdge将InternLM集成到Obsidian,打造本地智能笔记助手

本文来自社区投稿&#xff0c;作者Miley Fu&#xff0c;WasmEdge Runtime 创始成员。 本文将介绍如何通过 WasmEdge 将书生浦语&#xff08;InternLM&#xff09;大模型部署在本地&#xff0c;并与 Obsidian 笔记软件集成&#xff0c;从而在笔记软件中直接利用大模型实现文本总…...

深入理解Softmax函数及其在PyTorch中的实现

Softmax函数简介 Softmax函数在机器学习和深度学习中&#xff0c;被广泛用于多分类问题的输出层。它将一个实数向量转换为概率分布&#xff0c;使得每个元素介于0和1之间&#xff0c;且所有元素之和为1。 Softmax函数的定义 给定一个长度为 K K K的输入向量 z [ z 1 , z 2 …...

JGraphT 在 Spring Boot 中的应用实践

1. 引言 1.1 什么是 JGraphT JGraphT 是一个用于处理图数据结构和算法的 Java 库,提供了丰富的图类型和算法实现。 1.2 为什么使用 JGraphT 丰富的图类型:支持简单图、多重图、伪图等多种图类型。强大的算法库:提供最短路径、最小生成树、拓扑排序等多种算法。易于集成:…...

java导入excel更新设备经纬度度数或者度分秒

文章目录 一、背景介绍二、页面效果三、代码0.pom.xml1.ImportDevice.vue2.ImportDeviceError.vue3.system.js4.DeviceManageControl5.DeviceManageUserControl6.Repeater7.FileUtils8.ResponseModel9.EnumLongitudeLatitude10.词条 四、注意点本人其他相关文章链接 一、背景介…...

视频设备轨迹回放平台EasyCVR远程监控体系落地筑牢国土监管防线

一、背景概述 我国土地资源遭违法滥用的现象愈发严峻&#xff0c;各类土地不合理利用问题频发。不当的土地开发不仅加剧了地质危害风险&#xff0c;导致良田受损、森林资源的滥伐&#xff0c;还引发了煤矿无序开采、城市开发区违建等乱象&#xff0c;给国家宝贵的土地资源造成…...

tree-sitter 的 grammar.js 编写方法

tree-sitter 的 grammar.js 编写方法 一、grammar.js 的作用是什么&#xff1f;二、基本结构三、关键词解释四、编写小技巧1. 起点是 source_file2. 所有规则名&#xff08;如 identifier, number&#xff09;都是 $ > ...3. 正则表达式用于定义词法规则&#xff08;终结符&…...

Git 实践笔记

这里写自定义目录标题 一、将当前改动追加到某次commit上二、git 强制修改分支位置 一、将当前改动追加到某次commit上 stash工作区中的当前改动 git stash假设需要修改的commit是 f744c32&#xff0c;将HEAD移动到需要改动的commit的父提交上 git rebase f744c32^ --interact…...

【特权FPGA】之数码管

case语句的用法&#xff1a; 计数器不断的计数&#xff0c;每一个num对应数码管一种数据的输出。实例通俗易懂&#xff0c;一目了然。 timescale 1ns / 1ps// Company: // Engineer: // // Create Date: // Design Name: // Module Name: // Project Name: //…...

Stable Diffusion 四重调参优化——项目学习记录

学习记录还原&#xff1a;在本次实验中&#xff0c;我基于 Stable Diffusion v1.5模型&#xff0c;通过一系列优化方法提升生成图像的质量&#xff0c;最终实现了图像质量的显著提升。实验从基础的 Img2Img 技术入手&#xff0c;逐步推进到参数微调、DreamShaper 模型和 Contro…...

遇到git提交报错:413

是因为提交文件过大导致内存溢出。 解决方法&#xff1a; 假设您的提交历史如下&#xff1a; Apply to .gitignore abcd123 当前提交 efgh456 包含node_modules的提交 ijkl789 较早的正常提交 您可以&#xff1a; 回退到添加node_modules之前的提交&#xff1a; bash App…...

关于nacos注册的服务的ip异常导致网关路由失败的问题

文章目录 关于nacos注册的服务的ip异常导致网关路由失败的问题相关处理方案为方案一:手动指定服务注册的 IP 地址方法二&#xff1a;设置优先使用的网络段方法三&#xff1a;指定网络接口方法四&#xff1a;忽略特定的网卡 备注 关于nacos注册的服务的ip异常导致网关路由失败的…...

大模型在初治CLL成人患者诊疗全流程风险预测与方案制定中的应用研究

目录 一、绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与慢性淋巴细胞白血病相关知识 2.1 大模型技术原理与特点 2.2 慢性淋巴细胞白血病的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模…...

【C++游戏引擎开发】第9篇:数学计算库GLM(线性代数)、CGAL(几何计算)的安装与使用指南

写在前面 两天都没手搓实现可用的凸包生成算法相关的代码&#xff0c;自觉无法手搓相关数学库&#xff0c;遂改为使用成熟数学库。 一、GLM库安装与介绍 1.1 vcpkg安装GLM 跨平台C包管理利器vcpkg完全指南 在PowerShell中执行命令&#xff1a; vcpkg install glm# 集成到系…...

408 计算机网络 知识点记忆(8)

前言 本文基于王道考研课程与湖科大计算机网络课程教学内容&#xff0c;系统梳理核心知识记忆点和框架&#xff0c;既为个人复习沉淀思考&#xff0c;亦希望能与同行者互助共进。&#xff08;PS&#xff1a;后续将持续迭代优化细节&#xff09; 往期内容 408 计算机网络 知识…...