Kubernetes:环境搭建

news2024/11/18 7:46:26

文章目录

    • 1、k8s 概念
      • 1.1、基本概念
      • 1.2、基本术语
    • 2、k8s 架构
      • 2.1、k8s 节点
      • 2.2、k8s 组件
        • 2.2.1、master 组件
        • 2.2.2、node 组件
    • 3、k8s 集群安装配置
      • 3.1、docker
      • 3.2、主机环境调整
      • 3.3、安装 kube 工具
      • 3.4、Master 节点初始化
      • 3.5、node 节点初始化
      • 3.6、重置节点
    • 4、k8s 集群升级
      • 4.1、升级 Master 节点
      • 4.2、升级 node 节点

1、k8s 概念

1.1、基本概念

Kubernetes 是谷歌开源的基于容器技术的分布式架构方案,用于管理容器化的工作负载和服务,促进声明式配置和自动化。

Kubernetes 的功能有

  • 服务发现和负载均衡:使用 ip 地址或 dns 名称来暴露容器,并实现负载均衡分配网络流量
  • 部署和回滚:通过配置文件描述容器的期望状态,支持回滚到指定部署版本
  • 弹性伸缩:可根据指标配置自动伸缩策略,以应对突发流量
  • 容器配额管理:允许为每个容器指定所需的CPU和内存
  • 故障发现和自我修复:监控容器的运行状态,并尝试重启替换状态异常的容器
  • 密钥和配置管理:secret 和 configMap,两种资源来分别管理密钥信息和配置信息
  • 支持多种数据卷类型:例如:本地存储、公有云提供商、分布式存储系统等

1.2、基本术语

Pod

pod:最小可部署单元,调度的最小基本单位,代表集群上正在运行的一个进程。

k8s 为每个 pod 分配唯一的 pod ip,每个 pod 有一个 pause 容器( 根容器)。pod 内的多个容器,共享 pause 容器的 ip 和 volume;同时 pause 容器的状态代表整个 pod 的状态。

Label

label:kv 键值对,通过给指定资源对象绑定 label 来实现对资源对象的分组管理。

通过 label 为资源对象贴上相对应的标签,然后通过 Label Selector(标签选择器)查询和筛选拥有某些 label 的资源对象。

例如:

# 标签选择器
selector:  
# 1、标签匹配
matchLabels: 
  app: myweb # 选择标签 key-app,value-myweb 资源
 # 2、表达式匹配
matchExpressions:
  # 选择标签 key-tier, value-in (frontend, backend) 
  - {key: tier, operator: In, values: [frontend,backend]} 
  # 或使用以下写法,操作:In, NotIn, Exists and DoesNotExist
  - key: tier
    operator: In 
    values: ["frontend","backend"]

RC

Repliacation Controller,RC 副本控制器。保持 pod 的副本数量与预期数量一致。deployment 内部包含该功能,所以不推荐使用。

RS

Replica Set,RS 副本控制器。RC 的升级版本,区别在于:

  • RC 的 Label Selector 仅支持基于等式的表达式,RS 的 Label Selector 可以支持基于集合的表达式。
  • 在线编辑后,RS 自动更新 pod,RC 不会自动更新现有 pod。

Deployment

deployment:部署,副本控制器,用于更好的解决 pod 的部署、升级、回滚等问题。内部会自动创建 RS 用于pod 的副本控制。

deployment 相较于 RC/RS 具有以下优势:

  • deployment 资源对象会自动创建 RS 资源对象来完成部署,对 deployment 的修改并发布会产生新的 RS 资源对象,为新的发布版本服务。
  • 支持查看部署进度,以确定部署操作是否完成
  • 更新 deployment,会触发部署从而更新 pod
  • 支持 pause | resume 操作,暂停后修改不会触发发布,恢复后发布新的 deployment
  • 支持回滚操作
  • 支持重新启动操作,触发 pod 更新。
  • 自动清理不需要的 RS

StatefulSet

