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

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录

    • Docker 和 k8s 简介
    • 1、kubernetes 组件及其联系
      • 1.1 Node
      • 1.2 Pod
      • 1.3 Service
    • 2、安装docker
    • 3、单节点 kubernetes 和 KubeSphere 安装
      • 3.1 安装KubeKey
      • 3.2 安装 kubernetes 和 KubeSphere
      • 3.3 验证安装结果
    • 4、集群版 kubernetes 和 KubeSphere 安装
    • 5、kubectl 常用命令
    • 6、资源编排 yaml 文件
      • 6.1 yaml 简介
      • 6.2 如何快速生成 yaml
    • 7、pod
      • 7.1 pod 简介
      • 7.2 pod 数据卷
      • 7.3 pod 拉取策略
      • 7.4 pod 重启策略
      • 7.5 pod 资源限制
      • 7.6 pod 健康检查
      • 7.7 pod 节点选择器(nodeSelector)
      • 7.8 pod 节点亲和性(nodeAffinity)
    • 8、node
      • 8.1 node简介
      • 8.2 node 污点
    • 9、controller
      • 9.1 Kubernetes Controllers 的类型
      • 9.2 如何使用 Controller 部署应用
      • 9.3 对外映射端口
      • 9.4 Deployment 升级
        • 9.4.1 升级命令
        • 9.4.2 查看 Deployment 的版本和升级状态
        • 9.4.3 查看 Deployment 的详细信息
        • 9.4.4 回滚到上一版本
        • 9.4.5 回滚到指定版本
    • 10、k8s运行java项目

Docker 和 k8s 简介

Docker和Kubernetes是两个不同的概念和技术,它们在容器化应用和容器编排方面有着不同的功能和作用。

Docker:

  • Docker是一个开源的容器化平台,用于构建、打包和运行应用程序。通过使用Docker,你可以将应用程序及其依赖项打包到一个独立的轻量级容器中,使其可以在不同的环境中进行部署。具体来说,Docker提供了容器的构建、管理和分发功能,使应用程序可以在隔离的环境中运行,同时也简化了部署和维护的过程。Docker利用容器化的方式,将应用程序与底层的操作系统隔离开来,提供了更好的可移植性和资源利用率。

Kubernetes:

  • Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种分布式系统的框架,用于通过自动化和编排容器的生命周期,实现应用程序的高可用性、弹性伸缩、服务发现和负载均衡等功能。Kubernetes提供了容器编排的能力,包括部署和管理容器、自动扩展、负载均衡、弹性伸缩、故障恢复等,使得应用程序可以在Kubernetes集群中高效和稳定地运行。

在实际应用中,通常会使用Docker来构建和打包应用程序的容器镜像,然后使用Kubernetes来部署和管理这些容器镜像,实现容器化应用程序的编排和运行。因此,Docker和Kubernetes通常是一起使用的,分别解决了容器化和容器编排的问题。

1、kubernetes 组件及其联系

1.1 Node

Node是Kubernetes集群中的工作节点,负责运行Pod,相当于集群中的主机。每个Node上运行着Kubernetes的代理组件kubelet,它负责与Master节点通信,并管理在该Node上运行的Pod。Node上还可以运行其他的辅助组件,如容器运行时Docker或CRI-O,网络插件、存储插件等。

1.2 Pod

Pod是Kubernetes的最小调度单元,它由一个或多个容器组成,共享资源并在Node上运行。Node提供了Pod运行所需的资源。Pod由控制平面中的调度器(Scheduler)将其调度到可用的Node上运行,并由Kubelet管理生命周期。Node上的kubelet负责创建、启动、监视和停止Pod中的容器。

1.3 Service

将pod的端口映射到外部,使外界可以通过 Service 来访问 pod。具体来说,Service 提供了一种抽象的入口点,它有自己的 IP 地址和端口,而不是直接暴露 Pod 的 IP 地址和端口。通过 Service,可以将流量从 Service 的 IP 和端口转发到后端 Pod 的实例。

Service 可以有以下几种类型:

  • ClusterIP默认类型,仅在集群内部可访问的虚拟 IP 地址。通过此类型的 Service,其他在集群内部的 Pod 或服务可以通过虚拟 IP 地址和 Service 的端口来访问该 Service。
  • NodePort可以供外网访问,当 Service 的类型设置为 NodePort 时,Kubernetes 在每个工作节点上选择一个随机端口,并将该端口映射到 Service 的端口。外部请求可以通过访问任意工作节点的 IP 地址和映射的端口,来访问 Service。
  • LoadBalancer可以供外网访问,且支持公有云,Kubernetes 在云平台上创建一个外部负载均衡器,并将流量从负载均衡器转发到 Service。外部负载均衡器会分配给 Service 一个外部 IP 地址,从而可以通过该 IP 地址来访问 Service。
  • ExternalName:使用 ExternalName 类型的 Service,将 Service 映射到集群外部的 DNS 名称。此类型的 Service 通常用于向集群内部的服务提供外部 DNS 名称的别名。

通过配置 spec.type 来设置 Service 类型,例如:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:type: NodePortselector:app: my-appports:- protocol: TCPport: 80targetPort: 8080nodePort: 30678 #(必须位于范围 30000-32767)

可以使用 kubectl expose 命令来快速创建和配置 Service。示例命令:

kubectl expose deployment my-deployment --name=my-service --type=NodePort --port=80 --target-port=8080

2、安装docker

docker入门

3、单节点 kubernetes 和 KubeSphere 安装

在 Linux 上以 All-in-One 模式安装 KubeSphere

3.1 安装KubeKey

KubeKey是一个服务器集群安装工具,用于快速部署和配置Kubernetes集群。它是一个基于Ansible和Kubernetes Bootstrapping工具的开源项目,旨在简化Kubernetes集群的安装和管理过程。

执行以下命令下载 KubeKey(过程有几分钟),为 kk 添加可执行权限:

export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.7 sh - chmod +x kk

在这里插入图片描述

3.2 安装 kubernetes 和 KubeSphere

