K8s进阶——java集群服务搭建

k8s 部署tomcat完整版 2019独角兽企业重金招聘Python工程师标准>>> ... 阅读详情

  K8s集群搭建完成后,真正完成我们业务的是那些跑在k8s上的pod们。将业务跑在k8s集群只上,我们可以实现根据负载或者资源利用率动态扩容或者缩容我们的后端服务器,更加灵活高效的利用我们的物理设备,且能够实现服务的高可用及故障自治愈,本文将详细介绍以上的具体实现。

实验环境

  本次演示使用主机系统均为ubuntu1804。

节点IP
master节点192.168.32.18、192.168.32.19
node节点192.168.32.21、192.168.32.22
etcd192.168.32.23、192.168.32.24、192.168.32.25
harbor192.168.32.20
NFS服务器192.168.32.20(复用)

  如果机器不够,可以选择复用,例如将etcd的三台主机与master主机和harbor主机复用,可以省下来3台主机。推荐node节点的性能高一些,因为一般之后的pod都将运行在node节点上,如果node节点的资源不足,则很有可能无法创建pod,导致服务启动或者扩容失败。
  具体K8s集群的搭建,可以参考我之前文章使用kubeasz自动化部署K8s。harbor服务器的搭建和部署配置,也可以参考我之前文章Docker(五)——Docker镜像仓库。
  因为是均为内网环境,建议将网络组件calico的IPIP模式(ip-in-ip叠加模式)关掉,使用calico的BGP模式,以节约大量主机内部访问时封装的性能损耗。具体操作可以参考之前博客使用kubeasz自动化部署K8s。

设计架构

  我们设计一个简单架构为例,如下图所示。
k8s架构-java服务集群
  一般负载层是使用物理机上的haproxy服务来实现4层负载,而不是在K8s集群内部pod 实现。我们这里也就将他省略不再细说。
所以我们需要创建一个nginx集群,以及一个tomcat集群。将动态资源,转发给后端的tomcat服务,前端的静态页面由nginx来处理。为了方便我们对后端服务的修改以及部署,我们还需要一个NFS服务器,来共享静态资源以及动态资源,以实现后端服务数据的实时同步。

搭建业务镜像架构

  镜像一般是按层次一级一级实现的,可实现多个业务复用。所以,例如我们将要实现的业务为app1,则我们需要的的镜像,就有对应的app1-nginx及app1-tomcat的业务镜像,以及nginx及tomcat的基础镜像,以及基础系统镜像,我们要一层层的来制作镜像。详细可以参考之前文章Docker(三)——镜像制作。

cd /opt
mkdir -p k8s/{app1,dockerfile,yaml}
cd k8s/dockerfile
mkdir {app1,pub-image,system}

  最终结构如下图所示。

root@DockerUbuntu18:/opt/k8s/dockerfile# tree -d
.
├── app1
│   ├── app1-nginx
│   └── app1-tomcat
├── pub-images
│   ├── jdk
│   │   └── 8
│   ├── nginx-base
│   └── tomcat-base
└── system
    └── centos

  打好的镜像如下所示。

root@DockerUbuntu18:/opt/k8s/dockerfile# docker images
REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
harbor.micepro.net/base/app1-tomcat                  v1                  c7d87d05f8a4        3 days ago          1.19GB
harbor.micepro.net/base/tomcat-base                  v8.5.47             12cf3e12f2d0        3 days ago          1.19GB
harbor.micepro.net/base/jdk-base                     v8.212              1582b1e9cfe4        3 days ago          1.16GB
harbor.micepro.net/base/app1-nginx                   v1                  4836f9aed79b        3 days ago          940MB
harbor.micepro.net/base/nginx-base                   v1.16.1             bfc05a5c23ed        5 days ago          940MB
harbor.micepro.net/base/centos-base                  v7.6                bc7e922a8352        5 days ago          753MB
harbor.micepro.net/base/centos                       base                f1cb7c7d58b7        10 months ago       202MB

配置NFS服务器

  我们计划将动态资源和静态资源都放置至我们的NFS共享存储上,也就是我们的harbor上(任意主机,端口不冲突就可以~)
  可以通过包管理工具快速安装一个NFS服务,毕竟这只是一个辅助工具,无需过多关注。