StatefulSet:管理有状态应用的 pod,例如 Kafka 集群、Mysql 集群、MongoDB集群等。与无状态的服务不同的是:无论怎么调度,每个 pod 都有一个永久不变的ID。

面向无状态的应用:RC、Deployment、DaemonSet、Job等。

DaemonSet

副本控制器,每个节点只运行一个 pod 副本。区分 deployment 多副本。

应用:每个节点上运行集群守护进程、日志收集守护进程和监控守护进程。

Service

Service:微服务,将运行在一组 pods 上的应用程序公开为网络服务。通过 service 资源对象定义一个 service 的访问入口地址 。前端应用通过访问这个入口,从而访问其背后的一组有 pod 副本组成的集群实例。service 所针对的目标 pods 集合通常通过 label selector来确定。service 一旦被定义,就被分配了一个不可变更的 cluster ip,在整个 service的生命周期内,该 ip 地址都不会发生改变。

在这里插入图片描述

Namespace

namespace:命名空间,提供资源隔离。通过命名空间可以将同一个集群中的资源划分为相互隔离的组。同一命名空间下的资源名称必须唯一,但是不同命名空间下的资源名称可以一样。

其他概念

  • Resource:k8s 是一个高度自动化的资源控制系统,大部分概念都可以看作资源对象。
  • HPA:Horizontal Pod Autoscale,pod 横向自动伸缩。根据目标 pod 的负载变化,针对性调整目标 pod 的副本数量。
  • Job:工作任务
  • Volume:数据卷
  • ConfigMap:管理非机密的配置项的数据
  • Secret:管理密钥数据

2、k8s 架构

在这里插入图片描述

2.1、k8s 节点

k8s 集群由 master 节点和 node 节点组成

  • master 节点:集群控制节点,为集群做出全局决策,不运行任何工作负载。
  • node 节点:集群工作 worker 节点

2.2、k8s 组件

master 节点运行 master 组件 + node 组件,node 节点只运行 node 组件。

2.2.1、master 组件

  • kube-controller-manager:负责运行控制器进程。包括节点控制器、任务控制器、端点控制器、副本控制器、服务账户和令牌控制器。
  • kube-scheduler:负责监视新创建的、未指定运行节点的 pod,并选择节点来运行 pod。
  • kube-apiserver:负责公开 k8s API,处理接受请求的工作,支持高可用部署。
  • etcd:兼顾一致性与高可用的键值数据库,用来保存 k8s 集群数据。

2.2.2、node 组件

  • kubelet:节点代理,监视分配给节点的 pod
  • kube-proxy:网络代理,维护节点上的网络规则,允许 pod 网络通信
  • docker:运行容器,例:docker engine + cri-dockerd

3、k8s 集群安装配置

3.1、docker

首先安装并运行 docker。参考文章:Docker: 容器与镜像

在 docker 运行时安装 cri-dockerd

cri-dockerd 安装

# 下载
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6.amd64.tgz
# 解压到 /tmp 目录
tar -zxvf cri-dockerd-0.2.6.amd64.tgz -C /tmp
# 安装
sudo cp /tmp/cri-dockerd/cri-dockerd /usr/bin/

cri-dockerd 配置