因为我们选择的 kubernetes 高于 1.18版本,所以要先安装两个依赖,这个在官方文档有说明

sudo yum install -y conntrack-tools
sudo yum install -y socat

然后 执行如下命令同时安装 kubernetes 和 kubesphere (这里安装时间会很长)

./kk create cluster --with-kubernetes v1.22.12 --with-kubesphere v3.3.2

3.3 验证安装结果

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

输出信息会显示 Web 控制台的 IP 地址和端口号,默认的 NodePort 是 30880。现在,您可以使用默认的帐户和密码 (admin/P@88w0rd) 通过 :30880 访问控制台。

########################################################              Welcome to KubeSphere!           ########################################################Console: http://192.168.0.2:30880Account: adminPassword: P@88w0rdNOTES1. After you log into the console, please check themonitoring status of service components in"Cluster Management". If any service is notready, please wait patiently until all components are up and running.2. Please change the default password after login.#####################################################https://kubesphere.io             20xx-xx-xx xx:xx:xx#####################################################

登录至控制台后,您可以在系统组件中查看各个组件的状态。如果要使用相关服务,您可能需要等待部分组件启动并运行。您也可以使用 kubectl get pod --all-namespaces 来检查 KubeSphere 相关组件的运行状况。

4、集群版 kubernetes 和 KubeSphere 安装

// 关闭 防火墙systemctl stop firewalldsystemctl disable firewalld// 关闭 selinux:# 永久sed -i 's/enforcing/disabled/' /etc/selinux/config // 关闭 swpsed -ri 's/.*swap.*/#&/' /etc/fstab # 永久//  主机名:hostnamectl set-hostname <hostname>// 在 master 添加 hosts(改成对应ip和主机名):cat >> /etc/hosts << EOF
192.168.31.61 k8s-master
192.168.31.62 k8s-node1
192.168.31.63 k8s-node2
EOF// 将桥接的 IPv4 流量传递到 iptables 的链:cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOFsysctl --system//  时间同步:yum install ntpdate -yntpdate time.windows.com
// 安装 kubeadm,kubelet 和 kubectlyum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0systemctl enable kubelet

部署 Kubernetes Master
(1)在 192.168.31.61(Master)执行

 kubeadm init \
--apiserver-advertise-address=192.168.31.61 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

解释:

kubeadm init:该命令用于初始化一个新的Kubernetes主节点。
--apiserver-advertise-address=192.168.31.61:指定 Kubernetes 控制平面组件master api暴露给其他节点和客户端访问的 IP 地址。
--image-repository registry.aliyuncs.com/google_containers:指定使用的镜像仓库地址。这里使用了 registry.aliyuncs.com/google_containers 作为镜像仓库,该仓库保存了 Kubernetes 相关的镜像。
--kubernetes-version v1.17.0:指定要安装和使用的 Kubernetes 版本。这里指定了v1.17.0--service-cidr=10.96.0.0/12:指定服务网络的网段,该网段用于分配给 Kubernetes 服务(service)的虚拟 IP 地址。在本例中,服务 CIDR 被设置为10.96.0.0/12--pod-network-cidr=10.244.0.0/16:指定 Pod 网络的网段,该网段用于分配给 Pod 的虚拟 IP 地址。在本例中,Pod 网络 CIDR 被设置为10.244.0.0/16

由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。

(2)使用 kubectl 工具:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl get nodes

安装 Pod 网络插件(CNI)

 kubectl apply –f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlkubectl get pods -n kube-system

确保能够访问到 quay.io 这个 registery。如果 Pod 镜像下载失败,可以改这个镜像地址加入 s Kubernetes Node
(1)在 192.168.31.62/63(Node)执行
向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令:

 kubeadm join 192.168.31.61:6443 --token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash
sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5

5、kubectl 常用命令

kubectl常用命令

6、资源编排 yaml 文件

6.1 yaml 简介

apiVersion(API版本)
指定要使用的Kubernetes API版本。

  • apiVersion: v1:指定使用 Kubernetes 核心 API 的 v1 版本。
  • apiVersion: apps/v1:指定使用 Apps API 的 v1 版本,用于部署、副本集和状态集等应用相关功能。
  • apiVersion: batch/v1:指定使用 Batch Job API 的 v1 版本,用于定义和管理作业和定时任务。
  • apiVersion: extensions/v1beta1:指定使用 Extensions API 的 v1beta1
    版本,用于一些较旧的扩展部署资源类型,如 Ingress。

kind(类型)
kind 用于指定所定义的资源类型。下面是一些常见的 kind 参数示例:

  • kind: Pod:表示定义一个 Pod 资源,用于运行一个或多个容器的最小部署单元。
  • kind: Deployment:表示定义一个 Deployment 资源,用于管理应用程序的部署和扩缩容。
  • kind: Service:表示定义一个 Service 资源,用于提供稳定的网络访问地址和负载均衡,以与 Pod 通信。
  • kind: ConfigMap:表示定义一个 ConfigMap 资源,用于保存应用程序的配置信息。
  • kind: Secret:表示定义一个 Secret 资源,用于保存敏感信息,如密码、凭证等。
  • kind: Ingress:表示定义一个 Ingress 资源,用于管理对集群内部的 HTTP 和 HTTPS 服务的访问。

还有许多其他资源类型可供选择,每种资源类型都具有不同的用途和特点。

metadata(元数据)
提供有关资源的元数据信息,如名称、标签等。您可以为资源指定一个唯一的名称,并为其添加标签,以便更好地组织和管理资源。

spec(规格)
在此部分,您可以定义资源的详细配置信息。这取决于资源的类型。例如,在Pod资源的spec部分,您可以指定容器镜像、端口、环境变量等配置信息。

以下是一个Pod资源的简单示例:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxports:- containerPort: 80

在命令行中,可以通过以下方式使用YAML文件:

kubectl apply -f <path-to-yaml-file>

6.2 如何快速生成 yaml

举例:

kubectl create deployment web --image=nginx -o yaml --dry-run > my.yaml

