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

KubeSphere实战

文章目录

  • 一、KubeSphere平台安装
    • 1、Kubernetes上安装KubeSphere
      • 1.1 安装docker
      • 1.2 安装Kubernetes
      • 1.3 前置环境之nfs存储
      • 1.4 前置环境之metrics-server
      • 1.5 安装KubeSphere
    • 2、Linux单节点部署KubeSphere
    • 3、Linux多节点部署KubeSphere(推荐)
  • 二、KubeSphere实战
    • 1、多租户实战
    • 2、中间件部署实战
      • 2.1 MySql部署
      • 2.2 redis部署
      • 2.3 部署ElasticSearch
      • 2.4 应用商店部署
      • 2.5 应用仓库部署(推荐)
    • 3、RuoYi-Cloud部署实战
      • 3.1 本地部署
      • 3.2 k8s中间件部署
      • 3.3 微服务层部署
    • 4、云原生DevOps实战
      • 4.1 环境和中间件准备
      • 4.2 Jenkins构建
      • 4.3 webhook

一、KubeSphere平台安装

官网:https://kubesphere.com.cn/

1、Kubernetes上安装KubeSphere

1.1 安装docker

# centos7.9,建议机器4核8G
sudo yum remove docker*
sudo yum install -y yum-utils#配置docker的yum地址
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装指定版本
sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6#  启动&开机启动docker
systemctl enable docker --now# docker加速配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

1.2 安装Kubernetes

首先基本环境的安装,每个机器使用内网ip互通,每个机器配置自己的hostname,不能用localhost

#设置每个机器自己的hostname,k8s-master/node1/node2
hostnamectl set-hostname xxx# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config# 关闭防火墙,云的花内网需要互通
systemctl stop firewalld
# 禁用 firewalld 服务
systemctl disable firewalld#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

然后安装kubelet、kubeadm、kubectl

#配置k8s的yum源地址
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF#安装 kubelet,kubeadm,kubectl
sudo yum install -y kubelet-1.21.9 kubeadm-1.21.9 kubectl-1.21.9#启动kubelet
sudo systemctl enable --now kubelet#所有机器配置master域名,改成自己的ip
echo "192.168.249.146  k8s-master" >> /etc/hosts
cat > /etc/hosts <<EOF
192.168.249.146  k8s-master
192.168.249.147  node1
192.168.249.148  node2
EOF

初始化master节点

# 注意ip和主机名的修改
kubeadm init \
--apiserver-advertise-address=192.168.249.146 \
--control-plane-endpoint=k8s-master \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.9 \
--service-cidr=10.96.0.0/12  \
--pod-network-cidr=10.244.0.0/16# 然后记录相关信息
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 安装Calico网络插件
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
# 如果失败了就自己手动下载导入
# https://github.com/projectcalico/calico/releases
kubectl apply -f calico.yaml
# 如果手动下载,无法下载镜像时,所有结点导入calico-cni/calico-node/calico-pod2daemon-flexvol,master结点需要额外导入calico-kube-controllers# 最后node结点加入集群# 对于重置结点,现在主节点去除
kubectl delete node  node2
kubectl get node
# 然后node2从节点重置
kubeadm reset

1.3 前置环境之nfs存储

安装nfs-server

# 在每个机器
yum install -y nfs-utils# 在master 执行以下命令 
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports# 执行以下命令,启动 nfs 服务;创建共享目录
mkdir -p /nfs/data# 在master执行
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server# 使配置生效
exportfs -r#检查配置是否生效
exportfs# 配置nfs-client(选做)
# 注意在非master结点,注意ip修改
showmount -e 192.168.249.146
mkdir -p /nfs/data
mount -t nfs 192.168.249.146:/nfs/data /nfs/data

配置默认存储,在master执行,vim sc.yaml,注意nfs地址改成自己的

## 创建了一个存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-storageannotations:storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:archiveOnDelete: "true"  ## 删除pv的时候,pv的内容是否要备份---
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/kubesphereio/nfs-subdir-external-provisioner:v4.0.2# resources:#    limits:#      cpu: 10m#    requests:#      cpu: 10mvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.249.146 ## 指定自己nfs服务器地址- name: NFS_PATH  value: /nfs/data  ## nfs服务器共享的目录volumes:- name: nfs-client-rootnfs:server: 192.168.249.146path: /nfs/data
---
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io

确认配置是否生效,kubectl get sc,这样配置完成之后就拥有动态创建pv的能力,例如如下可以自行测试

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 3Gi

1.4 前置环境之metrics-server

metrics-server是集群指标监控组件(这里用了别人的镜像库),vim metrics.yaml

apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:labels:k8s-app: metrics-serverrbac.authorization.k8s.io/aggregate-to-admin: "true"rbac.authorization.k8s.io/aggregate-to-edit: "true"rbac.authorization.k8s.io/aggregate-to-view: "true"name: system:aggregated-metrics-reader
rules:
- apiGroups:- metrics.k8s.ioresources:- pods- nodesverbs:- get- list- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:labels:k8s-app: metrics-servername: system:metrics-server
rules:
- apiGroups:- ""resources:- pods- nodes- nodes/stats- namespaces- configmapsverbs:- get- list- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:labels:k8s-app: metrics-servername: metrics-server-auth-readernamespace: kube-system
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccountname: metrics-servernamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:labels:k8s-app: metrics-servername: metrics-server:system:auth-delegator
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:auth-delegator
subjects:
- kind: ServiceAccountname: metrics-servernamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:labels:k8s-app: metrics-servername: system:metrics-server
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:metrics-server
subjects:
- kind: ServiceAccountname: metrics-servernamespace: kube-system
---
apiVersion: v1
kind: Service
metadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system
spec:ports:- name: httpsport: 443protocol: TCPtargetPort: httpsselector:k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system
spec:selector:matchLabels:k8s-app: metrics-serverstrategy:rollingUpdate:maxUnavailable: 0template:metadata:labels:k8s-app: metrics-serverspec:containers:- args:- --cert-dir=/tmp- --kubelet-insecure-tls- --secure-port=4443- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname- --kubelet-use-node-status-portimage: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/metrics-server:v0.4.3imagePullPolicy: IfNotPresentlivenessProbe:failureThreshold: 3httpGet:path: /livezport: httpsscheme: HTTPSperiodSeconds: 10name: metrics-serverports:- containerPort: 4443name: httpsprotocol: TCPreadinessProbe:failureThreshold: 3httpGet:path: /readyzport: httpsscheme: HTTPSperiodSeconds: 10securityContext:readOnlyRootFilesystem: truerunAsNonRoot: truerunAsUser: 1000volumeMounts:- mountPath: /tmpname: tmp-dirnodeSelector:kubernetes.io/os: linuxpriorityClassName: system-cluster-criticalserviceAccountName: metrics-servervolumes:- emptyDir: {}name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:labels:k8s-app: metrics-servername: v1beta1.metrics.k8s.io
spec:group: metrics.k8s.iogroupPriorityMinimum: 100insecureSkipTLSVerify: trueservice:name: metrics-servernamespace: kube-systemversion: v1beta1versionPriority: 100

测试

kubectl top nodes
kubectl top pod -A

1.5 安装KubeSphere

安装文档参考:https://kubesphere.com.cn/docs/v3.3/quick-start/minimal-kubesphere-on-k8s/

# 这里安装需要国外源网络
# 下载核心文件
wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/kubesphere-installer.yaml
wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/cluster-configuration.yamlkubectl apply -f kubesphere-installer.yaml
# 注意在启动这个文件前可以选择额外功能,这里默认最小安装,要啥功能将false改为true即可
kubectl apply -f cluster-configuration.yaml# 在 cluster-configuration.yaml中指定我们需要开启的功能参照官网"启用可插拔组件":https://kubesphere.com.cn/docs/pluggable-components/overview/kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
# 成功后访问
# 访问任意机器的 30880端口
# 账号 : admin
# 密码 : P@88w0rd# 解决etcd监控证书找不到问题
kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs  --from-file=etcd-client-ca.crt=/etc/kubernetes/pki/etcd/ca.crt  --from-file=etcd-client.crt=/etc/kubernetes/pki/apiserver-etcd-client.crt  --from-file=etcd-client.key=/etc/kubernetes/pki/apiserver-etcd-client.key

2、Linux单节点部署KubeSphere

官网参考:https://kubesphere.com.cn/docs/v3.3/quick-start/all-in-one-on-linux/

# 首先指定一下hostname
hostnamectl set-hostname node1# 安装
# 准备KubeKey,国内的下载
export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | VERSION=v2.3.0 sh -# 使其拥有可执行权限
chmod +x kk# 开始安装下载
# ./kk create cluster [--with-kubernetes version] [--with-kubesphere version]
./kk create cluster --with-kubernetes v1.22.12 --with-kubesphere v3.3.1# 验证安装结果
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) 通过 <NodeIP>:30880 访问控制台
# kubectl get pod --all-namespaces 查看相关组件情况

仅适用于默认的最小化安装。若要在 KubeSphere 中启用其他组件,请参见启用可插拔组件

进入可视化后也可以启用需要的组件,以 admin 用户登录控制台,点击左上角的平台管理,选择集群管理,点击定制资源定义,在搜索栏中输入 clusterconfiguration,点击选择需要打开的插件即可

3、Linux多节点部署KubeSphere(推荐)

官网:https://kubesphere.com.cn/docs/v3.3/installing-on-linux/introduction/multioverview/

