k8s1.17.2+centos7.7+docker18.06

news2025/7/19 5:24:39

1.简介

1.1pod网络

总述:Kubernetes 的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中

  1. Flannel:基于L2,构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。
  2. Calico:纯L3,构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。

1.2组件简介

  1. Master节点:
    • API Server(kube-apiserver):提供了HTTP Rest接口的关键服务进程,是kubernetes里所有资源的增删改查等操作的唯一入口,也是集群中的入口进程
    • Controller Manager(kube-controller-manager):kubernetes里所有资源对象的自动化控制中心,可以理解成为资源对象的“大总管”
    • Scheduler:(kube-scheduler):负责资源调度(pod调度)的进程,相当于公交公司的“调度室”
    • Etcd:所有资源对象的数据被会被保存到etcd中,持久化
  2. Node节点:
    • docker engine:docker引擎,负责本主机的容器创建 和管理工作
    • kubelet:负责pod对应容器的创建,启停等任务,另外kubelet与master紧密协作,随时报告给master自身的情况,如CPU,内存,操作系统,docker版本等
    • kube-proxy:实现kubernetes server的通信与负载均衡机制的重要组件;提供svc服务(服务发现);负责写入规则至 IPTABLES(ip数据包过滤)、IPVS(负载均衡) 实现服务映射访问的;
  3. k8s其它组件:
    • kubectl:命令行工具
    • DASHBOARD:网页面板;给 K8S 集群提供一个 B/S 结构访问体系

1.3k8s

  1. pod控制器:Deployment 》ReplicaSet 》pod
    • kubectl run 并不是直接创建一个 Pod,而是先创建一个 Deployment 资源(replicas=1),再由与 Deployment 关联的 ReplicaSet 来自动创建 Pod
  2. CNI(flannel或Calico)将为pod构建网络。
  3. 为pod创建svc 可以获取cluster_ip

2.环境

在这里插入图片描述
在这里插入图片描述

  1. linux
    • 5.6.5-1.el7.elrepo.x86_64
    • CentOS Linux release 7.7.1908 (Core)
  2. docker
    • Docker version :docker-ce-18.06.0.ce-3.el7
  3. docker-compose
    • docker-compose version 1.25.4
  4. k8s:版本 1.17.2
    • kube-controller-manager:1.17.2
    • kube-scheduler:1.17.2
    • kube-apiserver:1.17.2
    • kubectl:1.17.2
    • kube-proxy:1.17.2
    • etcd:3.4.3-0
    • pause:3.1
    • coredns:1.6.5

3.安装k8s1.17.2

3.1系统准备