apt install -y nfs-server
mkdir /data/app1/{images,static,ROOT} -p
echo "/data/app1 *(rw,no_root_squash)" >> /etc/exports
systemctl enable --now nfs-server

  将/data/app1目录整个共享出去即可,之后我们可以直接将NFS挂载至pod中,也可以通过PV/PVC的方式挂载到pod中。
  我们需要修改权限,通过指定uid的方式,使某个UID在多个主机之间都具有权限。这就要求我们之前在创建基础镜像时,也使用的是相同的UID启动程序。例如我们统一都使用www用户,指定UID为2020。(之前创建的容器以及基础镜像中都要修改服务以UID为2020的www用户启动)

编写yaml文件

  此时我们就可以开始着手准备yaml文件,来规划我们的服务pod了。

namespace

  首先我们需要新创建一个namespace,来实现与其他服务隔离。

cd /opt/k8s/
mkdir -p yaml/namespace
vim yaml/namespace/app1.yaml
apiVersion: v1 #API版本
kind: Namespace #类型为namespac
metadata: #定义元数据
  name: app1 #namespace名称

  然后将这个namespace创建出来,使用命令

kubectl apply -f /opt/k8s/yaml/namespace/app1.yaml

  此时使用命令kubectl get ns可以看到我们新创建的namespace

root@DockerUbuntu18:/opt/k8s# kubectl get ns
NAME              STATUS   AGE
app1              Active   20s
default           Active   3d
kube-node-lease   Active   3d
kube-public       Active   3d
kube-system       Active   3d

pod

  先创建好对应的目录,方便后期管理维护。

cd /opt/k8s
mkdir -p app1/{nginx,tomcat}

  然后我们就可以编写pod的yaml文件了。

cd /opt/k8s/app1/nginx

  可以将Deployment和server写在一起,也可以分开写。我们这直接都写在一起。

vim nginx.yaml

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  labels:
    app: app1-nginx-deployment-label
  name: app1-nginx-deployment
  namespace: app1
spec:
  replicas: 2  #设置nginx集群数量
  selector:
    matchLabels:
      app: app1-nginx-selector
  template:
    metadata:
      labels:
        app: app1-nginx-selector
    spec:
      containers:
      - name: app1-nginx-container
        image: harbor.micepro.net/base/app1-nginx:v1
        #command: ["/apps/tomcat/bin/run_tomcat.sh"]
        imagePullPolicy: IfNotPresent
        #imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
        resources:
          limits:
            cpu: 2
            memory: 2Gi
          requests:
            cpu: 500m
#            memory: 1Gi
            memory: 200m

        volumeMounts:
        - name: app1-images
          mountPath: /usr/local/nginx/html/webapp/images
          readOnly: false
        - name: app1-static
          mountPath: /usr/local/nginx/html/webapp/static
          readOnly: false
      volumes:
      - name: app1-images
        nfs:
          server: 192.168.32.20
          path: /data/app1/images
      - name: app1-static
        nfs:
          server: 192.168.32.20
          path: /data/app1/static

---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: app1-nginx-service-label
  name: app1-nginx-service
  namespace: app1
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 30443
  selector:
    app: app1-nginx-selector
cd /opt/k8s/app1/tomcat

  编写tomcat的pod的yaml文件

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  labels:
    app: app1-tomcat-app1-deployment-label
  name: app1-tomcat-app1-deployment
  namespace: app1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app1-tomcat-app1-selector
  template:
    metadata:
      labels:
        app: app1-tomcat-app1-selector
    spec:
      containers:
      - name: app1-tomcat-app1-container
        image: harbor.micepro.net/base/tomcat-app1:v1
        command: ["/usr/local/tomcat/bin/run_tomcat.sh"]
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
        resources:
          limits:
            cpu: 2
            memory: "1000Mi"
          requests:
            cpu: 500m
            memory: "200Mi"

        volumeMounts:
        - name: app1-myapp
          mountPath: /data/tomcat/webapps/ROOT
          readOnly: false

      volumes:
      - name: app1-myapp
        nfs:
          server: 192.168.32.19
          path: /data/app1/ROOT
      - name: app1-static
        nfs:
          server: 192.168.32.19
          path: /data/app1/static
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: app1-tomcat-app1-service-label
  name: app1-tomcat-app1-service
  namespace: app1
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 38080
  selector:
    app: app1-tomcat-app1-selector