# 最小安装最低要求2c4g(如果性能好,推荐master4c8g/node8c16g)
# 使用KubeKey创建集群
export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | VERSION=v2.3.0 sh -
chmod +x kk# 创建集群配置文件
# ./kk create config [--with-kubernetes version] [--with-kubesphere version] [(-f | --file) path]
./kk create config --with-kubernetes v1.21.4 --with-kubesphere v3.3.1
# 然后这里会生成配置文件,修改配置文件,主要修改三台主机,例如下面,主要是修改ip以及指定master,node等
# ===================================================================
# address是公有地址,internalAddress是实例的私有 IP 地址,我这里虚拟机都填写私有地址了
spec:hosts:- {name: master, address: 192.168.249.146, internalAddress: 192.168.249.146, user: root, password: " "}- {name: node1, address: 192.168.249.147, internalAddress: 192.168.249.147, user: root, password: " "}- {name: node2, address: 192.168.249.148, internalAddress: 192.168.249.148, user: root, password: " "}roleGroups:etcd:- mastercontrol-plane: - masterworker:- node1- node2controlPlaneEndpoint:## Internal loadbalancer for apiservers # internalLoadbalancer: haproxy
# ========================================================================# 使用配置文件创建集群,注意这里可能会有依赖缺失,根据提示yum install xxx安装即可
yum install -y conntrack socat conntrack socat conntrack socat
./kk create cluster -f config-sample.yaml# 结束后可以通过 <NodeIP:30880 使用默认帐户和密码 (admin/P@88w0rd) 访问 KubeSphere 的 Web 控制台# 查看进度,这个版本好像命令行没有kubectl 了,kubectl在web可以查看
# 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

二、KubeSphere实战

1、多租户实战

参考文档:https://kubesphere.com.cn/docs/v3.3/quick-start/create-workspace-and-project/

首先平台管理员admin创建不同用户,包括企业空间管理员bigboss-li和普通成员若干,然后进入企业空间管理员bigboss-li账户,创建不同的企业空间(例如杭州),他可以管理所有企业空间,每一个企业空间里邀请指定一个人为该空间管理员,例如hangzhou-boss,然后该角色可以邀请其他人为普通人员;

然后hangzhou-boss邀请pm-wang为项目总监负责人,wang可以创建多个项目,可以邀请该企业空间的人到不同的项目,并分配不同的角色,例如这个项目的管理员,而项目管理员又可以邀请这个企业空间的人到此项目中,并分配不同的权限,例如开发者/观察者等

在这里插入图片描述

2、中间件部署实战

官网快速入门例子:https://kubesphere.com.cn/docs/v3.3/quick-start/wordpress-deployment/
dockerhub:https://hub.docker.com/

2.1 MySql部署

在这里插入图片描述

# 正常docker部署
docker run -p 3306:3306 --name mysql-01 \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
--restart=always \
-d mysql:5.7 # 首先进入dev-lu的账号,这里管理员已经创建好了项目mail
# mysql配置示例
[client]
default-character-set=utf8mb4[mysql]
default-character-set=utf8mb4[mysqld]
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
lower_case_table_names=1

kubesphere首先进去项目(例如我这里项目是mail),然后创建配置(在配置→配置字典里,名字随便取,里面设置key为xx.cnf,值为上面的配置内容);然后创建存储(持久卷声明,这里暂时是local类型进行测试);最后创建有状态副本集,选择镜像,选择容器(使用容器默认配置,然后注意勾选环境变量和时间同步,把MYSQL_ROOT_PASSWORD=root写入,也可以限制一下资源),最后挂载卷和配置文件,成功创建(如果创建失败需要更改一下docker源)

注意集群内部可以直接通过应用的 【服务名.项目名】 直接访问 (默认),可以尝试ping

如果要修改内部访问域名,可以在服务里删除默认的,自行创建内部集群和外部访问两个service(注意是选择指定工作负载),也可以直接从服务里进行部署

在这里插入图片描述

2.2 redis部署

# ================这是之前的部署方式=============================
#创建配置文件
## 1、准备redis配置文件内容
mkdir -p /mydata/redis/conf && vim /mydata/redis/conf/redis.conf##配置示例
appendonly yes
port 6379
bind 0.0.0.0#docker启动redis
docker run -d -p 6379:6379 --restart=always \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-v  /mydata/redis-01/data:/data \--name redis-01 redis:6.2.5 \redis-server /etc/redis/redis.conf

在这里插入图片描述

kubesphere方式部署和mysql类似,不过注意有状态副本集建议在内部直接创建存储,这样每增加一个副本就会新增一个pvc,否则会共用一个

2.3 部署ElasticSearch

# 创建数据目录
mkdir -p /mydata/es-01 && chmod 777 -R /mydata/es-01# 容器启动
docker run --restart=always -d -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v es-config:/usr/share/elasticsearch/config \
-v /mydata/es-01/data:/usr/share/elasticsearch/data \
--name es-01 \
elasticsearch:7.13.4

在这里插入图片描述

因为考虑到/usr/share/elasticsearch/config文件夹下有很多默认配置文件,所以不能直接使用配置文件挂载,否则会直接被覆盖,注意这里创建副本时要选择子路径,选择到具体文件覆盖

在这里插入图片描述

2.4 应用商店部署

参考:https://kubesphere.com.cn/docs/v3.3/pluggable-components/app-store/

2.5 应用仓库部署(推荐)

官网参考:https://helm.sh/zh/
包搜索中心:https://artifacthub.io/