主要配置:

  1. 设置主机名:

    #master01
    hostnamectl set-hostname k8s-master01
    #node01
    hostnamectl set-hostname k8s-node01
    #node02
    hostnamectl set-hostname k8s-node02
    
  2. host文件 ip解析

    master01 hosts文件需要写入node节点;node节点只需要写入自己和master01节点

    #master01
    vi /etc/hosts
    192.168.2.94 k8s-master01
    192.168.2.93 k8s-node01
    192.168.2.92 k8s-node02
    #node01
    vi /etc/hosts
    192.168.2.94 k8s-master01
    192.168.2.93 k8s-node01
    #node02
    vi /etc/hosts
    192.168.2.94 k8s-master01
    192.168.2.92 k8s-node02
    
  3. master01节点上配置免密登录node节点

    #生成ssh
    ssh-keygen
    #拷贝生成的公钥到其它节点
    ssh-copy-id -i root@k8s-node01
    ssh-copy-id -i root@k8s-node02
    
  4. yum安装依赖包:

    yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
    
  5. 设置防火墙为 Iptables 并设置空规则:kubeproxy操作iptables

    #停止、禁用默认防火墙firewalld
    systemctl stop firewalld && systemctl disable firewalld
    #安装设置iptables防火墙
    yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
    
  6. 关闭swap分区:pod运行在swap分区中会大大影响效率

    • 临时关闭:
    
    
    • 永久关闭:
    swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    
  7. 禁用SELINUX:开启会限制服务进程访问资源

    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    
  8. 配置内核参数:将桥接的IPv4流量传递到iptables过滤链

    cat > kubernetes.conf <<EOF
    net.bridge.bridge-nf-call-iptables=1  #!!!必须
    net.bridge.bridge-nf-call-ip6tables=1  #!!!必须
    net.ipv4.ip_forward=1
    net.ipv4.tcp_tw_recycle=0
    vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
    vm.overcommit_memory=1 # 不检查物理内存是否够用
    vm.panic_on_oom=0 # 关闭 OOM
    fs.inotify.max_user_instances=8192
    fs.inotify.max_user_watches=1048576
    fs.file-max=52706963
    fs.nr_open=52706963
    net.ipv6.conf.all.disable_ipv6=1  #!!!必须
    net.netfilter.nf_conntrack_max=2310720
    EOF
    cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
    sysctl -p /etc/sysctl.d/kubernetes.conf
    
  9. 日志处理:采用 systemd journald日志记录方式而不是rsyslogd方式

    mkdir /var/log/journal # 持久化保存日志的目录
    mkdir /etc/systemd/journald.conf.d
    cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
    [Journal]
    # 持久化保存到磁盘
    Storage=persistent
    # 压缩历史日志
    Compress=yes
    SyncIntervalSec=5m
    RateLimitInterval=30s
    RateLimitBurst=1000
    # 最大占用空间 10G
    SystemMaxUse=10G
    # 单日志文件最大 200M
    SystemMaxFileSize=200M
    # 日志保存时间 2 周
    MaxRetentionSec=2week
    # 不将日志转发到 syslog
    ForwardToSyslog=no
    EOF
    systemctl restart systemd-journald
    
  10. 开启IPVS(负载均衡):

    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe br_netfilter
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack
    EOF
    
    #操作上面创建的文件
    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    

其它配置:可配置可不配置

  1. 关闭系统不需要的服务:

    #postfix邮件服务
    systemctl stop postfix && systemctl disable postfix
    
  2. 调整系统时区

    # 设置系统时区为 中国/上海
    timedatectl set-timezone Asia/Shanghai
    # 将当前的 UTC 时间写入硬件时钟
    timedatectl set-local-rtc 0
    # 重启依赖于系统时间的服务
    systemctl restart rsyslog
    systemctl restart crond
    

3.2安装配置docker

  1. 删除旧版本

    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-selinux \
                      docker-engine-selinux \
                      docker-engine
    
  2. 安装工具

    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  3. 设置python版本

    建议升级py2到py3

    #将第一行python换为python2.7
    vi /usr/bin/yum-config-manager
    
  4. 添加yum信息

    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  5. 更新yum缓存

    yum makecache fast
    
  6. 查看可用的docker版本

    yum list docker-ce --showduplicates | sort -r
    
  7. 安装docker-ce

    yum -y install docker-ce-18.06.0.ce-3.el7
    
  8. 启动设置开启自启

    systemctl start docker && systemctl enable docker
    
  9. 设置阿里镜像源

    #注意,先运行一次docker 才会有这个文件夹
    vi /etc/docker/daemon.json
    #加入以下内容;insecure-registries 设置不安全的镜像仓库,自己的harbor仓库;exec-opts k8s需要docker以systemd的模式运行
    {
    	"registry-mirrors": [
    		"http://docker.mirrors.ustc.edu.cn",
    		"https://自己在阿里云去配置.com",
    		"http://hub-mirror.c.163.com",
    		"http://registry.docker-cn.com"
    	],
    	"insecure-registries": [
    		"192.168.2.60:9999"
    	],
    	"exec-opts": ["native.cgroupdriver=systemd"],
    	"log-driver": "json-file",
    	"log-opts": {"max-size": "100m"}
    }
    
  10. 创建systemd所需目录

    mkdir -p /etc/systemd/system/docker.service.d
    
  11. 重启docker并设置开机自启

    systemctl daemon-reload && systemctl restart docker && systemctl enable docker
    