修改配置文件

  因为要实现一个通用的nginx+tomcat动静分离web架构,即用户访问的静态页面和图片在由nginx直接响应,而动态请求则基于tomcat的service name转发用户请求到tomcat业务app。
  所以我们需要修改当时创建镜像的nginx的配置文件,配置upstream服务器为tomcat的pod,配置如下

upstream tomcat_webserver {
    server app1-tomcat-app1-service.app1.svc.app1.local:8080;
}
server {
    location /myapp {
        proxy_pass http://tomcat_webserver;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

  其中pod间通信是基于K8s内部DNS实现的,一般是coreDNS或者kubeDNS,如果没有安装是无法解析的,可以使用kubeasz的第七个playbook安装,可参考之前文章使用kubeasz自动化部署K8s。
  主机名默认组成结构为release-name-rancher.default.svc.cluster.local,也就是ServerName.NameSpace.svc.CLUSTER_DNS_DOMAIN。ServerName是我们在yaml文件中定义的,NameSpace是我们创建pod时选择的namespace,CLUSTER_DNS_DOMAIN是我们在创建K8s集群时设置的集群名,如果是用kubeasz工具创建的K8s集群,可以去/etc/ansible/hosts文件中查看。
  我们可以在pod间测试通信,确保相互之间可以通过主机名通信。

[root@blog-tomcat-app1-deployment-5b4845ddd8-rr5dq /]# ping app1-nginx-service.app1.svc.cluster.local
PING app1-nginx-service.app1.svc.cluster.local (10.68.101.60) 56(84) bytes of data.
64 bytes from app1-nginx-service.app1.svc.cluster.local (10.68.101.60): icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from app1-nginx-service.app1.svc.cluster.local (10.68.101.60): icmp_seq=2 ttl=64 time=0.314 ms
64 bytes from app1-nginx-service.app1.svc.cluster.local (10.68.101.60): icmp_seq=3 ttl=64 time=0.077 ms

  而且nginx及tomcat中最好将日志格式改为json格式,方便我们收集日志。
  tomcat的配置文件/usr/local/tomcat/conf/server.xml,设置appBase="/data/tomcat/webapps/,日志格式修改如下

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}" />

PV/PVC

  我们还可以通过创建一个创建PV/PVC的方式的方式来代替直接NFS挂载Volume。
  PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。
  PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。
  PVC和PV是一一对应的。Persistent Volume相对独立于Pods,单独创建。
  Persistent Volume对具体的存储进行配置和分配,而Pods等则可以使用Persistent Volume抽象出来的存储资源,不需要知道集群的存储细节。
  Persistent Volume和Persistent Volume Claim类似Pods和Nodes的关系,创建Pods需要消耗一定的Nodes的资源。而Persistent Volume则是提供了各种存储资源,而Persistent Volume Claim提出需要的存储标准,然后从现有存储资源中匹配或者动态建立新的资源,最后将两者进行绑定。
  以我们这次的演示为例,PV和PVC如下所示。
  PV的yaml文件示例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.32.19
    path: "/data/app1/static"

  PVC的yaml文件示例

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: manual
  resources:
    requests:
      storage: 10Gi

  pod中引用PVC

apiVersion: v1
kind: Pod
metadata:
  name: testpv
  labels:
    role: web-frontend
spec:
  containers:
  - name: web
    image: nginx
    ports:
      - name: web
        containerPort: 80
    volumeMounts:
        - name: nfs
          mountPath: "/usr/local/nginx/html/webapp/static"
  volumes:
  - name: nfs
    persistentVolumeClaim:
      claimName: nfs

HPA

  虽然我们可以使用命令kubectl scale对运行在k8s 环境中的pod 数量进行扩容(增加)或缩容(减小)。

root@DockerUbuntu18:~# kubectl --help | grep -w scale
  scale          Set a new size for a Deployment, ReplicaSet, Replication Controller, or Job
root@DockerUbuntu18:~# kubectl get deployments -n app1
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
app1-nginx-deployment    1/1     1            1           9d
app1-tomcat-deployment   1/1     1            1           3d4h
root@DockerUbuntu18:~# kubectl scale deployment/app1-tomcat-deployment --replicas=2 -n app1
deployment.extensions/app1-tomcat-deployment scaled
root@DockerUbuntu18:~# kubectl get deployments -n app1
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
app1-nginx-deployment    1/1     1            1           9d
app1-tomcat-deployment   2/2     2            2           74s

  不过在实际生产中,我们肯定没法随时根据负载或者服务需要,手动动态伸缩我们的后端服务器数量,但是我们可以通过命令kubectl autoscale自动控制在k8s集群中运行的pod数量(水平自动伸缩),想要实现自动上伸缩,需要我们提前设置pod范围及触发条件。
  k8s从1.1版本开始增加了名称为HPA(Horizontal Pod Autoscaler)的控制器,用于实现基于pod中资源(CPU/Memory)利用率进行对pod的自动扩缩容功能的实现,早期的版本只能基于Heapster组件实现对CPU利用率做为触发条件,但是在k8s 1.11版本开始使用Metrices Server完成数据采集,然后将采集到的数据通过API(Aggregated API,汇总API),例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io,然后再把数据提供给HPA控制器进行查询,以实现基于某个资源利用率对pod进行扩缩容的目的。
  控制管理器默认每隔15s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
支持以下三种metrics指标类型:
  ->预定义metrics(比如Pod的CPU)以利用率的方式计算
  ->自定义的Pod metrics,以原始值(raw value)的方式计算
  ->自定义的object metrics
支持两种metrics查询方式:
  ->Heapster
  ->自定义的REST API
支持多metrics

  查看Metrices Server的pod

root@DockerUbuntu18:~# kubectl get pod -A | grep metrics-server
kube-system   metrics-server-85c7b8c8c4-kdln2               1/1     Running   3          6d19h

  查看可以取到每个node的运行状态的数值指标

root@DockerUbuntu18:~# kubectl top nodes
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
172.18.32.18   230m         12%    968Mi           85%       
172.18.32.19   204m         11%    753Mi           84%       
172.18.32.21   129m         7%     479Mi           182%      
172.18.32.22   164m         9%     437Mi           166%      
172.18.32.23   87m          4%     955Mi           75%       
172.18.32.24   81m          4%     947Mi           74% 

  使用命令创建hpa,并验证hpa资源。

root@DockerUbuntu18:~# kubectl autoscale deployment app1-tomcat-deployment --min=3 --max=5 --cpu-percent=60 -n app1
horizontalpodautoscaler.autoscaling/app1-tomcat-deployment autoscaled
root@DockerUbuntu18:~# kubectl get hpa -n app1
NAME                     REFERENCE                           TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
app1-tomcat-deployment   Deployment/app1-tomcat-deployment   <unknown>/60%   3         5         0          9s
root@DockerUbuntu18:~# kubectl get pod -n app1
NAME                                      READY   STATUS    RESTARTS   AGE
app1-nginx-deployment-7f74d4948d-78lvc    1/1     Running   4          8d
app1-tomcat-deployment-7975ff95c8-h7mb4   1/1     Running   0          5h10m
app1-tomcat-deployment-7975ff95c8-jjsgw   1/1     Running   0          5h11m
app1-tomcat-deployment-7975ff95c8-vlwbk   1/1     Running   0          10s
root@DockerUbuntu18:~# kubectl get hpa -n app1
NAME                     REFERENCE                           TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
app1-tomcat-deployment   Deployment/app1-tomcat-deployment   0%/60%    3         5         3          10m

  这个target可能会等会才会显示,第一次查看的时候显示的unknown,之后再次查看就显示出来了,属于正常情况。而且可以看到tomcat的pod的数量也自动变为了最小值3个。

以yaml文件方式定义hpa

不过通常我们都是使用文件的方式来创建hpa,配置文件如下。


(未完待续)

手把手从零开始搭建k8s集群超详细教程 本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程 k8s集群搭建超详细教程1. 基本环境搭建1. 创建私有网络2. 创建服务器资源3. 远程连接到服务器4. docker容器化环境安装5. kubeadm、kubectl、kubelet安装2. 使用kubeadm引导集群1. 下载k8s所需的镜像2. 添加k8s中主节点的域名映射3. 初始化k8s主节点4. 添加k8s集群中的从节点3. 验证集群自动恢复功能4. 部署k8s可视化管理. 阅读详情

相关推荐

k8s集群

模拟公司的web业务,部署k8s,web,MySQL,nfs,harbor,zabbix,Prometheus,gitlab,Jenkins,ansible环境,保障web业务的高可用,达到一个高负载的生产环境。

qq_43372150的博客 2877

使用 Java 操作 Kubernetes API

目录 本文目标 k8s-client-java选型 kubernetes-client/java和fabric8io/kubernetes-client对比 kubernetes-client/java的使用 REST API kubectl api-versions REST API实例: API Object 整体划分图 (红星符号代表常用资源) kubernet...

琦彦 6万+

jenkins+kubernetes(k8s)发布Springboot项目

jenkins+kubernetes(k8s)发布Java项目准备工作机器列表创建一个java项目创建jenkins镜像Jenkins服务配置启动jenkins访问jenkins系统配置和权限配置发布Java服务查看java服务运行状态 记录一下学习k8s+jenkins发布项目的过程,期间遇到很多坑。希望能让刚接触的童鞋少走弯路。 准备工作 本篇只介绍发布的过程,在这之前有很多必要的工作要做: ...

qq_20280007的博客 4323

Java简单操作k8s,创建Deployment、Service、访问Nginx

使用Java的io.fabric8-kubernetes-client依赖操作k8s,包括创建Deploymnet、创建Service、访问Nginx

weixin_55642001的博客 1638

k8s使用headless部署nacos集群

nacos是目前比较流行的一个框架,是阿里开源的一个框架。可用于配置中心和注册中心。配置中心:就是说nacos,可以帮我们管理项目中,需要用到的配置文件,这些配置都可以交给nacos进行管理。配置中心可以实现多个环境的配置管理,多个环境之间配置的动态切换...注册中心:就是说,我们的一些微服务可以注册到nacos上,然后其他的微服务就能发现,也就能调用到我们的服务。这就是我们常说的服务发现服务注册。当然,如果我们的微服务宕掉了,nacos也可以帮我们检测到,阻止向不健康的微服务发送请求。这就是我们常说的。

weixin_74412978的博客 2152

eureka 迁移 k8s 集群

Spring Cloud 强上云 系列之 eureka 迁移 故事前奏 前阵子忽然一个需求砸了过来,一忙就是两星期。写bug,挖坑忙的不亦乐乎。这几天军哥一直在群里一直大呼: 你们要输出,要有声音啊。正好今天刚搞完,也确实想放松一下,写篇小白文压压惊。 故事背景 这几年,云计算,容器 docker,微服务 很火,很显眼。当你初步了解这些东西,很多时候会眼前一亮。哇! 还能这么搞? ...

gujian2517的博客 1万+

Java根据线程指标自定义HPA(Prometheus为监控收集)

这里使用的是上面指标接口的jvm_threads_current也就是当前线程数量作为扩容指标,这个指标随便改吧…访问: http://k8s服务器:21904/metrics 出现如下输出就算配置正确了。增加/metrics接口,这里是直接暴露simpleclinet的Servlet。这里使用prometheus simpleclient暴露java的一些指标。安装: prometheus-adapter。在pom.xml增加。

Joker 1308

STM32H743VIT6最小系统板PCB设计全流程(AD09实战教程+封装库分享)

本文详细介绍了基于STM32H743VIT6高性能MCU的最小系统板PCB设计全流程。内容涵盖从项目规划、原理图设计到PCB布局布线的AD09实战操作,重点解析了高速电路设计中的电源、时钟、去耦等关键模块的处理要点与常见陷阱,并分享了经过验证的封装库资源,旨在为工程师提供一套完整、可靠的设计方法与实战参考。

weixin_29194693的博客 119

k8s部署tomcat及web应用_3. 使用K8S部署tomcat

注意,以下 在k8s master节点执行:1. 使用dockerfile方式构建自己应用的tomcat镜像(构建完成即可,不需要使用docker启动)我这里创建的镜像名称为:demo-tomcat,tag为:1.0注意:由于我没有搭建自己的镜像仓库,所有在k8s启动pod时,调度的工作节点拉取不到镜像。会出现以下错误:2. 部署tomcatapiVersion: apps/v1kind: Dep...

weixin_33462927的博客 1008

IPD(集成产品开发)管理之道

IPD,是集成产品开发(Integrated Product Development)的缩写,它是集成了众多管理模型和理论、众多企业最佳管理实践的一整套体系,可以帮助企业快速响应市场变化、缩短产品上市时间、减少资源浪费、提高生产力,最终取得商业成功。IPD的思想最早来源于美国PRTM公司出版的《产品及生命周期优化法》一书中,该书详细描述了IPD模式所包含的各个方面。但IPD在中国的普及,源于IBM和华为的推行使用。IPD作为一套先进的产品研发管理模式,其成功的基础是功能部门和各团队之间的密切配合。

钢镚·真的博客 2715

PX4实战指南:通过遥控器通道映射实现多舵机PWM精准控制

本文详细介绍了通过PX4飞控的AUX PWM接口实现遥控器通道映射控制多舵机的实战指南。内容包括硬件选型与连接、软件参数配置、通道映射方法以及常见问题排查,帮助开发者精准实现无人机舵机PWM控制,适用于云台、机械臂等扩展功能开发。

ee345的博客 304

k8s部署SpringCloud微服务集群

本文简要介绍 kubernetes(后文简称 k8s )的基本原理,基于 k8s 部署 SpringBoot 微服务应用集群的方法。

weixin_40328383的博客 3654

Cisco Packet Tracert 无线路由器配置

Cisco Packet Tracert 无线路由器配置

yushan_caoyu的博客 2万+

Kubernetes超详细教程,一篇文章帮助你从零开始学习k8s,从入门到实战

10w+的Kubernetes详细教程,涵盖k8s中常用的所有概念以及面试的高频问点(pod的深入理解),帮助你从零开始学习k8s,搭建k8s集群,从入门到实战,希望对大家学习k8s有所帮助

一弓虽的博客 6万+

1.triton镜像使用

1)拉取镜像2)启动容器指定模型仓库时可以执行server下的./fetch_model.sh,见2.2部分GPU版本的启动CPU版本的启动区别只在于--gpus=1这个参数注意:docker19.03之前的版本使用gpu要指定显卡硬件名,docker19.03之后的需要安装nvidia-container-toolkit或nvidia-container-runtime安装之后要重启docker查看gpus参数是否安装成功重新执行我遇到了如下错误先使用非GPU版本的。