kubectl create deployment web:创建名为 web 的Deployment,使用 nginx镜像作为Pod的容器。
--image=nginx:指定要使用的镜像。-o yaml:将输出的资源配置以YAML格式显示。
--dry-run:仅模拟执行操作,不会在集群中实际创建资源。> my.yaml:将输出的YAML配置保存到 my.yaml 文件中。

生成yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: webname: web
spec:replicas: 1selector:matchLabels:app: webstrategy: {}template:metadata:creationTimestamp: nulllabels:app: webspec:containers:- image: nginxname: nginxresources: {}
status: {}

7、pod

7.1 pod 简介

在Kubernetes(简称为K8s)中,Pod是最小的可部署和调度的单位。Pod是一组容器的集合,它们共享相同的网络命名空间和存储卷,并以一个单元进行部署和调度。每个Pod都被视为Kubernetes中的一个原子单位。

  • Pod的存在意义:

    抽象容器:Pod提供了对容器和应用程序的抽象,使得它们可以作为一个整体进行部署和管理。
    紧密耦合容器:Pod内的容器可以共享同一个网络和存储空间,并可通过本地通信进行交互,便于实现相关容器之间的协作和通信。

  • 与Docker容器实例的关系:

    Docker是一种开源的容器化平台,用于打包、分发和运行应用程序。Pod可以包含一个或多个Docker容器,因此可以说Pod是一个或多个Docker容器的逻辑组合和抽象。Kubernetes使用Docker来实现对容器的创建、分发和运行,利用Docker镜像作为容器的基础。Kubernetes在管理和编排方面对Docker进行了扩展,使得运行在Kubernetes中的Docker容器更加灵活和可靠。

7.2 pod 数据卷

同一个pod 中的容器是如何公用数据卷实现数据共享的,如下所示:

apiVersion: v1
kind: Pod
metadata:name: shared-volume-pod1
spec:volumes:- name: shared-dataemptyDir: {}  # 空目录数据卷containers:- name: container1image: my-imagevolumeMounts:- name: shared-datamountPath: /shared-datareadOnly: false- name: container2image: my-imagevolumeMounts:- name: shared-datamountPath: /shared-datareadOnly: false

在上述的示例中,我们定义了一个具有两个容器的Pod(shared-volume-pod1)。Pod中使用了一个空目录数据卷(emptyDir),命名为"shared-data"。两个容器(container1和container2)都挂载了这个共享数据卷,并在各自的容器内将其挂载到了相同的路径(/shared-data)。

这样,两个容器就可以通过在该路径下进行读写操作来共享数据。在上面的示例中,共享的数据卷是一个空目录,因此容器可以对该目录进行写入操作,并且该操作对另一个容器也是可见的。注意,如果需要在Pod之间实现持久化的数据共享,可以考虑使用其他类型的数据卷,例如持久卷(Persistent Volume)。

需要强调的是,共享的数据卷只对同一个Pod内的容器可见,如果需要在不同的Pod之间实现数据共享,可以考虑使用网络存储卷(Network Storage Volume),例如NFS(Network File System)等。

7.3 pod 拉取策略

  • Always(总是拉取):无论镜像是否存在于节点上,都会拉取最新的镜像。
  • IfNotPresent(默认值,如果不存在则拉取):仅当镜像不存在于节点上时,才会拉取镜像。
  • Never(从不拉取):仅当镜像已经存在于节点上时,才会使用该镜像。
  • PullIfNotPresent(如果不存在则拉取,否则使用本地镜像):首次创建Pod时,将拉取镜像;之后的创建和更新将使用本地镜像。
spec:containers:- name: my-containerimage: my-image:latestimagePullPolicy: Always 	# IfNotPresent、Never、PullIfNotPresent

7.4 pod 重启策略

  • Always(默认):当Pod中的容器退出后,Kubernetes会立即重启该容器,保持Pod一直运行。这是默认的重启策略,适用于绝大多数应用。
  • OnFailure:当Pod中的容器因为错误或异常而退出时,Kubernetes会重启容器。如果容器成功运行并退出,Pod不会被重启。适用于一些可以自恢复的应用场景。
  • Never:当Pod中的容器退出后,Kubernetes不会自动重启Pod。该策略通常用于管理具有手动生命周期的Pod,一旦容器退出,Pod将保持在非运行状态。
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:restartPolicy: Always  # 重启策略containers:- name: my-containerimage: my-image

7.5 pod 资源限制

resources 用来限制容器的内存和cpu

apiVersion: v1
kind: Pod
metadata:name: resource-limit-pod
spec:containers:- name: my-containerimage: my-imageresources:limits:cpu: "1"memory: "1Gi"requests:cpu: "500m"memory: "500Mi"

在上述示例中,limits表示容器能够使用的资源上限,即资源的最大可用量requests表示容器对资源的需求或保留量,即资源的最低要求量。Pod中的my-container容器被限制为最多使用1个CPU核心(limits.cpu),并且保证Pod被调度到具有至少0.5个CPU核心可用的节点上(requests.cpu)。

7.6 pod 健康检查

在Kubernetes中,你可以通过定义健康检查来监视和管理Pod的运行状态。健康检查可确保Pod中的容器正常运行,并及时检测和处理容器故障或不可用情况。Kubernetes支持以下两种类型的健康检查:

  • Liveness Probe存活探针):用于检测容器是否处于正常运行状态。如果存活探针失败,则Kubernetes会认定容器不可用,并根据重启策略进行相应的处理。
  • Readiness Probe就绪探针):用于检测容器是否准备好接收请求。如果就绪探针失败,则Kubernetes会将Pod从服务的负载均衡中移除,直到容器就绪。

以下是两种探针的示例:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagelivenessProbe:httpGet:path: /healthport: 8080initialDelaySeconds: 10periodSeconds: 5readinessProbe:tcpSocket:port: 8080initialDelaySeconds: 5periodSeconds: 10

上述示例中,指定了存活探针和就绪探针。存活探针通过发送HTTP GET请求来检测容器的健康状态,路径为/health,端口为8080。就绪探针使用TCP Socket来检测容器的就绪状态,端口为8080。