3.3安装docker-compose

  1. 从github上下载docker-compose二进制文件

    curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    
  2. 将下载的文件放置在/usr/local/bin/

  3. 将下载文件赋予可执行权限

    chmod +x /usr/local/bin/docker-compose
    
  4. 测试

    docker-compose --version
    

3.4安装k8s kubectl、kubelet、kubeadm

  1. 配置kubernetes的阿里云yun源

    cat > /etc/yum.repos.d/kubernetes.repo  <<EOF
    [kubernetes]
    name=Kubernetes repo
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    enabled=1
    EOF
    
  2. 安装

    yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2
    
  3. 启动kubelet服务

    systemctl enable kubelet && systemctl start kubelet
    

3.5初始化k8s集群

在master01节点执行初始化

  1. 输出初始化默认配置到文件kubeadm-config.yaml

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

    增加:podSubnet;修改kubernetesVersion;修改advertiseAddress(masterIP);修改imageRepository为阿里云

    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.2.94
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: k8s-master01
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.17.2
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.96.0.0/12
    
    scheduler: {}
    
  2. 执行初始化命令将命令结果记录到kubeadm-init.log中

    kubeadm init --config=kubeadm-config.yaml --v=6 --upload-certs | tee kubeadm-init.log
    

    如果报错,有镜像未被拉取下来,重新执行一次;或者直接从阿里云拉取镜像

    示例:

    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.2.24
    
  3. 讲解kubeadm-init.log

    kubelet环境变量:/var/lib/kubelet/kubeadm-flags.env
    kubelet配置信息:/var/lib/kubelet/config.yaml
    k8s所有的证书:/etc/kubernates/pki ;采用https的证书安全策略;ca厂商;私钥;crt证书
    k8s所有的配置文件:/etc/kubernates ;controller-manager.conf;scheduler.conf等配置文件都在这个目录下
    $HOME/.kube作用:kubectl与apiserver以http协议进行交互,产生的缓存存储在这里;config认证文件也会保存在这个目录下。

  4. 根据kubeadm-init.log 提示操作:查看自己的kubeadm-init.log操作

    在master节点执行

    #创建交互缓存目录 .kube 
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    

sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config


在node节点执行:将当前节点加入k8s