天启的博客 2077

【光伏风电功率预测】偏差考核每月少几十万:STL-VMD + Informer-LSTM 在某基地的落地案例

摘要:某风光一体化基地通过STL-VMD二次分解与Informer-LSTM并行残差模型,在不推翻现有预测系统的情况下,将风光功率预测的综合nRMSE降低了1.2-1.5个百分点。该方案通过分解预测误差为多个子序列,并采用不同模型处理各频段特征,显著改善了关键时段的预测精度。实施后,风电nRMSE从9.0%降至7.6%,光伏从10.2%降至8.8%,每月减少偏差考核费用30-50万元。项目经验表明,数据质量优化、参数调优及与业务目标对齐是关键成功因素,该技术路线具有可复制性,为风光基地预测精度提升提供了有效

专注AI大模型,软件混淆,授权 265

在K8s上搭建Hazelcast 集群

最近在研究Seatunnel的源码,Seatunnel是基于hazelcast实现的去中心化实现,同时hazelcast作为基于网络网格的分布式缓存服务,同时有一个Python项目需要做性能优化,想研究下,hazelcast是否可以在这个项目上进行使用,开发部署都是基于k8s的,所以,打算基于k8s搭建一个hazelcast集群。

p73133_55的博客 1471

黑猫带你学UFS协议第12篇:UFS标志(Flags)和属性(Atrributes)详解