在配置探针时,你可以指定以下参数:

  • initialDelaySeconds:容器启动后等待多长时间开始执行第一次探测。
  • periodSeconds:连续进行两次探测之间的时间间隔。
  • successThreshold:成功探测的连续次数,任务完成后容器将被认为是可用的。
  • failureThreshold:失败探测的连续次数,任务未能完成后容器将被认为是不可用的。
  • timeoutSeconds:探测超时时间。

除了HTTP和TCP之外,Kubernetes还支持其他类型的存活探针和就绪探针。以下是一些常见的探针类型及其示例:

  • Exec Probe(执行探针):通过在容器内执行命令来检测容器的健康和就绪状态。
livenessProbe:exec:command:- cat- /var/healthy
readinessProbe:exec:command:- cat- /var/ready

上述示例中,Exec探针通过在容器内执行命令cat /var/healthy和cat /var/ready来检测容器的存活和就绪状态。

  • TCP Socket Probe(TCP套接字探针):通过尝试与容器的特定端口建立TCP连接来检测容器的健康和就绪状态。
livenessProbe:tcpSocket:port: 8080
readinessProbe:tcpSocket:port: 8080

上述示例中,TCP Socket探针通过尝试与容器的8080端口建立TCP连接来检测容器的存活和就绪状态。

  • Command Probe(命令探针):直接执行命令来检测容器的健康和就绪状态。
livenessProbe:exec:command:- check-health
readinessProbe:exec:command:- check-readiness

上述示例中,Command探针通过执行自定义命令check-health和check-readiness来检测容器的存活和就绪状态。

7.7 pod 节点选择器(nodeSelector)

通过在 Pod 配置文件中添加 nodeSelector 字段,可以根据节点上的标签来选择合适的节点。调度器将根据指定的节点选择器匹配规则,将 Pod 调度到具有相匹配标签的节点上。

首先,在你的节点上添加标签。例如,下面两个节点分别添加到 app=dev 和 app=pro的标签上

kubectl label nodes node1 app=dev
kubectl label nodes node2 app=dev
kubectl label nodes node3 app=pro
kubectl label nodes node4 app=pro

例如,在 Pod 的配置文件中使用 nodeSelector 可以这样指定将 Pod 调度到具有 app=dev标签的节点上:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagenodeSelector:app: dev

那么,这个pod创建的实例将被调度到 env=dev标签的某个 node 节点上

注:启动 nodeSelector 下面的标签名是自定义的,可以是 app 也可以是 anv、abc等。

7.8 pod 节点亲和性(nodeAffinity)

Pod 节点亲和性(Node Affinity)是一种机制,用于在 Kubernetes 中指定 Pod 应该调度到具有特定标签的节点上。通过使用亲和性规则,可以对节点进行更精确的选择,并将 Pod 分配到合适的节点上。

  • 硬性亲和性(Hard Affinity):使用硬性亲和性规则,强制将 Pod
    调度到具有指定标签的节点上。只有符合指定亲和性规则的节点才会被考虑。
  • 软性亲和性(Soft Affinity):使用软性亲和性规则,尽量将 Pod
    调度到具有指定标签的节点上。如果找不到符合亲和性规则的节点,Pod 也可以被调度到其他节点上。

亲和性规则可以通过以下两个属性进行定义:

  • requiredDuringSchedulingIgnoredDuringExecution:定义了硬性亲和性规则,要求将 Pod
    调度到具有指定标签的节点上。
  • preferredDuringSchedulingIgnoredDuringExecution:定义了软性亲和性规则,尽量将 Pod
    调度到具有指定标签的节点上,但不是必须的。

以下是一个示例,演示了如何使用亲和性规则在 Pod 配置中指定节点亲和性:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: appoperator: Invalues:- web- app

在这个示例中,我们将 Pod 的亲和性设置为硬性规则,并要求将 Pod 调度到具有 app=web 或 app=app 标签的节点上。

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 50preference:matchExpressions:- key: appoperator: Invalues:- web

在这个示例中,我们将 Pod 的亲和性设置为软性规则。我们使用 preferredDuringSchedulingIgnoredDuringExecution 属性来指定软亲和性规则。

在本例中,我们使用 weight 属性为规则指定了一个权重值为 50。这个权重值表示了调度器在调度 Pod 时对这个规则的偏好程度。较高的权重值表示较高的偏好。

我们还使用 preference.matchExpressions 来定义一个节点选择器规则,要求将 Pod 调度到具有 app=web 标签的节点上。但请注意,这是一个软性规则,如果找不到具有这样的节点,Pod 也可以被调度到其他节点上

8、node

8.1 node简介

Node 是指运行着容器化应用程序的物理或虚拟机器。Node 是 Kubernetes 集群中的工作节点,也被称为 Minion。
Node 是运行着容器化应用程序的工作节点,在 Kubernetes 集群中承担着运行、管理和提供服务的角色,Kubernetes 通过管理 Node,实现了应用程序容器的高可用性、可扩展性和弹性。

8.2 node 污点

节点污点(Node Taint)是一种在 Kubernetes 中用于标记节点的机制。通过给节点设置污点,可以影响 Pod 调度行为,限制哪些 Pod 可以调度到该节点上。

节点污点由两个部分组成:键和值。它们一起形成一个污点,用于标记节点。节点上可以设置多个污点,以便更精确地控制 Pod 的调度。

当节点设置了污点时,只有那些设置了相应的容忍(Toleration)规则的 Pod 才能被调度到该节点上。如果 Pod 没有匹配的容忍规则,则调度器会视其为不可调度的。

以下是一个设置节点污点的示例:

kubectl taint nodes <node-name> <taint-key>=<taint-value>:<taint-effect>

node-name: 是要设置污点的节点名称。
taint-key:是污点键的名称。
taint-value:是污点键的值。
taint-effect:是污点的效果。

污点的效果可以是以下三种之一:

  • NoSchedule:该节点一定不会被调度。
  • PreferNoSchedule:该节点尽量不被调度。
  • NoExecute:该节点一定不会被调度外,还会驱逐已经运行在节点上的Pod。

以下是一个设置节点污点的示例命令:

kubectl taint nodes node1 key1=value1:NoSchedule

这个命令将名为 node1 的节点上设置了一个键值为 key1=value1 的污点,并将其效果设置为 NoSchedule,这样没有相应容忍规则的 Pod 将无法调度到该节点上。

9、controller

9.1 Kubernetes Controllers 的类型

Kubernetes 提供了几种类型的 Controller,以下是最主要和最常用的可以用于部署和管理应用的 Controller:

  • ReplicaSet: ReplicaSet Controller确保在任何时候都有一定数量的Pod副本在运行。如果有太多的副本,它会开始杀掉多余的。如果副本数太少,它会启动更多的副本。
  • Deployment: Deployment Controller 在 ReplicaSet的基础上扩展,增加了版本控制和滚动升级的功能。你可以定义新的 Deployment 版本并逐渐将旧的 Pod 更换为新版本。
  • StatefulSet: StatefulSet Controller 用于管理有状态的应用,如数据库。与 Deployment不同的是,StatefulSet 启停顺序是严格有序的,并且每个 Pod 有持久化的唯一标识。
  • DaemonSet: DaemonSet Controller 确保每一个节点上都运行一个 Pod的副本,一般用于运行日志收集、监控等节点级别的后台服务。
  • Job 和 CronJob: Job Controller 确保任务能够完成,CronJob Controller则可以在指定时间周期内完成运行。

9.2 如何使用 Controller 部署应用

以 Deployment Controller 为例,我们可以创建以下 YAML 文件部署一个简单的 Nginx:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80

使用下面的命令部署应用:

kubectl apply -f nginx-deployment.yaml

9.3 对外映射端口

一旦部署了你的 Deployment,你可能需要让外部流量能够访问你的应用。这就需要使用 Service 来实现。例如,以下的 Service 将能够将流量从节点的端口30678转发到你的应用:

apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:type: NodePortports:- protocol: TCPport: 80targetPort: 8080nodePort: 30678 #(必须位于范围 30000-32767)selector:app: nginx

使用下面的命令创建 Service:

kubectl apply -f nginx-service.yaml

protocol: TCP:指定服务使用的协议为 TCP。

port: 80:定义了服务(service)在集群内的端口,这是对外公开的端口。

targetPort: 8080:指定了服务将流量转发到后端 Pod 时使用的目标端口。

nodePort: 30678:指定了服务在每个节点(node)上打开的端口,以供从集群外部通过节点的 IP 地址和此端口访问服务。

现在,你可以通过任意 Node 的 30678 端口访问你的 Nginx 应用。所以你可以通过访问 节点IP地址:30678 来访问端口为 80 的 Service。Service 会将流量转发到与其标签选择器匹配的 Pod 上的 8080 端口处运行的应用程序。

9.4 Deployment 升级

9.4.1 升级命令

kubectl set image deployment <deployment-name> <container-name>=<new-image>

示例:kubectl set image deployment my-nginx nginx=nginx:1.15
在这里插入图片描述
从上面可以看出 nginx:1.15 正在启动中,原来的版本还在运行中,过一会儿查看只有一个pod了在这里插入图片描述执行逻辑:首先会去远程拉取镜像到本地docker镜像仓库,然后启动nginx:1.15并停掉之前的版本。

9.4.2 查看 Deployment 的版本和升级状态

kubectl rollout history deployment <deployment-name>
kubectl rollout status deployment <deployment-name>

示例:
kubectl rollout history deployment my-nginx
kubectl rollout status deployment my-nginx在这里插入图片描述

9.4.3 查看 Deployment 的详细信息

kubectl describe deployment <deployment-name>

示例:
在这里插入图片描述

9.4.4 回滚到上一版本

kubectl rollout undo deployment <deployment-name>

示例:kubectl rollout undo deployment my-nginx

在这里插入图片描述

9.4.5 回滚到指定版本

kubectl rollout undo deployment <deployment-name> --to-revision=<revision>

示例:kubectl rollout undo deployment my-nginx --to-revision=2
在这里插入图片描述

10、k8s运行java项目

1、先创建Dockerfile

 FROM openjdk:8-jdk-alpineWORKDIR /appCOPY target/my-project.jar /app/my-project.jarEXPOSE 8080ENTRYPOINT ["java","-jar","/app/my-project.jar"]

2、打包项目上传到服务器、在Dockerfile目录下执行以下命令来基于 Dockerfile 构建 Docker 镜像

docker build -t my-java-app .

3、推送 Docker 镜像到远程仓库,这里以阿里云仓库为例

docker login --username=盛万坪 registry.cn-hangzhou.aliyuncs.com
# 然后输入密码docker tag seres-gateway:v1 registry.cn-hangzhou.aliyuncs.com/dev_swp/my_ubuntu
docker push registry.cn-hangzhou.aliyuncs.com/dev_swp/my_ubuntu# seres-gateway:v1 本地仓库镜像:版本
# registry.cn-hangzhou.aliyuncs.com/dev_swp/my_ubuntu 分别对应阿里云docker仓库地址,命名空间,仓库名

4、创建一个 Deployment 的配置文件 - deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-java-applabels:app: my-java-app
spec:replicas: 1selector:matchLabels:app: my-java-apptemplate:metadata:labels:app: my-java-appspec:containers:- name: my-java-appimage: yourdockerhubusername/my-java-app:1.0ports:- containerPort: 8080
kubectl apply -f deployment.yaml

5、Service 以暴露你的 Java 应用
创建一个 service.yaml 文件:

apiVersion: v1
kind: Service
metadata:name: my-java-app-service
spec:selector:app: my-java-appports:- protocol: TCPport: 8080targetPort: 8080nodePort: 30080type: NodePort
kubectl apply -f service.yaml

相关文章:

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录 Docker 和 k8s 简介1、kubernetes 组件及其联系1.1 Node1.2 Pod1.3 Service 2、安装docker3、单节点 kubernetes 和 KubeSphere 安装3.1 安装KubeKey3.2 安装 kubernetes 和 KubeSphere3.3 验证安装结果 4、集群版 kubernetes 和 KubeSphere 安装5、kubectl 常用命令6、资…...

