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

【 云原生 | K8S 】kubeadm 部署Kubernetes集群

目录

1 环境准备

2 所有节点安装docker

3 所有节点安装kubeadm,kubelet和kubectl

4 部署K8S集群

4.1 查看初始化需要的镜像

4.2 初始化kubeadm

4.3 设定kubectl

4.4 所有节点部署网络插件flannel


master(2C/4G,cpu核心数要求大于2) 192.168.30.105 docker、kubeadm、kubelet、kubectl、flannel

node01(2C/2G) 192.168.30.101 docker、kubeadm、kubelet、kubectl、flannel

node02(2C/2G) 192.168.30.102 docker、kubeadm、kubelet、kubectl、flannel

Harbor节点(hub.kgc.com) 192.168.30.109 docker、docker-compose、harbor-offline-v1.2.2

1、在所有节点上安装Docker和kubeadm

2、部署Kubernetes Master

3、部署容器网络插件

4、部署 Kubernetes Node,将节点加入Kubernetes集群中

5、部署 Dashboard Web 页面,可视化查看Kubernetes资源

6、部署 Harbor 私有仓库,存放镜像资源

1 环境准备

//所有节点,关闭防火墙规则,关闭selinux,关闭swap交换

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a						#交换分区必须要关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab		#永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
#加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

//修改主机名

hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

//所有节点修改hosts文件

vim /etc/hosts
192.168.30.105 master01
192.168.30.101 node01
192.168.30.102 node02

//调整内核参数

cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

//生效参数

sysctl --system  

2 所有节点安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce docker-ce-cli containerd.iomkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "500m", "max-file": "3"}
}
EOF

#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。 #日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。

#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。 #日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。

systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service docker info | grep "Cgroup Driver"
Cgroup Driver: systemd

3 所有节点安装kubeadm,kubelet和kubectl

//定义kubernetes源

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
EOFyum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15

//开机自启kubelet

systemctl enable kubelet.service

#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启

4 部署K8S集群

4.1 查看初始化需要的镜像

kubeadm config images list --kubernetes-version 1.20.15

//在 master 节点上传 v1.20.15.zip 压缩包至 /opt 目录

unzip v1.20.15.zip -d /opt/k8s
cd /opt/k8s/
for i in $(ls *.tar); do docker load -i $i; done

//复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件

scp -r /opt/k8s root@node01:/opt
scp -r /opt/k8s root@node02:/opt

4.2 初始化kubeadm

方法一:

kubeadm config print init-defaults > /opt/kubeadm-config.yamlcd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12   advertiseAddress: 192.168.30.105		#指定master节点的IP地址
13   bindPort: 6443
......
32 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers          #指定拉取镜像的仓库,默认是k8s.gcr.io
33 kind: ClusterConfiguration
34 kubernetesVersion: v1.20.15				#指定kubernetes版本号
35 networking:
36   dnsDomain: cluster.local
37   podSubnet: "10.244.0.0/16"				#指定pod网段,10.244.0.0/16用于匹配flannel默认网段
38   serviceSubnet: 10.96.0.0/16			#指定service网段
39 scheduler: {}

#末尾再添加以下内容

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs									#把默认的kube-proxy调度方式改为ipvs模式

//在线拉取镜像

kubeadm config images pull --config /opt/kubeadm-config.yaml

//初始化 master

kubeadm init --config=/opt/kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#--upload-certs 参数可以在后续执行加入节点时自动分发证书文件
#tee kubeadm-init.log 用以输出日志

//查看 kubeadm-init 日志

less kubeadm-init.log

//kubernetes配置文件目录

ls /etc/kubernetes/

//存放ca等证书和密码的目录

ls /etc/kubernetes/pki

方法二:

kubeadm init \
--apiserver-advertise-address=192.168.80.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.20.15 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \--token-ttl=0

初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。 可选参数: --apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址 --apiserver-bind-port:apiserver的监听端口,默认是6443 --cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki --control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加 --image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io --kubernetes-version:指定kubernetes版本 --pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16; --service-cidr:service资源的网段 --service-dns-domain:service全域名的后缀,默认是cluster.local

--token-ttl:默认token的有效期为24小时,如果不想过期,可以加上 --token-ttl=0 这个参

方法二初始化后需要修改 kube-proxy 的 configmap,开启 ipvs

kubectl edit cm kube-proxy -n=kube-system
修改mode: ipvs提示:
......
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou 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.80.10:6443 --token rc0kfs.a1sfe3gl4dvopck5 \--discovery-token-ca-cert-hash sha256:864fe553c812df2af262b406b707db68b0fd450dc08b34efb73dd5a4771d37a2

4.3 设定kubectl

kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。

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

//如果 kubectl get cs 发现集群不健康,更改以下两个文件

vim /etc/kubernetes/manifests/kube-scheduler.yaml 
vim /etc/kubernetes/manifests/kube-controller-manager.yaml修改如下内容把--bind-address=127.0.0.1变成--bind-address=192.168.80.10		#修改成k8s的控制节点master01的ip
把httpGet:字段下的hosts由127.0.0.1变成192.168.80.10(有两处)
#- --port=0					# 搜索port=0,把这一行注释掉systemctl restart kubelet