UFS中的标志其实就是一些开关,布尔型,非0即1,打开或者关闭。这些标志可以用来使能或者禁止UFS设备的一些功能、模式或者状态。 简单来说,flag和attribute、discriptor一样,都是ufs的寄存器罢了。只不过spec将这些寄存器分类了,分成这三种大的类型了而已。 标志可以被清除、复位、设置、触发、读。 主机也是通过设备管理器的Query Request UPIU来读取或者写标志。

黑猫奥利奥的博客 2083

kubernetes概念及集群搭建

自我修复:当某一容器宕机后,能够迅速启动一个容器来替代弹性伸缩:可以根据需要,自动对集群中正在运行容器数量进行调整服务发现:服务可以通过自动发现的形式找到他所依赖的服务,例如服务A需要服务B提供的能力,k8s会在容器内部寻找服务B负载均衡:如果一个服务启动了多个容器,能够自动实现请求的负载均衡版本回退: 如果发现发布线上版本有问题,可以回退版本镜像存储编排:可以更具容器滋生需求自动创建存储卷,例如mysql需要存储数据data文件,k8s会自动创建存储卷。

pitao216的博客 913

小工匠聊架构-分布式场景下的并发幂等性常见的解决方案

Pre 我们来回顾下单体时代 单体时代,应用部署在一台主机上,可以使用JVM级别的锁来控制并发请求 。 随着应用规模的不断扩大,集群化或者微服务化的分布式部署越来越普及,每个应用都是一个单独的JVM应用,所以单体时代的这种处理方式已经无法满足当前架构下的业务需求了。 JVM级别的锁已经无法满足跨进程之间访问控制了,进而演化出来了分布式锁。 分布式锁 能否解决幂等性问题? 分布式锁解决什么问题? 简言之: 解决跨进程间无法共享本地资源的问题 ,解决的是分布式场景下并发访问的问题。 为什么需要确保并发.