Oracle的学习心得和知识总结(二十九)|Oracle数据库数据库回放功能之论文三翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…...

新版100句学完7000雅思单词

新版100句学完7000雅思单词 1. As the medical world continues to grapple with what’s acceptable and what’s not, it is clear that companies must continue to be heavily scrutinized for their sales and marketing strategies.(剑桥雅思6) 随着医学界持续努力解决…...

MATLAB图论合集(三)Dijkstra算法计算最短路径

本贴介绍最短路径的计算&#xff0c;实现方式为迪杰斯特拉算法&#xff1b;对于弗洛伊德算法&#xff0c;区别在于计算了所有结点之间的最短路径&#xff0c;考虑到MATLAB计算的便捷性&#xff0c;计算时只需要反复使用迪杰斯特拉即可&#xff0c;暂不介绍弗洛伊德的实现 迪杰斯…...

MySQL 8.0.xx 版本解决group by分组的问题

因为版本升级5.7版本以下是没有这个问题的&#xff0c;8.0版本以上会出现分组问题 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column test1.sys_t.id which is not functionally dependent on columns in GROUP BY clause; t…...

设计模式—原型模式(Prototype)

目录 一、什么是原型模式&#xff1f; 二、原型模式具有什么优缺点吗&#xff1f; 三、有什么缺点&#xff1f; 四、什么时候用原型模式&#xff1f; 五、代码展示 ①、简历代码初步实现 ②、原型模式 ③、简历的原型实现 ④、深复制 ⑤、浅复制 一、什么是原型模式&…...

【pytorch】Unfold和Fold的互逆操作

1. 参数定义 Unfold https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html#torch.nn.Unfold Fold https://pytorch.org/docs/stable/generated/torch.nn.Fold.html#torch.nn.Fold 注意&#xff1a;参数当中的padding是在四周边补零&#xff0c;而当fold后的尺寸…...

【AI】《动手学-深度学习-PyTorch版》笔记(二十一):目标检测

AI学习目录汇总 1、简述 通过前面的学习,已经了解了图像分类模型的原理及实现。图像分类是假定图像中只有一个目标,算法上是对整个图像做的分类。 下面我们来学习“目标检测”,即从一张图像中找出需要的目标,并标记出位置。 2、边界框 边界框:bounding box,就是一个方…...

畅捷通T+用户中locked勒索病毒后该怎么办?勒索病毒解密数据恢复

Locked勒索病毒是一种近年来在全球范围内引起广泛关注的网络安全威胁程序。它是一种加密货币劫持病毒&#xff0c;专门用于加密用户的数据并要求其支付赎金。Locked勒索病毒通过攻击各种系统漏洞和网络薄弱环节&#xff0c;使用户计算机受到感染并被加密锁定时&#xff0c;无法…...

神仙般的css动画参考网址,使用animate.css

Animate.css | A cross-browser library of CSS animations.Animate.css is a library of ready-to-use, cross-browser animations for you to use in your projects. Great for emphasis, home pages, sliders, and attention-guiding hints.https://animate.style/这里面有很…...

江西抚州新能源汽车3d扫描零部件逆向抄数测量改装-CASAIM中科广电

汽车改装除了在外观方面越来越受到消费者的青睐&#xff0c;在性能和实用性提升上面的需求也是日趋增多&#xff0c;能快速有效地对客户指定汽车零部件进行一个改装&#xff0c;是每一个汽车改装企业和工程师的追求&#xff0c;也是未来消费者个性化差异化的要求。下面CASAIM中…...

数据结构学习 --4 串

数据结构学习 --1 绪论 数据结构学习 --2 线性表 数据结构学习 --3 栈&#xff0c;队列和数组 数据结构学习 --4 串 数据结构学习 --5 树和二叉树 数据结构学习 --6 图 数据结构学习 --7 查找 数据结构学习 --8 排序 本人学习记录使用 希望对大家帮助 不当之处希望大家帮忙纠正…...

探索Kotlin K2编译器和Java编译器的功能和能力

文章首发地址 Kotlin K2编译器是Kotlin语言的编译器&#xff0c;负责将Kotlin源代码转换为Java字节码或者其他目标平台的代码。K2编译器是Kotlin语言的核心组件之一&#xff0c;它的主要功能是将Kotlin代码编译为可在JVM上运行的字节码。 K2编译器快速介绍 编译过程&#xff…...

如何安装chromadb

下载最新版本的python3.10 因为chromadb需要sqlite3的最小版本是3.35.0 使用如下命令安装 pip install chromadb 安装完毕后在python3的命令行窗口输入 import chromadb 如果不报错代表成功&#xff0c;如果报错sqlite3的最小版本是3.35.0&#xff0c;使用如下方式解决 …...

vue实现把字符串中的所有@内容,替换成带标签的

前言&#xff1a; 目前有个需求是&#xff0c;要把输入框里面的还有姓名高亮。 要求&#xff1a; 1、必须用 v-html ,带标签的给他渲染 2、把字符串中的全部查找出来&#xff0c;替换掉&#xff0c;注意要过滤已经替换好的&#xff0c;不然就是无限循环了 实现方法&#xff1a…...

「MySQL-00」MySQL在Linux上的安装、登录与删除

目录 一、安装MySQL 0. 安装前请先执行一遍删除操作&#xff0c;把预装或残留的MySQL删除掉 1. 安装yum源 &#xff08;解决了在哪里找MySQL的问题&#xff09; 2. 安装哪个版本的MySQL 二、启动和登录MySQL 三、删除MySQL / MariaDB 安装与卸载前&#xff0c;建议先将用户切换…...

8月29-31日上课内容 第五章

第一章...

数据库导出工具

之前根据数据库升级需求&#xff0c;需要导出旧版本数据&#xff08;sqlserver 6.5&#xff09;&#xff0c;利用c# winfrom写了一个小工具&#xff0c;导出数据。 →→→→→多了不说&#xff0c;少了不唠。进入正题→→→→ 连接数据库&#xff1a;输入数据库信息 连接成功…...