```shell
kubeadm join 192.168.2.94:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:64a70d3945cf0ef0ace4f9e793d494de274f5a43c05020a80b5c1c915974e22a 

3.7配置CNI网络

暂时使用Flannel(基于L2)构建扁平化的网络;以后升级到Calico(完全基于L3)

在master01节点执行操作

  1. 创建flannel目录

    mkdir install-k8s/plugin/flannel
    cd install-k8s/plugin/flannel
    
  2. 创建yaml文件

    #访问 https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 复制其中的内容到kube-flannel.yml文件中
    vi kube-flannel.yml
    
  3. 执行yaml文件创建扁平化网络

    kubectl apply -f kube-flannel.yml
    
  4. 测试

    #所有节点STATUS 为Ready 构建成功
    kubectl get node
    #查看网络,多了一个flannel.1的网络
    ifconfig
    

3.8保存重要文件

mkdir install-k8s/core
mv kubeadm-init.log kubeadm-config.yaml install-k8s/core
mv install-k8s/ /usr/local

3.9安装配置harbor

。。。最好配置域名;配置假的CA证书,否则kubectl run nginx-deployment --image=192.168.2.60:9999/k8s/myapp:v1 --port=80 --replicas=1 命令无法成功执行;因为无法区分:9999 和 myapp:v1

详细见 Harbor - 企业级 Docker 私有仓库.pdf

一些命令:

#打标签 原来的标签为 repository:tag
docker tag wangyanglinux/myapp:v1 192.168.2.60:9999/k8s/myapp:v1
#登录
docker login 192.168.2.60:9999
#上传 harbor地址/项目/仓库/镜像
docker push 192.168.2.60:9999/k8s/myapp:v1

3.10pod测试

  1. 拉取镜像

    docker pull wangyanglinux/myapp:v1
    
  2. 生成deployment

    –image=指定的镜像是本地镜像名称:tag

    kubectl run nginx2-deployment --image=wangyanglinux/myapp:v1 --port=80 --replicas=1
    
  3. 查看发布,REDY 1/1才表示成功

    kubectl get deployment
    
  4. 测试根据套接字访问某个pod

    #获取pod详细信息;里面有构成的pod的网络ip
    kubectl get pod -o wide
    #已经构成了扁平化的网络,直接通过私有ip是可以访问的pod的;根据上面的kubectl run port=80
    curl ip:port
    #获取某个pod的hostname
    curl ip:port/hostname.html
    
  5. pod控制器控制副本数目

    删除pod,查看pod仍然存在

    #删除pod
    kubectl delete pod NAME
    #查看pod信息,发现还是有这个pod,NAME有所不同;因为,kubectl run --replicas=1 指定了需要维持的副本数目
    kubectl get pod
    
  6. 水平扩展

    #水平扩展 deployment/名字  在kubectl run 指定的名字
    kubectl scale --replicas=3 deployment/nginx-deployment
    #查看pod
    kubectl get pod -o wide
    

3.11开启kubeproxy负载均衡

注意,需要首先在虚拟机上开启ipvs,kubeproxy的负载均衡是基于ipvs的

  1. 修改ConfigMap的kube-system/kube-proxy中的config.conf,把 mode: “” 改为mode: “ipvs" 保存退出即可

    kubectl edit cm kube-proxy -n kube-system
    
  2. 删除之前的kube-proxy pod

    kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
    
  3. 查看proxy运行状态

    kubectl get pod -n kube-system | grep kube-proxy
    
  4. 查看日志,如果有Using ipvs Proxier 说明kube-proxy的ipvs 开启成功

    #kube-proxy-54qnw为上面一条命令执行结果podName
    kubectl logs kube-proxy-54qnw -n kube-system
    
  5. 测试负载均衡

    #负载多个pod,一般方案通过nginx去负载;现在使用svc
    #target-port是内部端口,deployment_NAME就是run pod时使用到的deploymentname
    kubectl expose deployment deployment_NAME --port=30000 --target-port=80
    #查看svc,获取cluster_ip
    kubectl get svc
    #根据 Cluster-ip访问
    curl cluster-ip:port
    #测试,发现发现pod_name在变化 因为是轮询的机制(ipvs提供的负载均衡轮询机制)
    curl cluster-ip/hostname.html
    
  6. ipvsadm管理ipvs

    #使用ipvs管理工具 ipvsadm 查看某个ip负载机制
    ipvsadm -Ln | grep clusterIP
    #看完全
    ipvsadm -Ln
    

3.12外网访问

#编辑svc;将type: ClusterIP改为type: NodePort
kubectl edit svc svcName
#再次查看svc,发现给了一个端口 例如,30000:31859 (由内而外);作用,所有的节点都暴露这个可以访问的端口;查看type是否为NodePort
kubectl get svc
#浏览器访问这个端口;使用 主节点ip:31859 可以访问;使用 起他节点ip:31859 也可以访问

4.kubectl命令

#获取所有节点
kube get node
#检查组件的健康状态;componentstatus可简写为cs
kubectl get componentstatus 
#查看deployment;控制器deployment会使用RS创建pod
kubectl get deployment
#查看ReplicaSet
kubectl get rs
#获取pod状态 -n --name 名空间
kubectl get pod -n kube-system
#查看pod更详细的信息,node节点在init过程中;-o option
kubectl get pod -n kube-system -o wide
#替代命令,持续监视 -w watch
kubectl get pod -n kube-system -w
#删除pod
kubectl delete pod podName
#删除RS
kubectl delete rs rsName
#删除deployment
kubectl delete deployment deploymentName
#删除svc
kubectl delete svc svcname
#查看pod日志
kubectl -n kube-system logs -f <pod name>
#应用资源清单
kubectl apply -f pod.yml

5.安装Dashboard

5.1默认用户和管理员登录

dashboard官网

在master01节点下执行:

  1. /usr/local/install-k8s/plugin/dashboard/目录下创建recommend.yaml ;访问官网将内容拷贝

    Dashboard-github

    vi recommend.yaml
    
  2. 修改recommend.yaml

    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      ports:
        - port: 443
          targetPort: 8443
      selector:
        k8s-app: kubernetes-dashboard
    

    修改为

    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      type: NodePort #新增
      ports:
        - port: 443
          nodePort: 30001 #新增
          targetPort: 8443
      selector:
        k8s-app: kubernetes-dashboard
    
    spec:
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.0.0-beta8
          imagePullPolicy: Always
          ports:
            - containerPort: 8443
              protocol: TCP
    

    修改为

    spec:
      # nodeName: master.node 指定到master节点,指不指定根据需要
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.0.0-beta8
          # imagePullPolicy: Always
          imagePullPolicy: IfNotPresent #镜像下载策略 不存在再下载
          ports:
            - containerPort: 8443
              protocol: TCP
    
  3. 下载Dashboard镜像

    docker pull kubernetesui/dashboard:v2.0.0-beta8
    
  4. 应用recommend.yaml

    kubectl apply -f recommended.yaml
    
  5. 查看svc状态,与dashboard有关的pod都必须Ready 1/1

    kubectl get pods,svc -n kubernetes-dashboard -o wide
    
  6. 浏览器访问:注意使用https

    https://192.168.2.94:30443/

  7. 默认用户:点击token,使用token方式登录

    默认用户kubernetes-dashboard 登录;很多数据访问不了。

    #获取用户名密码
    kubectl  get sa,secrets -n kubernetes-dashboard
    #获取token,kubernetes-dashboard-token-ls8l4 后面几位有所不同
    kubectl describe secrets kubernetes-dashboard-token-ls8l4 -n kubernetes-dashboard
    

    复制token 填写到浏览器上。

  8. 新增管理员用户:点击token,使用token方式登录

    /usr/local/install-k8s/plugin/dashboard/目录下创建create-admin.yaml

    填入一下内容:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kubernetes-dashboard
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: admin-user
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: admin-user
      namespace: kubernetes-dashboard
    

    应用:

    kubectl apply -f create-admin.yaml
    

    查看与dashboard有关pod是否ready 1/1

    kubectl get sa,secrets -n kubernetes-dashboard
    

    管理员账户登录能访问所有数据:

    #获取用户名密码
    kubectl  get sa,secrets -n kubernetes-dashboard
    #获取token,admin-user-token-ls8l4 后面几位有所不同
    kubectl describe secrets admin-user-token-ls8l4 -n kubernetes-dashboard
    

    将token复制到浏览器,发现可以访问所有数据

5.2问题解决

  1. 如果发现创建的dashboard有错,需要先删除错误的。

    kubectl delete  -f recommended.yaml
    

6.Ingress安装

6.1简介

ingress可以实现7层网络协议即应用层https层;内部原理可以理解为使用nginx进行反向代理

6.2安装

  1. 选择模式:Bare-metal

    获取官网yaml文件

    ​ Bare-metal deploy.yaml

    提前pull mandatory.yaml文件中所需镜像

    #获取yaml文件中所需镜像名
    cat mandatory.yaml | grep image
    #在master和node节点中pull镜像
    docker pull 镜像
    

    应用deploy.yaml文件

    kubectl apply -f deploy.yaml
    
  2. 测试

    #查看名称空间ingress-nginx,有没有叫ingress-controller***的svc
    kubectl get svc -n ingress-nginx
    #查看名称空间ingress-nginx,有没有叫ingress-controller***的pod
    kubectl get pod -n ingress-nginx
    

10.问题解决

  1. No more mirrors to try:

    yum makecache
    

11.参考网址

参考网址-安装

参考网址-安装

参考网址->kernel 4.19 开启ipvs

参考网址-开启ipvs

参考网址-安装Dashboard

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

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

相关文章

【Java基础】反射

概述 引入 package ref;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r…

VUCA项目环境中如何提升项目进度计划与控制工作有效性的系统思考【一杯咖啡谈项目】

VUCA环境下&#xff0c;项目进度延迟是经常遇见的问题&#xff0c;如何解决此类问题&#xff1f;今天分享一个案例&#xff0c;在这个案例中&#xff0c;基于“根因分析法”&#xff0c;对某主题客户端项目的进度延迟问题进行了分析&#xff0c;找到根本原因&#xff0c;提出了…

鼠标指针文件格式解析

鼠标指针文件格式解析 文章目录鼠标指针文件格式解析windowsico文件格式分析文件头&#xff1a;图像数据头段&#xff1a;图像数据段&#xff1a;Ani动态光标格式解析数据结构&#xff1a;anihseq **rate**LISTcur静态光标文件格式解析macOSLinuxwindows ico文件格式分析 是一…

2023年PMP考试复习攻略

如何备考PMP呢&#xff1f; 这本书是PMP认证考试的官方教材&#xff0c;体系完善&#xff0c;可以迅速帮助入门者搭建项目管理知识体系&#xff0c;备考PMP考试的伙伴&#xff0c;这本书一定要读一遍&#xff01; 经验都是积累出来的&#xff0c;交流小队里有很多分享面试经验…

Vue3 中生命周期的使用

目录前言&#xff1a;一、什么是生命周期函数二、什么是 Keep-Alive 组件三、生命周期函数分为几种&#xff0c;分别有什么用&#xff1f;1. beforeCreate2. created3. beforeMount/onBeforeMount4. mounted/onMounted5. beforeUpdate/onBeforeUpdate6. updated/onUpdated7. be…

spring之事务概述

文章目录前言一、事务概述1、什么是事务2、事务的四个处理过程3、事务的四个特性二、引入事务场景1、引入依赖2、数据库创建3、建包4、spring.xml配置文件5、测试程序6、运行结果&#xff08;成功&#xff09;7、模拟异常三、Spring对事务的支持1、Spring实现事务的两种方式2、…

数值方法笔记4:插值、近似和拟合

1. 插值1.1 插值的一些概念1.1.1 插值的定义1.1.2 插值的存在性1.1.3 插值的误差分析1.2 拉格朗日插值(Lagrange Interpolation)1.2.1 拉格朗日插值误差分析1.3 Newton多项式插值1.3.1 Newton多项式插值误差分析1.4 Chebyshev多项式确定插值点1.4.1 Chebyshev多项式性质1.5 有理…

Green Hills Software(GHS)的安装

Green Hills Software(GHS)简介 Green Hills Software(GHS)是美国Green Hills软件公司提供的一种具有调试、编译器和闪存编程工具的集成开发环境,是汽车电子行业常用且重要的开发环境之一。它支持的功能包括:AUTOSAR感知、项目构建器、代码覆盖、运行时错误检查、MISRA C…

【HEC-RAS水动力】HEC-RAS 1D基本原理(恒定流及非恒定流)

一、数据说明 HEC-RAS模型主要由工程文件 (.prj) 文 件 、 河道地形数据文件 ( .g01)、运行文件(p01)、非恒定流文件 ( .u01) 等部分组成。 1. 一般数据 在创建并保存project文件(*.prj)后,其他data文件均会自动以同样的名字保存,但采用不同的后缀来区分各类文件。 &qu…

网络编程之IP 地址的介绍

IP 地址的介绍学习目标能够说出IP 地址的作用1. IP 地址的概念IP 地址就是标识网络中设备的一个地址&#xff0c;好比现实生活中的家庭地址。网络中的设备效果图:2. IP 地址的表现形式说明:IP 地址分为两类&#xff1a; IPv4 和 IPv6IPv4 是目前使用的ip地址IPv6 是未来使用的i…

Redis进阶-缓存问题

Redis 最常用的一个场景就是作为缓存&#xff0c;本文主要探讨Redis作为缓存&#xff0c;在实践中可能会有哪些问题&#xff1f;比如一致性、击穿、穿透、雪崩、污染等。 为什么要理解Redis缓存问题 在高并发业务场景下&#xff0c;数据库大多数情况都是用户并发访问最薄弱的…

计算机是怎么读懂C语言的?

文章目录前言程序环境翻译环境翻译环境分类编译预处理预处理符号预定义符号#define#undef命令行定义条件编译文件包含头文件包含查找规则嵌套文件包含其他预处理指令编译阶段汇编链接&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;博主大一智能制造在读&#xff…

Linux 目录操作命令

目录操作命令 进入目录 cd命令 cd 目录名 进入指定目录 cd / 进入根目录 cd … 返回上级目录 cd - 返回上一次所在的目录 cd ~ 进入当前用户的家目录 cd /usr 进入指定目录&#xff0c;绝对路径 创建目录 mkdir 目录名 在usr目录下创建dd目录 进入目录 cd 目录名 进入us…

TypeScript 学习笔记

最近在学 ts 顺便记录一下自己的学习进度&#xff0c;以及一些知识点的记录&#xff0c;可能不会太详细&#xff0c;主要是用来巩固和复习的&#xff0c;会持续更新 前言 想法 首先我自己想说一下自己在学ts之前&#xff0c;对ts的一个想法和印象&#xff0c;在我学习之前&a…

性能测试知多少?怎样开展性能测试

看到好多新手&#xff0c;在性能需求模糊的情况下&#xff0c;随便找一个性能测试工具&#xff0c;然后就开始进行性能测试了&#xff0c;在这种情况下得到的性能测试结果很难体现系统真实的能力&#xff0c;或者可能与系统真实的性能相距甚远。 与功能测试相比&#xff0c;性能…

适合打游戏用的蓝牙耳机有哪些?吃鸡无延迟的蓝牙耳机推荐

现在手游的兴起&#xff0c;让游戏市场变得更加火爆&#xff0c;各种可以提高玩家体验的外设也越来越多&#xff0c;除了提升操作的外置按键与手柄外&#xff0c;能带来更出色音质与舒心使用的游戏耳机&#xff0c;整体氛围感更好&#xff0c;让玩家在细节上占据优势&#xff0…

2023年2月中国数据库排行榜:OTO新格局持续三月,人大金仓、AnalyticDB排名创新高

玉兔迎春至&#xff0c;榜单焕新颜。 2023年2月&#xff0c;兔年开年的 墨天轮中国数据库流行度排行 火热出炉&#xff0c;本月共有259个数据库参与排名&#xff0c;排行榜样式去掉了较上月和半年前得分差的数据显示&#xff0c;更加聚焦各产品之间的排名变化以及当月的得分差距…

景区展馆客流量数据如何统计

客流统计系统是了解掌握景区客流量的小助手&#xff0c;只有知道每天景区来往客流的情况&#xff0c;才能对经营管理、员工分配等多方面要素进行合理布局安排。使用客流统计系统&#xff0c;利用大数据管理预测&#xff0c;以客流数据为基础&#xff0c;提高景区对突发事件的应…

【云原生】kubeadm部署k8s集群、Dashboard UI以及连接私有仓库

一、kubeadm 部署 K8S 集群架构 主机名IP地址安装组件master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&#xff09;192.168.2.66docker、kubeadm、kubelet、kubectl、flannelnode01&#xff08;2C/2G&#xff09;192.168.2.200docker、kubeadm、kubelet、kubectl、fla…

基本bash shell(浏览、管理、查看文件/目录)

基本bash shell使用shell启动shell$cat /etc/passwd文件存储用户账号列表和基本配置信息shell提示符默认&#xff1a;$表示&#xff1a;shell在等待用户输入bash手册man命令$man man表示&#xff1a;查看手册页内容$man -K terminal关键字搜索。表示&#xff1a;查找与终端相关…