小工匠 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Kubernetes(k8s)搭建指南

本文系统介绍Kubernetes从环境搭建到面试核心内容。搭建方面区分学习场景(推荐Minikube)和生产环境(推荐kubeadm),详细说明安装步骤和优化方案。面试考点涵盖五大模块:核心概念(Pod生命周期、控制器区别)、组件原理(架构、Pod创建流程)、运维命令、故障排查思路及Java微服务实战案例。重点掌握Pod异常状态分析、Service类型区别、滚动更新策略等高频问题,同时了解网络模型、存储方案等加分项。建议先实践部署再深入原理,强化故障排查能力。

萧曳丶 1621

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

k8s搭建集群

一、服务器资源 资源名称 IP NFS server 47.97.112.208 k8s master node 192.168.132.64 k8s cluster node 192.168.132.63 二、 主从节点安装k8s 注意:192.168.132.64,192.168.132.63都需要执行步骤二。 1.禁用防火墙:systemctl stop firewalld;systemctl disable firewalld 2.禁用

FinelyYang的专栏 1352

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

在Kubernetes(k8s)上部署整个SpringCloud微服务应用

Kubernetes上部署整个SpringCloud微服务应用,并使用ingress暴露应用。部署包括nacos、redis、mysql等组件。同时还部署monitor监控模块。