ChatGPT 制作可视化柱形图突出显示第1名与最后1名

对比分析柱形图的用法。在图表中显示最大值与最小值。 像这样的动态图表的展示只需要给ChatGPT,AIGC,OpenAI 发送一个指令就可以了, 人工智能会快速的写出HTML与JS代码来实现。 请使用HTML,JS,Echarts完成一个对比分析柱形图,在图表中突出显示第1名和最后1名用单独一种不…...

前端学习记录~2023.8.10~JavaScript重难点实例精讲~第6章 Ajax

第 6 章 Ajax 前言6.1 Ajax的基本原理及执行过程6.1.1 XMLHttpRequest对象&#xff08;1&#xff09;XMLHttpRequest对象的函数&#xff08;2&#xff09;XMLHttpRequest对象的属性 6.1.2 XMLHttpRequest对象生命周期&#xff08;1&#xff09;创建XMLHttpRequest对象&#xff…...

2023年Java核心技术第九篇(篇篇万字精讲)

目录 十七 . 并发相关基础概念 17.1 线程安全 17.2 保证线程安全的两个方法 17.2.1 封装 17.2.2 不可变 17.2.2.1 final 和 immutable解释 17.3 线程安全的基本特性 17.3.1 原子性&#xff08;Atomicity&#xff09; 17.3.2 可见性&#xff08;Visibility&#xff09; 17.3.2.1…...

C#上位机中的单例应用思考

文章目录 一、前言二、上位机单例应用场景2.1 上位机2.2 单例及其应用2.3 上位机中的应用2.3.1 用户登录信息2.3.2 配置文件2.3.3 数据连接池 2.4 一个应用场景的思考 三、总结 一、前言 之前写过一篇关于单例的文——C#中单例模式的实现&#xff0c;讲了讲单例是什么以及在C#…...

Python分享之redis

String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值&#xff0c;默认不存在则创建&#xff0c;存在则修改 r.set(name, zhangsan) 参数&#xff1a; set(name, value, exNone, pxNone, nxFalse, xxFalse) ex&#xff…...

Linux常用命令——dd命令

在线Linux命令查询工具 dd 复制文件并对原文件的内容进行转换和格式化处理 补充说明 dd命令用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的&#xff0c;对于一些比较底层的问题&#xff0c;使用dd命令往往可以得到出人意料的效果。用的比较多的还是…...

DETR-《End-to-End Object Detection with Transformers》论文精读笔记

DETR&#xff08;基于Transformer架构的目标检测方法开山之作&#xff09; End-to-End Object Detection with Transformers 参考&#xff1a;跟着李沐学AI-DETR 论文精读【论文精读】 摘要 在摘要部分作者&#xff0c;主要说明了如下几点&#xff1a; DETR是一个端到端&am…...

网络流量监控-sniffnet

{alert type“info”} 今天来分享一个监控流量的应用sniffnet。 github项目地址&#xff1a;https://github.com/GyulyVGC/sniffnet {/alert} 可以在github的readme上看到这个程序有的特性&#xff1a; 为什么要介绍它呢&#xff1a;主要是多线程、跨平台、可靠、操作简单 我…...

验证go循环删除slice,map的操作和map delete操作不会释放底层内存的问题

目录 切片 for 循环删除切片元素其他循环中删除slice元素的方法方法1方法2&#xff08;推荐&#xff09;方法3 官方提供的方法结论 切片 for 循环删除map元素goalng map delete操作不会释放底层内存go map原理源码CRUD查询新增 操作注意事项map元素是无法取址的map是线程不安全…...

C++二级题2

数字字符求和 #include<iostream> #include<string.h> #include<stdio.h> #include<iomanip> #include<cmath> #include<bits/stdc.h> int a[2000][2000]; int b[2000]; char c[2000]; long long n; using namespace std; int main() {ci…...

DataWhale 机器学习夏令营第三期——任务二:可视化分析

DataWhale 机器学习夏令营第三期 学习记录二 (2023.08.23)——可视化分析1.赛题理解2. 数据可视化分析2.1 用户维度特征分布分析2.2 时间特征分布分析 DataWhale 机器学习夏令营第三期 ——用户新增预测挑战赛 学习记录二 (2023.08.23)——可视化分析 2023.08.17 已跑通baseli…...

ubuntu 上安装flutter dart android studio

因为国内网站不能使用 使用一下&#xff1a; vi ~/.bashrc 最后添加 export FLUTTER_STORAGE_BASE_URLhttps://mirrors.cloud.tencent.com/flutter export PUB_HOSTED_URLhttps://mirrors.tuna.tsinghua.edu.cn/dart-pub export PATH$PATH:/usr/local/go/bin export GOPROXY…...

【Golang】go交叉编译

交叉编译是用来在一个平台上生成另一个平台的可执行程序 。Go 命令集是原生支持交叉编译的。 Mac下编译&#xff1a;Linux 或 Windows 的可执行程序 # linux 可执行程序 CGO_ENABLED0 GOOSlinux GOARCHamd64 go build main.go # Windows可执行程序 CGO_ENABLED0 GOOSwindow…...

【人工智能】—_贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

文章目录 频率学派 vs. 贝叶斯学派贝叶斯学派Probability&#xff08;概率&#xff09;:独立性/条件独立性&#xff1a;Probability Theory&#xff08;概率论&#xff09;:Graphical models &#xff08;概率图模型&#xff09;什么是图模型&#xff08;Graphical Models&…...

学习笔记:ROS使用经验( 查看rostopic的信息)

查看topic的信息 要查看ROS中的话题信息&#xff0c;你可以使用以下命令&#xff1a; 1.查看所有活动话题&#xff1a; $ rostopic list这将列出当前运行的所有活动话题。 2.查看特定话题的消息类型&#xff1a; $ rostopic info <topic_name>将<topic_name>替…...

数据库——redis内存淘汰,持久化机制

