Kubernetes(k8s)介绍和环境部署

news2024/11/26 12:48:32

文章目录

  • Kubernetes
    • 一、Kubernetes介绍
        • 1.Kubernetes简介
        • 2.Kubernetes概念
        • 3.Kubernetes功能
        • 4.Kubernetes工作原理
        • 5.kubernetes组件
        • 6.Kubernetes优缺点
    • 二、Kubernetes环境部署
        • 环境
        • 基本配置
        • 1.所有节点安装docker
        • 2.所有节点安装kubeadm、kubelet、kubectl
          • 添加yum源
          • containerd配置
        • 3.部署Kubernetes Master(管理节点)
        • 4.安装Pod网络插件(CNI)
        • 5.加入Kubernetes Node
        • 6.测试Kubernetes 集群
    • 扩展:配置kubectl命令可以在node节点上运行

Kubernetes

一、Kubernetes介绍

1.Kubernetes简介

Kubernetes是一种开源的容器编排工具,用于管理和编排云原生应用程序。它可以协调和管理运行在多个计算机集群上的Docker容器,自动进行容器部署、更新、扩容和负载均衡等操作,以确保应用程序的可用性和高可靠性。


2.Kubernetes概念

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

NameSpace:命名空间,用来隔离pod的运行环境

3.Kubernetes功能

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷
4.Kubernetes工作原理

Kubernetes的工作原理可以简单地概括为:通过API服务器、etcd和调度器等组件,将容器化的应用程序部署到集群中的工作节点上,并保证他们按照用户定义的方式运行和提供服务。简单来说,Kubernetes利用了多个工作节点(node)进行应用的部署和运行,使用Pod来封装容器。Pod中包含一个或多个紧密耦合的容器,可以共享网络和存储资源,Pod可以水平扩展,当一个或多个Pod失败时,可以进行自动替换。Kubernetes还提供了负载均衡、服务发现和伸缩等功能,以帮助应用程序更好地运行和扩展。

5.kubernetes组件

一个kubernetes集群主要是由控制节点(master)工作节点(node) 构成,每个节点上都会安装不同的组件。

master:集群的控制平面,负责集群的决策 ( 管理 )

ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

Etcd :负责存储集群中各种资源对象的信息

node:集群的数据平面,负责为容器提供运行环境 ( 干活 )

Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器

KubeProxy : 负责提供集群内部的服务发现和负载均衡

Docker : 负责节点上容器的各种操作


下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:

  1. 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中

  2. 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件

  3. apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上

    在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer

  4. apiServer调用controller-manager去调度Node节点安装nginx服务

  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod

    pod是kubernetes的最小操作单元,容器必须跑在pod中至此,

  6. 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理

这样,外界用户就可以访问集群中的nginx服务了


6.Kubernetes优缺点

Kubernetes的优点主要有以下几点:

  1. 弹性和高可靠性:Kubernetes通过节点的自动切换和Pod的自动重启等机制实现高可靠性,确保应用程序不会因为单个节点或者Pod的故障导致的中断。

  2. 高扩展性:Kubernetes支持水平扩展,可以扩展节点的数量以容纳更多的容器,在应用程序负载增大的情况下,可以通过添加节点进行扩展。

  3. 简化部署:Kubernetes抽象了容器和Pod等概念,简化了部署和管理容器化应用程序的过程,使得开发人员更加专注于应用程序本身。

然而,Kubernetes也存在一些缺点:

  1. 学习成本高:由于Kubernetes涉及到多个概念和组件,以及高度抽象的部署和管理方式,因此学习成本相对较高。

  2. 复杂性高:Kubernetes的部署和配置比较复杂,需要更多的人力和时间进行维护,管理容器数量较少的场景可能会过度负担。

  3. 运行成本高:由于Kubernetes需要在多个节点上运行,需要额外的网络和存储资源,因此相对于单节点方案,运行成本会增加。


二、Kubernetes环境部署

环境
主机名角色安装的软件IP地址系统版本
master管理节点Docker
kubeadm
kubelet
kubectl
192.168.179.13centos8
node1工作节点Docker
kubeadm
kubelet
kubectl
192.168.179.14centos8
node2工作节点Docker
kubeadm
kubelet
kubectl
192.168.179.15centos8
基本配置
//永久关闭防火墙和selinux(所有主机都做)
systemctl disable --now firewalld.service
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