应用商店应用少,更多建议直接使用helm应用仓库进行安装部署,类似于dockerhub。首先去企业空间→应用管理→应用仓库添加bitnami仓库(需要对应权限角色,仓库地址https://charts.bitnami.com/bitnami),同步完成后进入项目→应用负载→应用→从项目模板导入,选择导入的bitnami仓库即可选择对应的镜像了

3、RuoYi-Cloud部署实战

官网:https://gitee.com/y_project/RuoYi-Cloud
架构图:https://gitee.com/zhangmrit/ruoyi-cloud/blob/nacos/doc/ruoyi-cloud.png

3.1 本地部署

首先需要在本地进行跑起来,才能成功上云,首先clone若依项目,然后在本地创建数据库,根据项目数据库文件,注意这里需要自行创建ry-cloud数据库,然后再将quartz和ry表导入,其他两个会自行创建数据库,然后下载Nacos配置中心,进入conf/application.properties,可以直接在文件末尾直接添加

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

然后进入bin目录startup.cmd -m standalone启动,进入后在配置列表修改所有数据库的账号密码(根据自己账号密码来修改),最后启动redis即可,然后启动前后端

3.2 k8s中间件部署

首先创建一个新项目his,然后点击应用负载→服务→创建有状态服务(这样就可以直接自定义DNS域名了),根据上面情况部署mysql和redis,然后将数据库文件导入(注意这里需要自行创建ry-cloud数据库,然后再将quartz和ry表导入,其他两个会自行创建数据库);

其次部署nacos集群,这里有个问题,nacos集群要设置每个naocs的IP地址,这里就需要进行有状态部署,这样就可以使用固定域名进行配置。然后我们需要获取一下固定域名,首先创建多个nacos有状态副本,然后进入nacos服务,获取总的nacos域名,打开随机一个nacos容器进行ping his-nacos.his,这样就可以获取每个nacos的域名规律,比如我的his-nacos-v1-0.his-nacos.his.svc.cluster.local(pod名+服务名+固定)就代表是nacos1

在这里插入图片描述

然后正式创建nacos集群,首先需要抽取两个配置文件application.properties(上面粘贴,但是数据库ip换成mysql服务器域名,比如我的his-mysql.his)和cluster.conf(然后选择服务→有状态部署,取名his-nacos,版本v1)

his-nacos-v1-0.his-nacos.his.svc.cluster.local:8848
his-nacos-v1-1.his-nacos.his.svc.cluster.local:8848
his-nacos-v1-2.his-nacos.his.svc.cluster.local:8848

然后重新创建nacos,挂载映射路径为/home/nacos/conf/xxx(需要挂载到子路径,否则其他就被覆盖了),启动三个nacos,然后查看日志,成功暴露一下外部service,最后登录尝试http://192.168.249.146:32735/nacos/,然后修改里面mysql和redis的连接ip,换成DNS域名,同时账号密码设置一下。这里集群模式的话需要版本v2.1.0,也可以直接单节点模式启动(单节点增加环境变量MODE=standalone,如果集群的话需要增加环境变量PREFER_HOST_MODE=hostname,具体可以参考nacos dockerhub)

3.3 微服务层部署

下面的Dockerfile文件需要放置在每一个项目根目录,方便打包,官方可以参考:https://gitee.com/y_project/RuoYi-Cloud/tree/v3.6.1/docker

# 规则:
# 容器默认以8080端口启动
# 时间为CST
# 环境变量 PARAMS 可以动态指定配置文件中任意的值
# nacos集群内地址为  his-nacos.his:8848 
# 微服务默认启动加载 nacos中   服务名-激活的环境.yml  文件,所以线上的配置可以全部写在nacos中FROM openjdk:8-jdk
LABEL maintainer=shawn# 注意这里要登陆nacos创建prod命名空间。然后将dev的配置文件克隆到prod,同时改dev后缀为prod
#docker run -e PARAMS="--server.port 9090"
ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.discovery.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezoneCOPY target/*.jar /app.jar
EXPOSE 8080#
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]

打包好docker镜像后可以推送到仓库,也可以搭建自己私有仓库Harbor

docker login --username=forsum**** registry.cn-hangzhou.aliyuncs.com#把本地镜像,改名,成符合阿里云名字规范的镜像。
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/镜像名:[镜像版本号]
## docker tag 461955fe1e57 registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v1docker push registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/镜像名:[镜像版本号]
## docker push registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v1# ruoyi所有镜像
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-auth:v2
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-file:v2
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-gateway:v2
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-job:v2
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-system:v2
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v2
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-ui:v2

然后开始正式部署微服务层,

  • 应用一启动会获取到 “应用名-激活的环境标识.yml”
  • 每次部署应用的时候,需要提前修改nacos线上配置,确认好每个中间件的连接地址是否正确

在这里插入图片描述

4、云原生DevOps实战

4.1 环境和中间件准备

项目地址:
https://gitee.com/leifengyang/yygh-parent
https://gitee.com/leifengyang/yygh-admin
https://gitee.com/leifengyang/yygh-site

首先在kubesphere打开devops开关,在原来his的项目中添加其他中间件,sentienl可以选择leifengyang/sentinel:1.8.2,mongodb/RabbitMQ可以从模板创建,ElasticSearch创建与之前方法类似吗

中间件集群内地址外部访问地址
Nacoshis-nacos.his:8848http://192.168.249.146:30397/nacos
MySQLhis-mysql.his:3306192.168.249.146:31840
Redishis-redis.his:6379192.168.249.146:31968
Sentinelhis-sentinel.his:8080http://192.168.249.146:31229
MongoDBmongodb.his:27017192.168.249.146:30640
RabbitMQrabbitm-rabbitmq.his:5672192.168.249.146:31018
ElasticSearchhis-es.his:9200192.168.249.146:31300

然后抽取项目配置,把生产环境分开,项目默认规则

  • 每个微服务项目,在生产环境时,会自动获取 微服务名-prod.yml 作为自己的核心配置文件
  • 每个微服务项目,在生产环境时,默认都是使用 8080 端口

4.2 Jenkins构建

Jenkins官网
构建和部署 Maven 项目参考:https://kubesphere.io/zh/docs/v3.3/devops-user-guide/examples/a-maven-project/

首先在企业空间创建DevOps项目(如果一直处于等待状态,可以尝试重启一下docker或者换个密码),点击进入后创建流水线,编辑流水线,可以先选择一个CI/CD模板,这样就可以看见可视化界面了,然后编辑可视化流水线,最后可以导出Jenkinsfile。这里kubesphere有内置容器和代理,可以参考Jenkins代理文档,然后一步步进行编辑即可。

第一步拉取代码,配置好地址和凭证,可以打印一下输出

在这里插入图片描述

第二步项目编译,maven项目打包,mvn clean package -Dmaven.test.skip=true(如果有弹框要输入,先随便输入),这里我们可以配置maven加速(已经下载过的jar包,下一次流水线的启动,不会重复下载)

  • 使用admin登陆ks
  • 进入集群管理
  • 进入配置中心
  • 找到配置ks-devops-agent
  • 修改这个配置,加入maven阿里云镜像加速地址

第三步打包Docker镜像,将每个jar包打包成镜像

第四步推送最新镜像到镜像仓库,注意改成自己镜像仓库,这里jenkinsfile可以设置环境变量,然后再推送那里进行变量替换

第五步进行镜像部署,注意这一步要创建好kubectl集群凭证和阿里云凭证,然后在每一个项目放置好deploy.yml文件,变量都需要在jenkinsfile里定义好(发布到生产环境可以卡点)

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: hospital-managename: hospital-managenamespace: his   #一定要写名称空间
spec:progressDeadlineSeconds: 600replicas: 1selector:matchLabels:app: hospital-managestrategy:rollingUpdate:maxSurge: 50%maxUnavailable: 50%type: RollingUpdatetemplate:metadata:labels:app: hospital-managespec:imagePullSecrets:- name: aliyun-docker-hub  #提前在项目下配置访问阿里云的账号密码containers:- image: $REGISTRY/$ALIYUNHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER#         readinessProbe:#           httpGet:#             path: /actuator/health#             port: 8080#           timeoutSeconds: 10#           failureThreshold: 30#           periodSeconds: 5imagePullPolicy: Alwaysname: appports:- containerPort: 8080protocol: TCPresources:limits:cpu: 300mmemory: 600MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysterminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:labels:app: hospital-managename: hospital-managenamespace: his
spec:ports:- name: httpport: 8080protocol: TCPtargetPort: 8080selector:app: hospital-managesessionAffinity: Nonetype: ClusterIP

jenkinsfile举例,其中几步可以并发构建,自行填写相应信息

pipeline {agent {node {label 'maven'}}stages {stage('拉取代码') {agent nonesteps {container('maven') {git(url: 'https://gitee.com/LXT2017/yygh-parent', credentialsId: 'gitee', branch: 'master', changelog: true, poll: false)sh 'ls -la'}}}stage('项目编译') {agent nonesteps {container('maven') {sh 'ls'sh 'mvn clean package -Dmaven.test.skip=true'}sh 'ls server-gateway/target'}}stage('default-2') {parallel {stage('构建hospital-manage镜像') {steps {container('maven') {sh 'ls hospital-manage/target'sh 'docker build -t hospital-manage:latest -f hospital-manage/Dockerfile  ./hospital-manage/'}}}}}stage('default-3') {parallel {stage('推送hospital-manage镜像') {agent nonesteps {container('maven') {withCredentials([usernamePassword(credentialsId : 'aliyun-docker' ,passwordVariable : 'DOCKER_PWD_VAR' ,usernameVariable : 'DOCKER_USER_VAR' ,)]) {sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'}}}}}}stage('default-4') {parallel{stage('hospital-manage - 部署到dev环境'){steps {container ('maven') {withCredentials([kubeconfigFile(credentialsId: env.KUBECONFIG_CREDENTIAL_ID,variable: 'KUBECONFIG')]) {sh 'envsubst < hospital-manage/deploy/deploy.yml | kubectl apply -f -'}}}}}}}environment {DOCKER_CREDENTIAL_ID = 'dockerhub-id'GITHUB_CREDENTIAL_ID = 'github-id'KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'DOCKERHUB_NAMESPACE = 'llxxtt'GITHUB_ACCOUNT = 'kubesphere'APP_NAME = 'devops-java-sample'ALIYUNHUB_NAMESPACE = 'llxxtt'}parameters {string(name: 'TAG_NAME', defaultValue: '', description: '')}
}

最后一步可以添加邮件功能,kubesphere全局设置在平台设置里配置不同服务(会发生报警监控等),而流水线的邮件服务可以参考:为 KubeSphere 流水线设置电子邮件服务器

其他模块同理

4.3 webhook

  • 每个项目,都有流水线文件(比如创建好连接远程仓库的流水线项目)
  • 点击流水线,里面谁有webhook地址,可以挂载在远程仓库的webhook
  • 写代码并提交------> gitee ---------> 给指定的地方发请求(webhook)------> kubesphere平台感知到 -----> 自动启动流水线继续运行

参考

https://www.bilibili.com/video/BV13Q4y1C7hS

https://www.yuque.com/leifengyang/oncloud/

相关文章:

KubeSphere实战

文章目录一、KubeSphere平台安装1、Kubernetes上安装KubeSphere1.1 安装docker1.2 安装Kubernetes1.3 前置环境之nfs存储1.4 前置环境之metrics-server1.5 安装KubeSphere2、Linux单节点部署KubeSphere3、Linux多节点部署KubeSphere(推荐)二、KubeSphere实战1、多租户实战2、中…...

Linux 简介

Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。 …...

java面试题-泛型异常反射

泛型1.什么是泛型&#xff1f;Java是一种强类型语言&#xff0c;数据类型在编译时必须确定。如果我们想要在代码中使用不同类型的数据&#xff0c;那么就需要为每种类型分别写出相应的代码。这样会导致代码冗长、重复&#xff0c;也不便于维护。为了解决这个问题&#xff0c;Ja…...

详细解读ChatGPT:如何调用ChatGPT的API接口到官方例子的说明以及GitHub上的源码应用和csdn集成的ChatGPT

文章目录1. 解读ChatGPT1.1 词语解释1.2 功能解读2. GitHub上ChatGPT的应用源码3. 调用ChatGPT的API4. 官方例子说明5. 集成ChatGPT自ChatGPT出来到如今&#xff0c;始终走在火热的道路上&#xff0c;如今日活用户破亿&#xff0c;他为何有如此大的魅力&#xff0c;深受广大用户…...

九龙证券|最新评级情况出炉,机构扎堆这一板块!聚氨酯龙头获得最多关注

本周算计254家上市公司获组织“买入型”评级。 电子板块评级组织扎堆 证券时报数据宝计算&#xff0c;2月13日至17日&#xff0c;A股市场53家组织算计进行347次评级&#xff0c;254家上市公司获“买入型”评级&#xff08;包含买入、增持、强烈推荐、推荐&#xff09;。 从申…...

考研复试机试 | C++ | 尽量不要用python,很多学校不支持

目录1.1打印日期 &#xff08;清华大学上机题&#xff09;题目&#xff1a;代码&#xff1a;1.2改一改&#xff1a;上一题反过来问题代码&#xff1a;2.Day of Week &#xff08;上交&&清华机试题&#xff09;题目&#xff1a;代码&#xff1a;3.剩下的树&#xff08;清…...

ChatGPT时代,别再折腾孩子了

今天这篇完全是从两件事儿有感而发。昨天在文印店&#xff0c;在复印机上看到装订好的几页纸&#xff0c;我瞥了一眼&#xff0c;是历史知识点&#xff1a;隋朝大运河分为四段&#xff0c;分别是___ ___ ___ ___&#xff0c;连接了五大河___ ___ ___ ___ ______ 年&#xff…...

万字干货 | 荔枝魔方基于云原生的架构设计与实践

近年来&#xff0c;荔枝集团在国内和海外的业务迅速发展&#xff0c;业务数据规模也是成几何式地增长&#xff0c;海量数据的计算分析场景、业务智能算法应用需求随之而生&#xff0c;为了快速地满足业务发展的需要&#xff0c;我们面临着诸多的技术挑战。技术挑战工程问题资源…...

#科研筑基# python初学自用笔记 第九篇 面向对象编程

面向对象编程 Object Oriented Programming &#xff0c;简称OOP&#xff0c;是一种程序设计思想&#xff0c;这种思想把对象作为程序的基本单元。类是抽象的&#xff0c;对象是具体的&#xff0c;一种类包括其特定的数据或属性&#xff0c;以及操作数据的函数&#xff08;方法…...

Python快速上手系列--邮件发送--详解篇

本章就来一起学习一下跑完自动化脚本后如何自动的发送邮件到指定的邮箱。zmail操作&#xff1a;1. 导包 import zmail2. 邮件内容&#xff0c;包含&#xff1a;主题(subject)、正文(content_text)、附件(attachments)3. 发件人信息&#xff0c;包含&#xff1a;发件人账号&…...

【Bluetooth开发】蓝牙开发入门

BLE 蓝牙设备在生活中无处不在&#xff0c;但是我们也只是将其作为蓝牙模块进行使用&#xff0c;发送简单的AT命令实现数据收发。 那么&#xff0c;像对于一些复杂的使用场合&#xff1a;“车载蓝牙”、"智能手表"、“蓝牙音箱”等&#xff0c;我们不得不去了解底层…...

07:进阶篇 - 在程序中嵌入 CTK Plugin Framework

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 如果已经创建了一个应用程序,现在要将 CTK Plugin Framework 嵌入其中,该如何进行呢? 下面,以《06:进阶篇 - Hello,CTK!》中的插件为例,来演示如何使用 CTK Plugin Framework 来加载插件并获取特定…...

快速低成本动画视频课

快速低成本动画视频课Character Animator能做什么如何用character animator制作动画视频Animate能做什么Adobe Animate和Character Animator结合&#xff0c;如何快速制作低成本动画视频课Character Animator能做什么 Character Animator是Adobe公司的一个动画制作软件&#x…...

大数据平台测试-软件测试常见面试回答(持续更新)

面试造航母&#xff0c;入职拧螺丝。面试&#xff0c;讲点面试官想听的。。。 1、你有过漏测的经历吗&#xff1f; 答&#xff1a;这道题肯定是回答有。然后展开描述。就类似面试官问 你印象比较深的一个bug。。。 测试无穷尽&#xff0c;质量也并非测试一个岗位的责任&…...

链表学习之反转链表

链表解题技巧 额外的数据结构&#xff08;哈希表&#xff09;&#xff1b;快慢指针&#xff1b;虚拟头节点&#xff1b; 反转链表 分别实现单向链表和双向链表的反转。 要求&#xff1a;长度为N的链表&#xff0c;时间复杂度为O(N)&#xff0c;额外空间复杂度为O(1)。 反转…...

ONNXRUNTUIME实例分割网络说明

ONNXRUNTUIME c使用&#xff08;分割网络&#xff09;与相关资料&#xff08;暂记&#xff09; initiate a env with an id name(使用id名称启动env) create session (创建会话 ) onnxenv -> sessioninputname [“x”] ,outputname [“t”]inputnodedim [[1,1,192,192…...

几行代码,就写完懒加载啦?

Ⅰ、前言 「懒加载」是网页中非常 常见的&#xff1b;为了减少系统的压力&#xff0c;对于一些电商系统出场频率非常高&#xff1b;那么大家一般用什么方式去实现 「懒加载」 呢 &#xff1f; ① 通过 scroll 的形式&#xff1a; 通过 滚动「scroll」事件&#xff0c;然后去判…...

PyTorch常用的损失函数(ChatGPT)

L1Loss nn.L1Loss 也称为平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;。它计算预测值与真实值之间的差异&#xff08;即误差&#xff09;&#xff0c;然后取绝对值并求和&#xff0c;最后除以样本数量得到平均误差。具体来说&#xff0c;对于一批…...

LeetCode——1237. 找出给定方程的正整数解

一、题目 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/description/ 翻译一下题目 意思是&#xff0c;这是一个二维单调递增的函数&#xff0c;函数一共有 9 …...

系统编程中的进程的概念No.3【进程状态】

引言&#xff1a; 北京时间&#xff1a;2023/2/17/8:17&#xff0c;目前听着超能陆战队主题曲《Immortals》&#xff0c;感觉又要螺旋式升天&#xff0c;并且为我今天上午没课感到happy&#xff0c;所以继我们很久以前的关于进程的博客&#xff0c;今天我们就再来学习一下有关…...

推荐 3 款 Golang 语义化版本库

文章目录1.什么是语义化版本 2.0.02.Golang 语义化版本库比较3.小结参考文献1.什么是语义化版本 2.0.0 语义化版本 2.0.0&#xff08;Semantic Versioning 2.0.0&#xff09;是一种用于标识软件版本的约定和规范。它包含三个数字组成的版本号&#xff0c;格式为“MAJOR.MINOR.…...

Windows平台使用gdb连接qemu虚拟机上的系统

先安装MinGW&#xff1b; 除了gcc、g&#xff0c;把gdb也选上&#xff1b;可能选第一个就可以了&#xff0c;不清楚把后面几个也选上&#xff1b; 安装完成看一下gcc, g&#xff0c;gdb&#xff0c;编译工具和调试器都有了&#xff1b; 把bin目录加到环境变量&#xff1b; 看一…...

【博客624】MAC地址表、ARP表、路由表(RIB表)、转发表(FIB表)

MAC地址表、ARP表、路由表(RIB表/FIB表) MAC地址表 MAC地址表是交换机等网络设备记录MAC地址和端口的映射关系&#xff0c;代表了交换机从哪个端口学习到了某个MAC地址&#xff0c;交换机把这个信息记录下来&#xff0c;后续交换机需要转发数据的时候就可以根据报文的目的MAC地…...

【蓝桥日记⑤】2014第五届省赛(软件类)JavaA组❆答案解析

【蓝桥日记⑤】2014第五届省赛&#xff08;软件类&#xff09;JavaA组☃答案解析 文章目录【蓝桥日记⑤】2014第五届省赛&#xff08;软件类&#xff09;JavaA组☃答案解析1、猜年龄2、李白打酒3、神奇算式4、写日志5、锦标赛6、六角填数7、绳圈8、兰顿蚂蚁9、斐波那契10、波动…...

Leetcode.1139 最大的以 1 为边界的正方形

题目链接 Leetcode.1139 最大的以 1 为边界的正方形 Rating &#xff1a; 1744 题目描述 给你一个由若干 0 和 1 组成的二维网格 grid&#xff0c;请你找出边界全部由 1 组成的最大 正方形 子网格&#xff0c;并返回该子网格中的元素数量。 如果不存在&#xff0c;则返回 0。…...

Bing+ChatGPT 对传统搜索引擎的降维打击

早些时候申请了新版 Bing 的内测资格&#xff0c;终于收到了通过的邮件。 一天的体验之后&#xff0c;我的感受是&#xff1a;当新版 Bing 具备了 ChatGPT 的聊天能力之后&#xff0c;它的能力不论是对传统搜索引擎&#xff0c;还是 ChatGPT 自身&#xff0c;都将是降维打击。 …...

【JS】数组常用方法总结-功能、参数、返回值

数组常用方法总结-功能、参数、返回值 用简单的js示例 运行在线工具&#xff1a;链接: 菜鸟工具 菜鸟工具示意图&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/de8589eb1acf42abb0347d8a3a3bbdfa.png 1.会改变原有数组方法 &#xff08;1&#xff09;pu…...

pytest 单元测试前后置处理

文章目录方法1 setup/teardown方法2 fixture 夹具方法3 conftest.py测试用例执行前后的一些处理动作&#xff0c;也叫夹具。以下介绍使用前后置操作的几种方法。方法1 setup/teardown setup&#xff0c;每个测试用例执行前要进行的处理。 teardown&#xff0c;每个测试用例执行…...

汽车安全硬件扩展 AUTOSAR SHE SecureHardwareExtensions

SHE&#xff08;Secure Hardware Extension&#xff09;在车联网中&#xff0c;被应用在车端ECU中负责安全存储与安全计算。是由HIS&#xff08;由Audi、BMW、Porsche、Volkswagen组成&#xff09;制定的标准&#xff0c;中文意思“安全硬件扩展”&#xff0c;是对任何给定微控…...

2023年美国大学生数学建模C题:预测Wordle结果建模详解+模型代码

目录 前言 一、题目理解 背景 解析 字段含义&#xff1a; 建模要求 二、建模思路 灰色预测&#xff1a; ​编辑 二次指数平滑法&#xff1a; person相关性 只希望各位以后遇到建模比赛可以艾特认识一下我&#xff0c;我可以提供免费的思路和部分源码&#xff0c;以后…...

网站显示备案号/深圳百度网站排名优化

首先声明&#xff0c;我是一个菜鸟。一下文章中出现技术误导情况盖不负责 1、删除原有的yum: rpm -aq | grep yum | xargs rpm -e –nodeps 2、安装新的yum 《1》rpm –ivh http://mirrors.163.com/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm 注&…...

鞍山网站制作价格/app软件推广怎么做

今天看了一节经典 的“ 3D 计算机视觉”历史简介&#xff0c;就是年代稍稍久远了些。下面通过思维导图的形式进行展示。&#xff08;免责声明&#xff1a;视频是2012年的&#xff0c;因此最新的发展未总结。并且&#xff0c;博主理解能力有限&#xff0c;内容仅供参考&#xff…...

台州百度网站排名/win7一键优化工具

防火墙是一道关卡&#xff0c;阻止******的一种手段&#xff0c;防火墙是安全门&#xff0c;过滤网络的数据包&#xff0c;接下来的主要讲的iptables是一个重要的服务&#xff0c;现在我们隆重推出。 一、iptables基础 1.包的处理方式&#xff1a;DROP,ACCEPT,REJECT,LOG [root…...

网站资料如何做参考文献/seo外链发布

此博文是CentOS 7 在最小化安装之后进行安装Apache服务的操作步骤&#xff0c;httpd版本为httpd-2.4.34。 一、基本服务环境搭建 安装apache需要的基本环境&#xff1a;apr apr-util pcre gcc gcc-c expat-devel Yum install -y gcc gcc-c (apr依赖于gcc) Yum install -y expat…...

在哪个网站上可以找兼职做/网络广告策划的内容

6月29日&#xff0c;阿里巴巴研发效能部与PMI、Teambition联合举办的阿里巴巴研发效能实践日将在杭州西溪园区举行&#xff0c;活动聚焦敏捷精益项目管理。活动详情及报名可点我前往。 项目管理的目的是什么&#xff1f;面对工作中的各种不确定性&#xff0c;如何利用数据帮助项…...

网站统计ip pv/大一html网页制作

2020年江苏专转本各科目难度分析?准备参加2020年江苏专转本考试的考生来说&#xff0c;一定要在考前先来了解一下&#xff0c;下面就跟着库课网校小编一起来看看。2020年江苏专转本各科目难度分析一、语文难度分析阅卷相对以往松了许多&#xff0c;可以参考今年的分数情况&…...