4.4 所有节点部署网络插件flannel

方法一: //所有节点上传 flannel 镜像 flannel.tar 和网络插件 cni-plugins-linux-amd64-v0.8.6.tgz 到 /opt 目录,master节点上传 kube-flannel.yml 文件

cd /opt
docker load < flannel.tar
docker load < flannel-cni-plugin.tar
mv /opt/cni /opt/cni_bak
mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

//在 master 节点创建 flannel 资源

cd /opt
docker load < flannel.tar
docker load < flannel-cni-plugin.tar
mv /opt/cni /opt/cni_bak
mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/binkubectl apply -f kube-flannel.yml 

方法二:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

//在 node 节点上执行 kubeadm join 命令加入群集

kubeadm join 192.168.30.105:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:2fbbd9a76750e2778f056e60e2aa3bc499a6491e745f09b453741a25c6881123

//在master节点查看节点状态

kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
master01   Ready    control-plane,master   55m   v1.20.15
node01     Ready    <none>                 10m   v1.20.15
node02     Ready    <none>                 11m   v1.20.15kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
coredns-54d67798b7-2tfmh           1/1     Running   0          55m
coredns-54d67798b7-pbxsd           1/1     Running   0          55m
etcd-master01                      1/1     Running   0          55m
kube-apiserver-master01            1/1     Running   0          55m
kube-controller-manager-master01   1/1     Running   0          47m
kube-proxy-kml8t                   1/1     Running   0          55m
kube-proxy-sb966                   1/1     Running   0          10m
kube-proxy-t6wfj                   1/1     Running   0          11m
kube-scheduler-master01            1/1     Running   0          50m

//测试 pod 资源创建

kubectl create deployment nginx --image=nginxkubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-nzdk7   1/1     Running   0          54s   10.244.1.2   node02   <none>           <none>

//暴露端口提供服务

kubectl expose deployment nginx --port=80 --type=NodePortkubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        60m
nginx        NodePort    10.96.38.255   <none>        80:32112/TCP   99s

//测试访问

curl http://node02:32112

//扩展3个副本

kubectl scale deployment nginx --replicas=3
kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-nzdk7   1/1     Running   0          6m    10.244.1.2   node02   <none>           <none>
nginx-6799fc88d8-q4vdt   1/1     Running   0          33s   10.244.2.3   node01   <none>           <none>
nginx-6799fc88d8-zw949   1/1     Running   0          33s   10.244.2.2   node01   <none>           <none>

相关文章:

【 云原生 | K8S 】kubeadm 部署Kubernetes集群

目录 1 环境准备 2 所有节点安装docker 3 所有节点安装kubeadm&#xff0c;kubelet和kubectl 4 部署K8S集群 4.1 查看初始化需要的镜像 4.2 初始化kubeadm 4.3 设定kubectl 4.4 所有节点部署网络插件flannel master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&am…...

微信小程序rich-text 文本首行缩进和图片居中和富文本rich-text 解析多个空格不成功 nbsp

微信小程序开发使用rich-text组件渲染html格式的代码&#xff0c;常常因为不能自定义css导致文本不能缩进&#xff0c;以及图片不能居中等问题&#xff0c;这里可以考虑使用js的replace方法&#xff0c;替换字符串&#xff0c;然后在渲染的同时加载行内样式。 //获取字符串的图…...

uniapp 设置重写uni-body-page样式,输入字母转大写,条形码扫描

uniapp 设置重写uni-body-page样式&#xff0c;输入字母转大写 一、重写uni-body-page样式 page{ }二、输入字母转大写 input标签设置样式&#xff1a; style"text-transform: uppercase;"绑定的值通过.toUpperCase()转大写 三、条形码扫描 // 调起条码扫描uni…...

【uniapp/uview1.x】u-upload 在 v-for 中的使用时, before-upload 如何传参

引入&#xff1a; 是这样一种情况&#xff0c;在接口获取数据之后&#xff0c;是一个数组列表&#xff0c;循环展示后&#xff0c;需要在每条数据中都要有图片上传&#xff0c;互不干扰。 分析&#xff1a; uview 官网中有说明&#xff0c;before-upload 是不加括号的&#xff…...

求组合数(笔记)

//组合数2&#xff0c;取值在1e5 //Cab a! / (a - b)! * b! #include<iostream> using namespace std; using ll long long; const ll N 1e4 9, mod 1e9 7; ll fact[N], infact[N];//阶乘&#xff0c;逆元阶乘ll qmi(ll a, ll k, ll p)//逆元模板 {ll res 1;while…...

《视觉SLAM十四讲》-- 后端 1(下)

8.2 BA 与图优化 Bundle Adjustment 是指从视觉图像中提炼出最优的 3D 模型和相机参数&#xff08;内参和外参&#xff09;。 8.2.1 相机模型和 BA 代价函数 我们从一个世界坐标系中的点 p \boldsymbol{p} p 出发&#xff0c;把相机的内外参数和畸变都考虑进来&#xff0c;…...