//所有主机配置国内yum源(推荐使用阿里云源)
rm -rf /etc/yum.repos.d/*

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

yum clean all && yum makecache 


//配置主机名解析(所有主机都做)
[root@master ~]# vi /etc/hosts 
[root@master ~]# cat /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#要添加的内容
192.168.179.13	master
192.168.179.14	node1
192.168.179.15	node2
[root@master ~]# 

//关闭swap分区(注释掉swap分区的那一行,所有主机都做)
[root@master ~]# vi /etc/fstab 
[root@master ~]# cat /etc/fstab 
(省略)
# units generated from this file.
#
/dev/mapper/cs-root     /                       xfs     defaults        0 0
UUID=22d538b9-6f73-43c5-8d80-228f9bc1b20a /boot                   xfs     defaults        0 0
#/dev/mapper/cs-swap     none                    swap    defaults        0 0
[root@master ~]# 


//将桥接的IPv4流量传递到iptables的链(所有主机都做)
[root@master ~]# vi /etc/sysctl.d/k8s.conf
[root@master ~]# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@master ~]# sysctl --system

//配置时间同步
--设置时区(所有主机都设置)
[root@master ~]# timedatectl set-timezone Asia/Shanghai 
--管理节点的配置
[root@master ~]# yum -y install chrony
[root@master ~]# vi /etc/chrony.conf 
[root@master ~]# cat /etc/chrony.conf 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool time1.aliyun.com iburst   //将默认的时间同步服务器换成阿里云的(用此行内容替换原来的)
(省略)
[root@master ~]# systemctl enable chronyd.service 
[root@master ~]# systemctl restart chronyd.service 
--两个工作节点的配置
[root@node1 ~]# vi /etc/chrony.conf 
[root@node1 ~]# cat /etc/chrony.conf 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool master iburst  //将默认的时间同步服务器改为管理节点
(省略)
[root@node1 ~]# systemctl enable chronyd.service 
[root@node1 ~]# systemctl restart chronyd.service 

//配置免密登录(只在master管理节点上做)
--生成密钥
[root@master ~]# ssh-keygen -t rsa  (一直回车)
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:yqtCSSfFJId+z0yRPJX4rR6i4N1GFPilY+4aG3pxkFI root@master
The key's randomart image is:
+---[RSA 3072]----+
|  .+oo +..       |
|  .oE B o        |
| . o o B .       |
|  = = B . .      |
| . * X .S.       |
|  + ..O.o        |
| o ooBoo .       |
|  o.+++..        |
|  .o++.          |
+----[SHA256]-----+

--发送证书给所有节点(包括自己)
[root@master ~]# ssh-copy-id master
[root@master ~]# ssh-copy-id node1
[root@master ~]# ssh-copy-id node2

//安装基础工具包(所有主机都安装)
yum -y install vim wget

//重启所有主机
reboot
1.所有节点安装docker

安装docker

//安装docker依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

//配置docker的yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

//安装docker
yum -y install docker-ce

//启动并设置docker开机自启
systemctl enable --now docker.service

//配置docker镜像的加速器(所有节点都配置)
[root@master ~]# vim /etc/docker/daemon.json
[root@master ~]# cat /etc/docker/daemon.json
{
   "registry-mirrors": ["https://5qsf7g11.mirror.aliyuncs.com"]
}
[root@master ~]# systemctl daemon-reload 
[root@master ~]# systemctl restart docker.service 
2.所有节点安装kubeadm、kubelet、kubectl
添加yum源

先添加一个kubernetes的yum源,再安装各软件包(所有主机)

//添加kubernetes的yum源
[root@master ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@master ~]# yum makecache 

//安装kubeadm、kubelet和kubectl
[root@master ~]# yum -y install kubelet kubeadm kubectl

//设置开机自启(仅设置开机自启,千万不要启动!!!)
[root@master ~]# systemctl stop kubelet
[root@master ~]# systemctl enable kubelet
containerd配置

在 /etc/containerd/ 下面有一个 config.toml 的文件

//这个文件默认是没有很多功能的,所以我们不用这,而是重新生成一个
[root@master ~]# cat /etc/containerd/config.toml 
#   Copyright 2018-2022 Docker Inc.

#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at

#       http://www.apache.org/licenses/LICENSE-2.0

(省略)
//生成一个新的config.toml文件
[root@master ~]# containerd config default > /etc/containerd/config.toml

//修改拉取镜像的位置,默认位置是外网,正常情况访问不到。所以换成国内的
--在这个配置文件中找到sandbox_image = "registry.k8s.io/pause:3.6"这一行,把这行改为
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
[root@master ~]# vim /etc/containerd/config.toml 
[root@master ~]# cat /etc/containerd/config.toml 
(省略)
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
(省略)

//重启containerd服务并设置开机自启
[root@master ~]# systemctl restart containerd.service 
[root@master ~]# systemctl enable containerd.service 

//把这个改好的文件scp到另外两个工作节点
[root@master ~]# scp /etc/containerd/config.toml node1:/etc/containerd/
[root@master ~]# scp /etc/containerd/config.toml node2:/etc/containerd/

//在另外两个工作节点上重启containerd服务并设置开机自启
[root@node1 ~]# systemctl restart containerd.service && systemctl enable containerd.service 
[root@node2 ~]# systemctl restart containerd.service && systemctl enable containerd.service 
3.部署Kubernetes Master(管理节点)

只在master主机(管理节点)上操作

//初始化集群
[root@master ~]# kubeadm init \
  --apiserver-advertise-address=192.168.179.13 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
  
//出现这行就代表初始化成功:Your Kubernetes control-plane has initialized successfully!

//初始化后生成的一些教程复制下来,写在一个文件里面保存起来,说不定以后会用到
[root@master ~]# vim k8s-init
[root@master ~]# cat k8s-init 
To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.179.13:6443 --token 3codju.65fqz143cjxzfjcw \
	--discovery-token-ca-cert-hash sha256:9ffae8478fff2fd94274144066edc9d91f229b51b8e11663da8ce055da04028c 
[root@master ~]# 

//设置环境变量
[root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > /etc/profile.d/k8s.sh
[root@master ~]# source /etc/profile.d/k8s.sh
4.安装Pod网络插件(CNI)
//下载一个flannel资源模板文件
[root@master ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

//添加flannel资源
[root@master ~]# kubectl apply -f kube-flannel.yml 

//查看flannel资源
[root@master ~]# kubectl get -f kube-flannel.yml 
NAME                     STATUS   AGE
namespace/kube-flannel   Active   89s

NAME                     SECRETS   AGE
serviceaccount/flannel   0         89s

NAME                                            CREATED AT
clusterrole.rbac.authorization.k8s.io/flannel   2023-11-13T09:06:00Z

NAME                                                   ROLE                  AGE
clusterrolebinding.rbac.authorization.k8s.io/flannel   ClusterRole/flannel   89s

NAME                         DATA   AGE
configmap/kube-flannel-cfg   2      89s

NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/kube-flannel-ds   1         1         1       1            1           <none>          89s
[root@master ~]#   //资源没有问题

//查看k8s组件的pod
[root@master ~]# kubectl get pods -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-66f779496c-5thsr         1/1     Running   0          27m
coredns-66f779496c-nqjkx         1/1     Running   0          27m
etcd-master                      1/1     Running   0          27m
kube-apiserver-master            1/1     Running   0          27m
kube-controller-manager-master   1/1     Running   0          27m
kube-proxy-7dc82                 1/1     Running   0          27m
kube-scheduler-master            1/1     Running   0          27m
[root@master ~]#  //运行没有问题

//查看所有名称空间
[root@master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   29m
kube-flannel      Active   4m8s
kube-node-lease   Active   29m
kube-public       Active   29m
kube-system       Active   29m
[root@master ~]#  //没有问题
5.加入Kubernetes Node

在两台工作节点上执行;node1和node2

//在node1和node2上执行
[root@node1 ~]# kubeadm join 192.168.179.13:6443 --token 3codju.65fqz143cjxzfjcw \
	--discovery-token-ca-cert-hash sha256:9ffae8478fff2fd94274144066edc9d91f229b51b8e11663da8ce055da04028c 

[root@node2 ~]# kubeadm join 192.168.179.13:6443 --token 3codju.65fqz143cjxzfjcw \
	--discovery-token-ca-cert-hash sha256:9ffae8478fff2fd94274144066edc9d91f229b51b8e11663da8ce055da04028c 


//在master上查看加入的node节点
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   Ready      control-plane   33m   v1.28.2
node1    Ready      <none>          87s   v1.28.2
node2    NotReady   <none>          36s   v1.28.2
[root@master ~]# 

//查看网络组件,在两台node上也跑起来了
[root@master ~]# kubectl get pods -n kube-flannel -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
kube-flannel-ds-7h6vp   1/1     Running   0          3m32s   192.168.179.14   node1    <none>           <none>
kube-flannel-ds-gmhpm   1/1     Running   0          10m     192.168.179.13   master   <none>           <none>
kube-flannel-ds-mhn7s   1/1     Running   0          2m41s   192.168.179.15   node2    <none>           <none>
[root@master ~]# 


6.测试Kubernetes 集群
//创建一个名字叫nginx,镜像为nginx,在default名称空间里面的pod
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

//查看pod状态,已经跑起来了,在内部使用容器ip访问
[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP           NODE    NOMINATED NODE   READINESS GATES
nginx-7854ff8877-r277b   1/1     Running   0          3m6s   10.244.1.2   node2   <none>           <none>

//内部访问
[root@master ~]# curl 10.244.1.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>



//暴露端口号
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

//查看
[root@master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7854ff8877-r277b   1/1     Running   0          9m8s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        61m
service/nginx        NodePort    10.110.91.174   <none>        80:32597/TCP   94s
[root@master ~]# 

然后使用管理节点的ip加映射的端口号在浏览器访问

在这里插入图片描述


扩展:配置kubectl命令可以在node节点上运行

kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:

  • 1.在node节点(工作节点)上创建一个用户
  • 2.在该用户的家目录中创建一个隐藏目录 .kube
  • 3.将控制节点上的/etc/kubernetes/admin.conf通过scp发送到node节点里上一步创建的目录中并命名为config
  • 4.在node节点修改config文的属主属组为第1步创建的用户

演示:

//在node节点上创建用户并设置密码
[root@node1 ~]# useradd k8s
[root@node1 ~]# echo "1"  | passwd --stdin k8s 
Changing password for user k8s.
passwd: all authentication tokens updated successfully.
[root@node1 ~]# 

//在node节点上创建隐藏目录
[root@node1 ~]# mkdir -p /home/k8s/.kube

//在控制节点上发送文件
[root@master ~]# scp /etc/kubernetes/admin.conf node1:/home/k8s/.kube/config
admin.conf                                 100% 5646     3.3MB/s   00:00    
[root@master ~]# 

//在node节点上修改/home/k8s/.kube/config的属主属组
[root@node1 ~]# chown k8s:k8s /home/k8s/.kube/config
[root@node1 ~]# ll /home/k8s/.kube/config
-rw------- 1 k8s k8s 5646 Nov 15 17:07 /home/k8s/.kube/config
[root@node1 ~]# 

//切换到第1步创建的用户,测试
[k8s@node1 ~]$ kubectl get namespace
NAME              STATUS   AGE
default           Active   2d
kube-flannel      Active   2d
kube-node-lease   Active   2d
kube-public       Active   2d
kube-system       Active   2d
wanf              Active   21m
[k8s@node1 ~]$ 
--可以使用

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

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

相关文章

LeetCode(16)接雨水【数组/字符串】【困难】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 42. 接雨水 1.题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…

PbootCMS 应用快速迁移至浪潮信息 KeyarchOS 云服务器

本文我们以 PbootCMS 应用为例&#xff0c;详细介绍如何使用 X2Keyarch 迁移工具将其从 CentOS 系统迁移到浪潮信息 KeyarchOS 系统。 背景介绍 众所周知&#xff0c;CentOS 是最流行的红帽克隆版&#xff0c;因为免费&#xff0c;所以它的安装量甚至比红帽本身要大得多。本来…

Feature Pyramid Networks for Object Detection(2017.4)

文章目录 Abstract1. Introduction3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 7. Conclusion FPN Abstract 特征金字塔是识别系统中检测不同尺度物体的基本组成部分。但最近的深度学习对象检测器避免了金字塔表示&#xff0c;部分…

python科研绘图:绘制X-bar图

目录 1.X-bar 图的基本概念 2.X-bar 图的绘制过程 3.X-bar 图的优势 4.X-bar 图的绘制 1.X-bar 图的基本概念 X-bar控制图是一种统计工具&#xff0c;用于监控和控制生产过程中的质量变量。它是过程能力分析和统计过程控制&#xff08;SPC&#xff0c;Statistical Process…

微机原理_9

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。 1.当运算结果的最高位为1时&#xff0c;标志位(&#xff09; A. CF1 B. OF1 C. SF1 D. ZF1 2、汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可…

构造函数和初始化列表的关系和区别【详解】

构造函数和初始化列表关系和区别&#xff0c;以及为什么有初始化列表&#xff0c;和它的好处 一、构造函数和初始化列表的关系和区别二、为什么有初始化列表三、使用初始化列表的好处 一、构造函数和初始化列表的关系和区别 百度百科这样定义初始化列表&#xff1a;与其他函数…

使用手机作为电脑的麦克风和摄像头外设

工具 Iriun Iriun 电脑端安装&#xff1a;Iriun Android: Iriun 4K Webcam for PC and Mac - Apps on Google Play Apple: Iriun Webcam for PC and Mac on the App Store 基础功能免费&#xff0c;普通使用足够了。 付费功能&#xff1a; 使用 这里有介绍&#xff1a…

【Java】详解多线程同步的三种方式

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;等风来&#xff0c;不如追风去 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 一.&#x1f510;线…

MAC地址_MAC地址格式_以太网的MAC帧_详解

MAC地址 全世界的每块网卡在出厂前都有一个唯一的代码,称为介质访问控制(MAC)地址 一.网络适配器(网卡) 要将计算机连接到以太网&#xff0c;需要使用相应的网络适配器(Adapter)&#xff0c;网络适配器一般简称为“网卡”。在计算机内部&#xff0c;网卡与CPU之间的通信&…

【UE C++】读取文本文件,并解析

目录 0 引言1 空格 制表符 换行符1.1 定义1.2 查看字符 2 实战 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01;&#x…

C进阶---字符函数和字符串函数

目录 一、长度不受限限制的字符串函数 1.1strlen 1.2strcpy 1.3strcat 1.4strcmp 二、长度受限制的字符串函数 2.1strncpy 2.2strncat 2.3strncmp 三、其他字符串函数 3.1strstr 3.2strtok 3.3sterror 3.4memcpy 3.5memmove 3.6memcmp 四、字符分类函…

c语言:如何打印杨辉三角形。

题目&#xff1a;打印杨辉三角形 如&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 思路和代码&#xff1a; //由规律不难得出&#xff0c;每行首个数字和最后最后一个数字都为1&#xff0c;其余数字是这列的上一个数字和前一个数字的和组成&#xff0c;由此推出代码 #de…

Openssl X509 v3 AuthorityKeyIdentifier实验与逻辑分析

Openssl是X509的事实标准&#xff0c;目前主流OS或个别安全性要求较高的设计场景&#xff0c;对X509的证书链验证已经不在停留在只从数字签名校验了&#xff0c;也就是仅仅从公钥验签的角度&#xff0c;在这些场景中&#xff0c;往往还会校验AuthorityKeyIdentifier和SubjectKe…

【文件包含】metinfo 5.0.4 文件包含漏洞复现

1.1漏洞描述 漏洞编号————漏洞类型文件包含漏洞等级⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐漏洞环境windows攻击方式 MetInfo 是一套使用PHP 和MySQL 开发的内容管理系统。MetInfo 5.0.4 版本中的 /metinfo_5.0.4/about/index.php?fmodule文件存在任意文件包含漏洞。攻击者可利用漏洞读取网…

第十九章 Java绘图

第十九章 java绘图 19.1 java绘图类 绘图时高级程序设计中非常重要的技术&#xff0c;例如&#xff0c;应用程序可以绘制闪屏图片&#xff0c;背景图片&#xff0c;组件外观等等&#xff0c;Web程序可以绘制统计图&#xff0c;数据库存储图片资源等&#xff0c;真骨耸为“一…

服务名无效。 请键入 NET HELPMSG 2185以获得更多的帮助

遇到的问题是MySQL服务没有。 因为net start 服务名&#xff0c;启动的是win下注册的服务。此时&#xff0c;我系统中并没有注册mysql到服务中。即下面没有mysql服务。 mysqld --install net start mysql

2023.11.15 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态路径分析

目录 一、题目 二、解决方法 三、改进 一、题目 背景&#xff1a; 在一个城市中&#xff0c;有数个交通节点&#xff0c;每个节点间有双向道路相连。每条道路具有一个初始权重&#xff0c;代表通行该路段的成本&#xff08;例如时间、费用等&#xff09;。随着时间的变化&am…

nodejs+vue黄河风景线旅游网站的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

本文首先对该系统进行了详细地描述&#xff0c;然后对该系统进行了详细的描述。管理人员增加了系统首页、个人中心、用户管理、景点分类管理、景点简介管理、旅游路线管理、文章分类管理、公告文章管理、系统管理理等功能。这套黄河风景线旅游网站是根据当前的现实需要&#xf…

SystemVerilog学习 (5)——接口

一、概述 验证一个设计需要经过几个步骤&#xff1a; 生成输入激励捕获输出响应决定对错和衡量进度 但是&#xff0c;我们首先需要一个合适的测试平台&#xff0c;并将它连接到设计上。 测试平台包裹着设计,发送激励并且捕获设计的输出。测试平台组成了设计周围的“真实世界”,…

【miniQMT实盘量化3】获取历史行情数据

前言 上篇文章&#xff0c;介绍了如何与miniQMT建立连接&#xff0c;这篇开始&#xff0c;我们会深入探讨miniQMT的每个功能接口。首先&#xff0c;从获取历史数据开始。 迅投的官方文档目前已经更新&#xff0c;miniQMT对应原生API部分 接口汇总 与历史行情数据相关的接口&a…