# 获取源码
git clone https://github.com/Mirantis/cri-dockerd.git
# 将源码中systemd配置文件拷贝到相应目录
sudo cp cri-dockerd/packaging/systemd/* /etc/systemd/system/

# 配置
sudo vim /etc/systemd/system/cri-docker.service
# 在 [Service] ExecStart 配置项添加:
# --network-plugin 自定义容器网络
# --pod-infra-container-image 根容器镜像
[Service]
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7

启动服务

# 重新加载配置
sudo systemctl daemon-reload
# 设置为开机自启动
sudo systemctl enable cri-docker
# 启动服务
sudo systemctl start cri-docker
# 检查服务状态
sudo systemctl status cri-docker

3.2、主机环境调整

修改节点 docker 的 cgroup driver

由于 k8s 中 kubelet 组件默认使用的 cgroupdriver 为 systemd,所以将 docker 的 cgroup driver 为 systemd。

sudo vim /etc/docker/daemon.json
# 增加配置内容
"exec-opts": [
	"native.cgroupdriver=systemd"
]

# 重新加载配置并重启 docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

关闭防火墙

sudo systemctl stop firewalld
sudo systemctl disable firewalld

禁用 Selinux

# 查看 selinux 状态
sudo apt install selinux-utils
getenforce

# 禁用
sudo setenforce 0

禁用 swap

# 禁用交换区
sudo swapoff -a
# 打开文件注释交换区定义
sudo vim /etc/fstab
# /swap.img		none	swap	sw	0	0

# 查看交换区
free
# 显示
交换:          0           0           0

修改主机名

# 1、增加主机名与本机ip映射
sudo vim /etc/hosts
# 2、修改系统主机名
# 修改主机名
sudo hostnamectl set-hostname k8s-master1
# 查看主机名
hostname

3.3、安装 kube 工具

# 1、更新包管理索引
sudo apt-get update
# 支持 https 访问
sudo apt-get install -y apt-transport-https ca-certificates curl

# 2、下载 gpg 秘钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg

# 3、设置 k8s 镜像源
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 查看设置好的镜像源
ls /etc/apt/sources.list.d/

# 4、更新apt软件索引,并查看相关软件的可用版本
sudo apt-get update
apt-cache madison kubelet kubeadm kubectl

# 5、安装指定版本
# sudo apt-get install -y kubelet=<VERSION_STRING> kubeadm=<VERSION_STRING> kubectl=<VERSION_STRING>
sudo apt-get install -y kubelet=1.24.1-00 kubeadm=1.24.1-00 kubectl=1.24.1-00

# 6、锁定软件版本(防止自动升级)
sudo apt-mark hold kubelet kubeadm kubectl

# 7、检查kubelet状态
systemctl status kubelet

# 卸载
sudo apt-get remove kubelet kubectl kubeadm

3.4、Master 节点初始化

生成默认配置文件

kubeadm config print init-defaults > init.default.yaml

修改配置文件

vim init.default.yaml

# 1、修改节点IP地址
localAPIEndpoint.advertiseAddress: 192.168.88.132
# 2、修改套接字
nodeRegistration.criSocket: unix:///var/run/cri-dockerd.sock
# 3、修改节点名称
nodeRegistration.name: k8s-master1
# 4、修改镜像仓库地址为国内开源镜像库
imageRepository: registry.aliyuncs.com/google_containers
# 5、修改版本号
kubernetesVersion: 1.24.1
# 6、增加 podSubnet。安装 flannel 网络插件,必须在集群初始化时指定 pod 地址
# 10.244.0.0/16 为 flannel 组件 podSubnet 默认值,集群与组件配置保持一致。
networking.podSubnet: 10.244.0.0/16

拉取相关镜像

sudo kubeadm config images pull --config=init.default.yaml

初始化集群

# 通过配置文件初始化集群,建议选择配置文件初始化
sudo kubeadm init --config=init.default.yaml

初始化成功,返回提示信息:根据当前用户的类型,二选其一,执行相应的操作

普通用户执行

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

root 用户执行

export KUBECONFIG=/etc/kubernetes/admin.conf
source /etc/profile

查看集群状态

# 查看 pod
kubectl get pod -A
# 查看节点
kubectl get node
# 查看所有组件
kubectl get cs

添加 pod 网络组件

下载 flannel 网络组件定义文件 到本地,也可以将文件内容拷贝到本地新建的 flannel.yml 文件

---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
- apiGroups:
  - "networking.k8s.io"
  resources:
  - clustercidrs
  verbs:
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        #image: flannelcni/flannel-cni-plugin:v1.1.2 #for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.2
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
       #image: flannelcni/flannel:v0.20.2 #for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
       #image: flannelcni/flannel:v0.20.2 #for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate

应用资源

kubectl apply -f kube-flannel.yml

开启 kube-proxy 的 ipvs 模式

# 修改 mode: "ipvs"
kubectl edit -n kube-system cm kube-proxy
# 重启kube-proxy 守护进程
kubectl rollout restart -n kube-system daemonset kube-proxy

3.5、node 节点初始化

下列步骤同上

  • 环境安装:docker,cri-dockerd,kubeadm、kubelet、kubectl 等工具
  • 节点环境修改:修改 docker 的 cgroup driver,关闭防火墙,禁用 selinux,禁用 swap

将节点添加到集群

# master 节点执行
kubeadm token create --print-join-command
# 获得加入集群的命令
# 在命令上附加参数 --cri-socket unix:///var/run/cri-dockerd.sock,指定容器套接字
# 例如:
sudo kubeadm join 192.168.88.132:6443 --token 0dl98k.x44gmzyqy4b9h5gt --discovery-token-ca-cert-hash sha256:707002c5b13f2adc0facaf6e7b514b72dc0f8e7085925988daf5e99caf77a9c9 --cri-socket unix:///var/run/cri-dockerd.sock

3.6、重置节点

# 重置节点
sudo kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
sudo rm -rf /var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni/etc/cni/net.d $HOME/.kube/config
sudo ipvsadm --clear

# 删除网络
sudo ifconfig cni0 down
sudo ip link delete cni0

4、k8s 集群升级

升级 k8s 集群到 1.25 版本。

4.1、升级 Master 节点

kubeadm 升级

# 更新包管理器
sudo apt-get update
# 查看可用版本
apt-cache madison kubeadm

# 解除 kubeadm 软件包保留状态
sudo apt-mark unhold kubeadm
# 安装
sudo apt-get install -y kubeadm=1.25.5-00
# 设置为保留,即不自动更新
sudo apt-mark hold kubeadm

# 验证版本
kubeadm version

验证升级计划

# 验证升级计划
sudo kubeadm upgrade plan

返回的信息包括:检查可升级的版本,并查看需要手动升级的部分。

节点升级

1、升级 master 组件

根据升级计划,执行指定版本的升级命令,例如:v1.25.5

sudo kubeadm upgrade apply v1.25.5

2、升级 node 组件

2.1 & 2.2、调度保护 | 排空节点

开启调度保护,并将节点上除守护进程之外的其他进程调度到其他节点,不影响正常使用。

kubectl drain <nodename> --ignore-daemonsets
# 腾空节点
kubectl drain k8s-master1 --ignore-daemonsets
# 查看节点
kubectl get pod -A  # pod状态:pending
kubectl get node # 节点状态:SchedulingDisabled

2.3、node 组件升级

# 组件升级
sudo apt-mark unhold kubelet kubectl
sudo apt-get install -y kubelet=1.25.5-00 kubectl=1.25.5-00
sudo apt-mark hold kubelet kubectl

# 重启 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet

2.4、解除保护

kubectl uncordon <nodename>
kubectl uncordon k8s-master1

4.2、升级 node 节点

kubeadm 升级

# 更新包管理器
sudo apt-get update
# 查看可用版本
apt-cache madison kubeadm

# 解除 kubeadm 软件包保留状态
sudo apt-mark unhold kubeadm
# 安装
sudo apt-get install -y kubeadm=1.25.5-00
# 设置为保留,即不自动更新
sudo apt-mark hold kubeadm

# 验证版本
kubeadm version

节点升级

sudo kubeadm upgrade node
# master 节点操作:腾空节点,开启调度保护
kubectl drain <nodename> --ignore-daemonsets
# node 组件升级
sudo apt-mark unhold kubelet kubectl
sudo apt-get install -y kubelet=1.25.5-00 kubectl=1.25.5-00
sudo apt-mark hold kubelet kubectl
# 重启 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# master 节点操作:解除调度保护
kubectl uncordon <nodename>

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

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

相关文章

基于node.js网上蛋糕店系统的设计与实现(论文+项目源码)

随着互联网应用技术的突飞猛进。信息化广泛使用&#xff0c;已渗透到各行各业。作为代表的以网上购物商城为例。它极大地改变了人们的出行方式以及线上购物发生的转变。网上购物的需求也随着人们的个性化定制而变得相对复杂。用户量以及需求量在网上商城也带来了很多商家的考验…

c++primer第2章 变量和基本类型

文章目录第2章 变量和基本类型2.1 基本内置类型2.1.1 算术类型2.1.2 类型转换2.1.3 字面值常量2.2 变量2.2.1 变量定义2.2.2 变量声明与定义的关系2.2.3 标识符2.2.4 名字的作用域第Ⅰ部分 c基础 语法特征 类型 变量 语句 控制结构 函数补充&#xff1a;自定义数据类型(语言扩展…

Elasticsearch:如何减少 Elasticsearch 集群中的分片数量

在我之前的文章 “Elasticsearch&#xff1a;我的 Elasticsearch 集群中应该有多少个分片&#xff1f;” &#xff0c; 它描述了在我们实际操作中的分片数量的准则。在文章 “Elasticsearch&#xff1a;如何部署 Elasticsearch 来满足自己的要求” 讲述了如何部署 Elasticsearc…

Prometheus系列之Grafana 版本9.0.0 设置Email邮件报警实战

目录1. 配置文件conf/defaults.ini修改2. Grafana Web页面配置报警邮箱接收者3. 创建Dashboard4. 创建Alert的文件夹5. 设置Notification policies6. 添加Alert7. Alert Rule测试1. 配置文件conf/defaults.ini修改 将conf/defaults.ini的如下内容 ##########################…

变量提升,函数提升,暂时性死区,详细解析

变量的提升 JavaScript 在执行之前 会进行预解析 函数声明 函数体会被提升到当前作用域顶部 var的声明会提升 并赋值undefined 因为var会有一个变量提升&#xff0c;他的声明初始化会被提升&#xff0c;但是值不会被提升&#xff0c;所以控制台返回undefined 函数提升 这是…

CSS -- CSS3基础动画讲解

文章目录CSS 3动画1 动画的基本使用2 动画序列3 动画常用属性4 动画简写属性5 速度曲线细节CSS 3动画 动画(animation) 是CSS3中具有颠覆性的特征之一&#xff0c;可通过设置多个节点来精确控制一个或一组动画常用来实现复杂的动画效果。 相比较过渡&#xff0c;动画可以实现…

白银票据的原理和使用

白银票据的原理和使用白银票据(Silver Ticket)原理白银票据的使用服务账号是计算机名字$用来管理服务的账号 白银票据(Silver Ticket)原理 白银票据是伪造本该由TGS返回的ST(服务票据)&#xff0c;从而访问对应的服务 有server用户的hash就可以伪造出ST&#xff0c;且不经过K…

自重启伪遗传改良算法解决TSP问题(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 旅行商问题&#xff0c;即TSP问题&#xff08;Traveling Salesman Problem&#xff09;又译为旅行推销员问题、货郎担问题&…

Spark 3.0 - 14.ML 高斯混合聚类理论与实战

目录 一.引言 二.高斯混合模型理论 1.高斯模型 GM 2.高斯混合模型 GMM 三.高斯混合模型实践 1.数据准备 2.模型训练 3.获取多个 GM 四.总结 一.引言 前面提到的 K-means 是发现数据对应簇的硬聚类方法&#xff0c;即分配一个点其固定分配到某个簇&#xff0c;而高斯混…

三方系统集成SF(SuccessFactors),实现单点登录要点

在笔者先前的文章——《基于saml2.0的平台&#xff08;适用多种平台&#xff09;单点登录配置&#xff0c;以okta为例》中&#xff0c;详细介绍了如何把一个自开发的三方系统&#xff0c;集成到okta或者IAS平台。 经过笔者的实际工作经验&#xff0c;发现SF自己本身其实也可以…

MCU-51:初识单片机,从点亮一个灯开始

题目一、什么是单片机二、点亮一个LED灯2.1 LED原理和知识2.2 方法一2.3 方法二一、什么是单片机 单片机又称单片微控制器&#xff0c;把一整个计算机系统集成到一个芯片上&#xff0c;当于一个微型的计算机&#xff0c;和计算机相比&#xff0c;单片机只缺少了I/O设备。一块芯…

文字语义纠错技术探索与实践-张健

背景 文本语义纠错的使用场景非常广泛&#xff0c;基本上只要涉及到写作就有文本纠错的需求。书籍面市前就有独立的校对的环节来保障出版之后不出现明显的问题。在新闻中我们也时不时看到因为文字审核没到位造成大乌龙的情况&#xff0c;包括上市公司在公开文书上把“临时…

并行计算(MPI + OpenMP)

文章目录并行计算MPI&#xff08;进程级并行&#xff09;基本结构数据类型点对点通信阻塞非阻塞非连续数据打包聚合通信Communicator & Cartisen GridOpenMP&#xff08;线程级并行&#xff09;简介基本制导语句worksharing constructSectionsSingleFor临界区 & 原子操…

React 学习笔记总结(三)

文章目录1. React( v16.8 版本) 生命周期2. React( v16.8 版本) 生命周期 更新流程2.1 三个更新流程2.2 setState()的生命周期流程(对应上图2号线)2.3 forceUpdate()的生命周期流程(对应上图3号线)2.4 父组件render()渲染的生命周期流程(对应上图1号线)2.5 React( v16.8 版本)生…

“学了一个我不感兴趣的专业,要不要转行IT?”

“这个专业太无聊了&#xff0c;我想转行……” “你想转去干什么&#xff1f;” “我对金融感兴趣&#xff0c;听说金融很赚钱&#xff0c;我想学金融……” “你感兴趣为什么课后不去钻研&#xff0c;而要选择打游戏&#xff1f;” “以后再慢慢来嘛……” “可是你已经…

报表工具-FineReport JS实现参数面板显示对应数据

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 预期效果 1.3 实现思路 对照填报界面的章节&#xff0c;在参数界面也用 SQL 语句实现对应数据的展示 &#xff0c;当第一次打开模板时&#xff0c;标签不显示可以通过JS 控制实现。 2. 示例 2.1 新建模板 新建普通…

设计模式-牛刀小试01

前言 本文为datawhale2022年12月组队学习《大话设计模式》task4打卡学习&#xff0c;本次完成homework1。 【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern 一、任务描述 1.1 背景 小李已经是一个工作一年的初级工程师了&#xff0c;他所在的公司是…

靶机练习——vulnstack1

下载地址&#xff1a;http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 注意事项 密码一定要设置为不同的 部署环境 根据红日安全出具的wp&#xff0c;我们只需要设置两个C段即可&#xff0c;分别是外网的72和内网的52&#xff0c;这里直接添加新的网络以及子网地址即可&…

十三、DockerFile构建增强版本centos7

1、概述 在Docker 常用命令篇中&#xff0c;我们已经知道了2中构建镜像的方式 export\import 和 commit方式。这两种方式都需要先运行并创建容器&#xff0c;然后在容器中安装vim、ifconfig等命令&#xff0c;然后再重新构建加强版的镜像&#xff0c;比较麻烦。Dockerfile通过…

2022CTF培训(九)MIPS PWN环境搭建MIPS PWN入门

附件下载链接 环境搭建 在 ARM PWN 环境搭建 的基础上&#xff0c;首先安装具备MIPS交叉编译gcc与MIPS程序动态链接库&#xff1a; sudo apt-get install gcc-mips-linux-gnu sudo apt-get install gcc-mipsel-linux-gnu sudo apt-get install gcc-mips64-linux-gnuabi64 su…