XiaoHH的博客 1万+

【Kubernetes】K8S到底是什么,最近怎么这么火

【Kubernetes】K8S的内容简介、特点、架构、数据库等详细讲解

m0_75058342的博客 6002

RockyLinux9.6搭建k8s集群

kubernetes(k8s)是2014年由Google公司基于Go语言编写的一款开源的容器集群编排系统,用于自动化容器的部署、扩缩容和管理; kubernetes(k8s)是基于Google内部的Borg系统的特征开发的一个版本,集成了Borg系统大部分优势;

qq_57756904的博客 1542

Java 服务从虚拟机迁移到 Kubernetes(K8s)集群

本文介绍了将Java服务从虚拟机迁移到Kubernetes集群的完整流程。首先通过Maven打包应用,然后编写Dockerfile构建基于JDK8的镜像,并推送至镜像仓库。接着配置Kubernetes的Deployment和Service资源文件,指定环境变量、资源配额和服务暴露方式。最后部署到集群并进行连通性测试。文章还提出了优化建议,包括微服务集群迁移的架构设计、网关服务保留方案,以及逐步向云原生网关演进的路径。整个迁移过程保持了原有应用配置的一致性,同时实现了容器化部署的标准化。

ya_shy的博客 987
上一篇: 企业级应用——ELK(三):filebeat
下一篇: linux使用vmware虚拟机玩LOL
MicePro
博客等级 码龄8年 216粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MicePro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值