文章目录 Redis 内存淘汰机制了解么&#xff1f;⭐了解操作系统中lru并尝试用java实现lru 2.Redis 持久化机制(怎么保证 Redis 挂掉之后再重启数据可以进行恢复)快照&#xff08;snapshotting&#xff09;持久化&#xff08;RDB&#xff09;AOF&#xff08;append-only file&am…...

亚马逊云科技 云技能孵化营 我也说ai

自从chatgpt大火以后&#xff0c;我也关注了人工智能方面的东西&#xff0c;偶尔同学推荐参加了亚马逊云科技云技能孵化营活动&#xff0c;免费学习了亚马逊云科技和机器学习方面的知识&#xff0c;还获得了小礼品&#xff0c;现在将活动及心得分享给大家。 活动内容&#xff…...

『PyQt5-基础篇』| 04 Qt Designer的初步快速了解

04 Qt Designer的初步快速了解 1 Qt Designer入口2 Qt Designer-Widget Box2.1 窗口部件盒(Widget Box)2.2 Layouts布局2.3 Spacers间隔部件2.4 Button按钮2.5 Item Views(Model-Based)2.6 Item Widgets(Item-Based)2.7 Containers容器2.8 Input Widget输入部件2.9 Display W…...

SpringCloud学习笔记(十一)_Hystrix仪表盘

我们来看一下如何使用它吧 1.引入依赖 1 2 3 4 5 6 7 8 9 10 11 12 | <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </depende…...

# ruby安装设置笔记

ruby安装设置笔记 文章目录 ruby安装设置笔记1 克隆并设置环境变量2 安装ruby3 设置ruby4 设置源5 安装bundler6 检查安装后的软件版本7 ubuntu 20.04 默认ruby环境 系统自带的ruby版本低了&#xff0c;需要手动安装更高版本&#xff08;使用rbenv方式&#xff09; 环境&#x…...

关于对文件路径权限判断的记录

首先需要添加引用 using System.Security.AccessControl;以下为具体代码&#xff0c;其中fileServerPath为需要判断的文件路径 #region Authority judgmentDirectorySecurity fileAcl Directory.GetAccessControl(fileServerPath);var rules fileAcl.GetAccessRules(true, t…...

git 基础

1.下载安装Git&#xff08;略&#xff09; 2.打开git bash窗口 3.查看版本号、设置用户名和邮箱 用户名和邮箱可以随意起&#xff0c;与GitHub的账号邮箱没有关系 4.初始化git 在D盘中新建gitspace文件夹&#xff0c;并在该目录下打开git bash窗口 git init 初始化完成后会…...

C语言网络编程实现广播

1.概念 如果同时发给局域网中的所有主机&#xff0c;称为广播 我们可以使用命令查看我们Linux下当前的广播地址&#xff1a;ifconfig 2.广播地址 以192.168.1.0 (255.255.255.0) 网段为例&#xff0c;最大的主机地址192.168.1.255代表该网段的广播地址&#xff08;具体以ifcon…...

js对url进行编码解码(三种方式)

第一种&#xff1a;escape 和 unescape escape()不能直接用于URL编码&#xff0c;它的真正作用是返回一个字符的Unicode编码值 它的具体规则是&#xff0c;除了ASCII字母、数字、标点符号" * _ - . /"以外&#xff0c;对其他所有字符进行编码。在u0000到u00ff之间…...

React面向组件编程

往期回顾&#xff1a;# React基础入门之虚拟Dom【一】 面向组件编程 react是面向组件编程的一种模式&#xff0c;它包含两种组件类型&#xff1a;函数式组件及类式组件 函数式组件 注&#xff1a;react17开始&#xff0c;函数式组件成为主流 一个基本的函数组件长这个样子 …...

Linux 多线程同步机制(上)

文章目录 前言一、线程同步二、互斥量 mutex三、死锁总结 前言 一、线程同步 在多线程环境下&#xff0c;多个线程可以并发地执行&#xff0c;访问共享资源&#xff08;如内存变量、文件、网络连接 等&#xff09;。 这可能导致 数据不一致性, 死锁, 竞争条件等 问题。 为了解…...

C++学习vector

1,把list的相关函数都实现出来&#xff08;未完&#xff09; 2&#xff0c; 运行结果&#xff1a;...

17.3 【Linux】systemctl 针对 service 类型的配置文件

17.3.1 systemctl 配置文件相关目录简介 服务的管理是通过 systemd&#xff0c;而 systemd 的配置文件大部分放置于/usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出&#xff0c; 该目录的文件主要是原本软件所提供的设置&#xff0c;建议不要修改&#xff01;而要…...

融云获评「创业邦 · 最具创新价值出海服务商」

点击报名&#xff0c;9 月 21 日融云直播课 8 月 22 日 - 23 日&#xff0c;创业邦主办的“2023 DEMO WORLD 全球开放式创新大会暨企业出海未来大会”在上海举行&#xff0c;会上发布了“创业邦 2023 出海企业创新价值 100 强”&#xff0c;融云荣登榜单&#xff0c;获评“最具…...

【中危】Apache XML Graphics Batik<1.17 存在SSRF漏洞 (CVE-2022-44729)

zhi.oscs1024.com​​​​​ 漏洞类型SSRF发现时间2023-08-23漏洞等级中危MPS编号MPS-2022-63578CVE编号CVE-2022-44729漏洞影响广度极小 漏洞危害 OSCS 描述Apache XML Graphics Batik 是一个开源的、用于处理可缩放矢量图形(SVG)格式图像的工具库。 受影响版本中&#xff0…...

AssemblyManager 程序集管理器

AssemblyManager 程序集管理器 程序执行中使用反射对框架的搭建有着强大的影响&#xff0c;如何管理程序集方便使用反射获取类型操作对象是本文章的重点 1.AssemblyInfo 对于一个程序集这里使用一个AssemblyInfo对象进行管理 Assembly &#xff1a;对应的程序集AssemblyTyp…...

几个nlp的小任务(生成式任务——语言模型(CLM与MLM))

@TOC 本章节需要用到的类库 微调任意Transformers模型(CLM因果语言模型、MLM遮蔽语言模型) CLM MLM 准备数据集 展示几个数据的结构...