io+day8

#ifndef __SEM2 #define __SEM3 4 //声明一个创>5 int init_sem(6 7 //声明一个p操8 int P(int sem9 10 //声明一个v操11 int W(int sem12 13 //声明一个删>14 int del_sem(i15 16 #endif 1 #include <myhead.h> …...

【图像处理:OpenCV-Python基础操作】

【图像处理&#xff1a;OpenCV-Python基础操作】 1 读取图像2 显示图像3 保存图像4 图像二值化、灰度图、彩色图&#xff0c;像素替换5 通道处理&#xff08;通道拆分、合并&#xff09;6 调整尺寸大小7 提取感兴趣区域、掩膜8 乘法、逻辑运算9 HSV色彩空间&#xff0c;获取特定…...

Java 简单实现一个 TCP 回显服务器

文章目录 TCP 服务端TCP 客户端实现效果TCP 服务端(实现字典功能)总结 TCP 服务端 package network;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Soc…...

邦芒攻略:新手求职面试需要准备的材料

新手求职面试需要准备的材料&#xff0c;求职材料是求职者写给用人单位的信&#xff0c;目的是让对方了解自己&#xff0c;准备好充足的资料和自信的心态会让面试通过的几率大大增强&#xff0c;那么应聘者需要准备的材料呢&#xff0c;来看看吧。 ​ ​1、求职信。也是求职者…...

在docker下安装suiteCRM

安装方法&#xff1a; docker-hub来源&#xff1a;https://hub.docker.com/r/bitnami/suitecrm curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/suitecrm/docker-compose.yml > docker-compose.yml//然后可以在docker-compose.yml文件里修…...

【Python大数据笔记_day08_hive查询】

hive查询 语法结构: SELECT [ALL | DISTINCT] 字段名, 字段名, ... FROM 表名 [inner | left outer | right outer | full outer | left semi JOIN 表名 ON 关联条件 ] [WHERE 非聚合条件] [GROUP BY 分组字段名] [HAVING 聚合条件] [ORDER BY 排序字段名 asc | desc] [CLUSTE…...

魔众文库系统 v5.6.0 DWG文件格式支持,部分数据封面显示异常,定时调度清理临时文件

魔众文库系统基于文档系统知识&#xff0c;建立平台与领域&#xff0c;打造流量、用户、付费和变现的闭环&#xff0c;帮助您更好的搭建文库系统。 魔众文库系统发布v5.6.0版本&#xff0c;新功能和Bug修复累计17项&#xff0c;DWG文件格式支持&#xff0c;部分数据封面显示异…...

2023 PostgreSQL 数据库生态大会:解读拓数派大数据计算系统及其云存储底座

11月3日-5日&#xff0c;由中国开源软件推进联盟 PostgreSQL 分会主办的中国 PostgreSQL 数据库生态大会在北京中科院软件所隆重举行。大会以”极速进化融合新生”为主题&#xff0c;从线下会场和线上直播两种方式展开&#xff0c;邀请了数十位院士、教授、高管和社群专家&…...

Android10 手势导航

种类 Android10 默认的系统导航有三种&#xff1a; 1.两个按钮的 2.三个按钮的 3.手势 它们分别对应三个包名 frameworks/base/packages/overlays/NavigationBarMode2ButtonOverlay frameworks/base/packages/overlays/NavigationBarMode3ButtonOverlay frameworks/base/packa…...

Pinia 插件 pinia-plugin-persist 添加 persist 属性时报错:没有与此调用匹配的重载

项目场景&#xff1a; Vue3TS 语言Pinia插件&#xff1a;pinia-plugin-persist 问题描述 代码如下&#xff1a; import { defineStore } from piniaexport const useInfoStore defineStore(info, {state: () > {return {activeIndex: 0}},actions: {updateIndex(active…...

Django知识

目录 一.request对象方法 1.request.method 2.request.POST 3.request.GET 4.request.FILES 5.request.path 二.FBV与CBV引入 1.FBV 2.CBV (1)路由 (2)视图 3.详解 (1)FBV (2)CBV (3)小结 三.CBV源码剖析 1.as_view方法 &#xff08;1&#xff09;路由对应函…...

vue2+antd——实现权限管理——js数据格式处理(回显+数据结构渲染)

vue2antd——实现权限管理——js数据格式处理 效果图如下&#xff1a;1.需求说明2.如何展开所有子项及孙子项目——在弹窗之前就获取树形结构&#xff0c;然后直接将数据传到弹窗中3.template部分代码4.script的data部分5.权限tree数据处理——将row中的权限分配到具体的value参…...

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

目录 一、cenc-aes-ctr 原理介绍 二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr 三、加密工具---ffmpeg 四、播放---ffplay 五、总结 ​​​​​​​一、cenc-aes-ctr 原理介绍 加密算法&#xff1a;CENC-AES-CTR 使用 AES&#xff08;Advanced Encryption Standard&…...

网络安全/黑客技术(0基础入门到进阶提升)

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...