centos
1 | 安装 vncserver |
配置
以用户 wii 为例,需要替换其中的内容。
1 | [Unit] |
交由 systemctl 管理
1 | sudo systemctl daemon-reload # 重新加载配置 |
参考
- https://www.tecmint.com/install-and-configure-vnc-server-in-centos-7/
- https://www.tecmint.com/install-tightvnc-remote-desktop/
1 | 安装 vncserver |
配置
以用户 wii 为例,需要替换其中的内容。
1 | [Unit] |
交由 systemctl 管理
1 | sudo systemctl daemon-reload # 重新加载配置 |
1 | ./jmeter -n -t config.jmx -l results.jtl |
参数
1 | 命令格式 |
针对 RPC 需要基于 SDK 做开发,整体流程如下。
基于 SDK 开发
将包及其依赖拷贝至 jmeter 的 lib/ext
目录下
重新打开 jmeter
创建压测项目
新建线程组
新建 java 请求
下拉框选择我们的实现类
参数需要在实现类的 getDefaultParameters
方法返回,但是值可以在 jmeter GUI 修改以及保存
添加 view result tree
点击开始按钮,进行压测
通过 view result tree
查看结果
1 | // EchoService 是已运行的 gRPC 服务 |
修改 bin/jmeter
脚本。
1 | ... |
[toc]
1 | ubuntu |
对于新版的 k8s,使用 docker 还需要安装 cri-docker,从这里下载二进制程序,把下面的内容保存为两个文件 cri-docker.service
和 cri-docker.socket
。
1 | cri-docker.service |
1 | cri-docker.socket |
移动文件
1 | 移动二进制 |
systemd 启动服务
1 | sudo systemctl daemon-reload |
安装 kubeadm、kubelet、kubectl,国内源参考 阿里云镜像 或者 清华开源镜像站。
1 | sudo apt-get update && apt-get install -y apt-transport-https |
1 | sudo kubeadm config images pull \ |
1 | 10.244.0.0/16 是 chennel 扩展的配置 |
需要配置 KUBECONFIG=/etc/kubernetes/admin.conf
。
1 | root@k8s-master-1:/home/ubuntu# export KUBECONFIG=/etc/kubernetes/admin.conf |
1 | mkdir -p $HOME/.kube |
1 | ubuntu@k8s-master-1:~$ kubectl get nodes |
1 | kubeadm reset [glags] |
这一步很关键,如不能正确配置集群网络,pod 间可能无法通讯,kubectl proxy 无法正常访问(通常表现为 pod 运行正常,但提示连接拒绝)。以 flannel 为例,首先安装 flannel。
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
使用工具 mk-docker-opts.sh生成网络信息,这个工具也可以使用 sudo find / -name 'mk-docker-opts.sh'
在 docker 容器中找到。
1 | mk-docker-opts.sh -d /run/docker_opts.env -c |
修改 docker service。
1 | root 用户执行 |
对添加的节点同样需要配置网络,且不可复用其他节点的 docker_opts.env 文件。
1 | 在 master 节点 |
1 | 安装 dashboard |
创建服务账号
保存到 account.yaml
。
1 | apiVersion: v1 |
然后运行。
1 | kubectl apply -f account.yaml |
设置权限
保存到 permission.yaml
。
1 | apiVersion: rbac.authorization.k8s.io/v1 |
然后运行。
1 | kubectl apply -f permission.yaml |
也可以放到一个文件里面。
1 | apiVersion: v1 |
获取 token
1 | kubectl -n kubernetes-dashboard create token admin-user |
k8s dashboard 默认会自己生成证书,可以跳过。对于 https 证书,可以自己生成证书,可以用证书认证服务商。对于自己生成证书,可以手动生成,也可以通过添加 --auto-generate-certificates
来自动生成,更多参数参考这里。
1 | 自认证证书 |
1 | kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml |
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
1 | kubectl get nodes |
1 | kubectl get pods --all-namespaces |
1 | 查看 pod 信息 |
k8s 配置在这里 /etc/kubernetes/kubelet.conf
。
1 | ubuntu@k8s-master-1:~$ systemctl status kubelet |
这里 有说,可能是 api server 不能连接,由于 cri 用了 docker,随检查 docker 状态。
node not found is a misleading error by the kubelet. at this point it means that the kubelet was unable to register a Node object with the api server.
https://nalshsvrk8ss01.railcarmgt.com:6443/healthz?timeout=10s in 0 milliseconds
this means that the api server cannot be connected. could be caused by a number of things (including firewall).
1 | root@k8s-master-1:~# service docker status |
果然是镜像有问题,从 k8s.gcr.io 拉取镜像失败。可以根据这里的说明,来指定自定义的镜像地址。
1 | 查看服务实时日志 |
设置 --image-repository
可以拉下来镜像,但还是会在启动 control plane 时超时。
1 | [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s |
老老实实挂代理吧。
1 | sudo mkdir -p /etc/systemd/system/docker.service.d |
下面是访问 dashboard 的错误信息,运行时是 docker,kubernetes-dashboard 运行在另外一台 worker node 上,使用 master node 的 proxy 访问 dashboard 服务会报下面的错误。
1 | { |
原因是 docker 容器使用的网络(172.17.0.1/16)和网络扩展(用的是 flannel,10.244.0.0/32)不是统一个网络,导致无法访问。这里的 172.17.0.3 其实是 worker node 的网络地址,这是因为 proxy 容易部署早于 flannel,不在同一个网络。
1 | 查看 flannel 网络 |
生成 docker 环境变量 DOCKER_OPTS。
1 | 找到 mk-docker-opts.sh,在 flannel 镜像里面;也可以下载 flannel 的二进制包找到这个脚本 |
修改 docker service。
1 | root 用户执行 |
验证 pod ip。
1 | alias k8s="kubectl --namespace=default" |
这里需要注意的是,需要在每个 node 执行上面的操作,docker_opt.env 文件不能共用。
最简单的方式是,网络类型设置为 NodePort,使用火狐浏览器打开。
使用 proxy 的方式打开登录界面之后,会发现无法登录,有如下提示。
1 | Insecure access detected. Sign in will not be available. Access Dashboard securely over HTTPS or using localhost. Read more here . |
即便添加如下参数。
1 | --auto-generate-certificates |
根据 这里 说的,--enable-insecure-login
仅适用在 127.0.0.1
和 localhost
使用 http 登录的情景,对于使用 kubectl proxy 使用 http 协议并不适用。
端口转发
1 | kubectl port-forward -n default service/kubernetes-dashboard 18082:443 --address='0.0.0.0' |
dashboard 的 ssl 认证有点坑,可以确认下面几点。
不允许使用非 localhost
和 127.0.0.1
地址使用 HTTP 协议访问,没有配置可以规避这个问题,所以
kubectl proxy
方式只能是在本机安装 k8s 时使用非 localhost
和 127.0.0.1
只能使用 HTTPS 协议访问了
所以,对于使用 HTTPS ,可以从两个方向来解决。
购买证书认证服务就不说了,记录几个可行的解决方案。
至于搭建参考这里吧,端口类型改为 NodePort。
1 | kind: Service |
添加 nginx 配置。
1 | upstream k8s-dashboard { |
然后就可以使用 Chrome 访问了。
1 | 浏览器输入地址 |
硬件类型 | 参数 | 数量 | 价格 |
---|---|---|---|
主板 | 华南金牌 x99 f8d | 1 | 894 |
CPU | E5 2683 v4 | 2 | 1940 |
内存 | 2133 ddr4 16g | 4 | 1060 |
硬盘 | 500G ssd | 2 | 950 |
散热器 | 利民 as120 | 2 | 248 |
机箱 | - | 1 | 429 |
电源 | 850w | 1 | 889 |
显卡 | - | - | 60 |
合计 | - | - | 6470 |
变更
硬件类型 | 参数 | 数量 | 价格 |
---|---|---|---|
内存 | 2133 ddr4 32g | 2 | 960 |
硬盘 | 1T nvme | 1 | 597 |
合计 | - | - | 1557 |
合计
6470 + 1557
= 8027
1 | wii@srv:~$ free -h |
详细参考这里。
Delete
进入 BIOSInelRCSetup -> PCH Configuration -> PCH Devices -> Restore AC after Power Loss
Power On
设置断电恢复后启动,目的是设置远程启动。
Centos 7。
1 | 关闭 selinux |
1 | sudo yum install git telnet -y |
1 | sudo yum install zsh |
1 | 一键安装脚本 |
服务端
1 | sudo apt install xfonts-base xfonts-75dpi xfonts-100dpi |
配置
1 | /etc/systemd/system/vncserver@:1.service |
客户端
从这里下载。
参考
手动下载
1 | 从这里 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 下载 jdk |
yum
1 | yum install -y java-1.8.0-openjdk-devel # 安装 jdk |
从 这里 下载。
1 | 修改 conf/settings.xml |
1 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash |
1 | yum install mariadb mariadb-server |
依赖
jdk
mvn
rpm-build(centos)
npm
python-devel
sudo yum install -y python-devel
ant
1 | !/bin/bash |
gcc
下载
从 这里下载,或使用 git 克隆,git clone git@github.com:apache/ambari.git
,切换分支 git checkout branch-2.7
。
安装
参考这里。
1 | 添加 -Drat.skip=true |
异常
1 | 报错 |
问题集锦
整机无负载功率在 100w 左右,功率大且并不常用,工作的时候可能会用到。远程关闭、启动方案是通过设置 BIOS 的断电恢复后自动启动 + 小米智能插座实现。
系统尝试了 centos 7、centos 8、ubuntu 20.04(desktop + server),尝试安装了 ambari、mapr、openstack、microstack。最终的使用方案是,ubuntu 20.04 + openstack Wallaby。
系统最开始打算用 centos 7,觉得可能会更稳定吧,公司服务器一般也是。
想搭一套大数据平台(zookeeper、hadoop、impala、yarn、spark、kudu 等),先是尝试了 ambari,但是现在 CDH 的时候遇到收费墙问题,放弃。后发现 MapR,惊喜,先是尝试在 centos 7 上装,后来发现最新版本不支持。然后尝试从 centos 7 直接升级到 centos 8,失败。重新安装 centos 8,再安装 MapR,配置后无法开机,又重新安装。
一出问题,买的那个亮机卡就不显示内容,需要搬机箱、拆换另外一台机器的显卡,崩溃。不想再在裸机上装太多东西,笨重的东西全部放虚拟机。考虑用 virtual box,但不太方便,最后选了 openstack。
先是尝试在 centos 7 装 openstack,每次创建卷时,cinder 都会报错,pip 锁死在 8.x.x。本打算用 centos 8 试下,最终放弃。
转战 Ubuntu 之后,开始倾向于 desktop 版本,有个界面也挺好,但是那个亮机卡装的时候好好的,一进系统就什么都不显示,随选择 server 版本。
Snap 有个 MicroStack,可以一键安装 openstack,试了下,可以。但是 snap 包内的文件只读,没办法改。最终,决定还是一步一步按官网教程来安装。
openstack 官方文档有一些细节没有覆盖到,总体还是很赞。
但凡能看到内核日志的地方,都在疯狂刷下面的内容。后排查原因是 inter 一款 nvme 的 ssd 硬盘导致的,换了一块好了。
1 | pcieport 0000:80:02.0: Multiple Uncorrected (Non-Fatal) error received: 0000:80:02.0 |
1 |
1 | 当前发行版 |
1 | <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> |
1 | <dependency> |
1 | <dependency> |
1 | <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> |
1 | <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> |
1 | <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 --> |
在Maven工程中,POM(Project Object Model)是基本的工作单元,它是一个包含工程信息和配置详细信息的XML文件,Maven根据该文件构建工程。当Maven执行一个task或者goal,会查看当前文件夹下的POM文件,从中获取需要的配置信息。
所有的编写的POM文件都继承自Super POM,不用maven版本的Super POM可能会有差异,附录是2.1.x版本Maven的Super POM。
以下字段是编写POM必须的:
比如:
1 | <project> |
groupId, artifactId 和 version 三个值组成了项目的完整名称,组合格式是<groupId>:<artifactId>:<version>
,以上面示例配置为例,artifact名称为com.mycompany.app:my-app:1
。
在继承(Project Inheritance)时,以下元素会被合并:
通过添加parent元素,配置parent POMs,实现POM文件的继承。比如:
目录
1 | . |
POM配置
1 | <project> |
可选地,如果希望groupid、version、/ 和parent相同,可以在子POM中去掉相应字段,上例POM则可改为:
1 | <project> |
相对路径继承
如果目录结构如下:
1 | . |
需要添加<relativePath>
元素到parent
字段:
1 | <project> |
项目集成(Project Aggregation)类似于项目继承,相对于项目继承在子模块中配置parent POM信息,项目集成则是在parent POM中配置子模块信息,这样,parent POM就了解了子模块的信息。通过项目继承,parent POM调用的命令,也会应用在子模块中。
通过以下步骤实现Project Aggregation:
示例见附录。
模型定义中属于单个值元素的任何字段都可以作为变量引用,比如${project.groupId}
, ${project.version}
, ${project.build.sourceDirectory}
。
使用定义的变量
1 | <!-- 定义 --> |
特殊变量
project.basedir
project.baseUri
maven.build.timestamp
Maven中,属性(Properties)是值的占位符,他们的值在该POM内任意范围内可见,通过标记${X}
使用。
属性设置有以下五种方式:
env.X
env.
开头${env.PATH}
elementName.X
<project><version>1.0</version></project>
通过 ${project.version}
访问settings.x
settings.xml
,比如:<settings><offline>false</offline></settings>
通过${settings.offline}
访问java.lang.System.getProperties()
可以获取的值都是POM文件的属性,可以使用${java.home}
语法获取<properties />
内的属性,比如:<properties><someVar>value</someVar></properties>
可以通过${someVar}
使用示例如下:
1 | <project> |
根据POM 4.0.0 XSD规定,Build元素被分为两部分:
BaseBuild
Build
BaseBuild
集合以及更多的 top-level 定义比如:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
1 | <build> |
defaultGoal
directory
${basedir}/target
finalName
${artifactId}-${version}
filter
filters
文件夹下定义*.properties
文件,其包含一系列属性,作为resources的设置${basedir}/src/main/filters/
name=value
定义在 filter文件内, 在resources使用${name}
访问resources
元素用于指定项目中包含的资源,资源通常不是代码,不会被编译,用于和工程绑定或其他原因。
比如,Plexus项目需要把配置文件configuration.xml
放在META-INF/plexus
内,尽管可以简单地放在src/main/resources/META-INF/plexus
,但是有时会希望为Plexus建立它自己的文件夹src/main/plexus
,并把配置文件放在该文件夹内。为了使jar文件可以正确地绑定该资源,可以使用如下的配置:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
resources
targetPaht
filtering
true
OR false
-D
标记,比如-Dname=value
)传入的参数directory
${basedir}/src/main/resources
includes
excludes
includes
类似,但是指定忽略的文件,优先级大于includes(如果在includes也包含该文件,excludes同样生效)testResources
testResources
包含testResource
元素testResource
resource
,在测试阶段被使用${basedir}/src/test/resources
配置plugins示例如下:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
project element
maven可以管理项目间关系:
依赖版本指定
1.0
: “Soft” requirement on 1.0 (just a recommendation, if it matches all other ranges for the dependency)[1.0]
: “Hard” requirement on 1.0(,1.0]
: x <= 1.0[1.2,1.3]
: 1.2 <= x <= 1.3[1.0,2.0)
: 1.0 <= x < 2.0[1.5,)
: x >= 1.5(,1.0],[1.2,)
: x <= 1.0 or x >= 1.2; multiple sets are comma-separated(,1.1),(1.1,)
: this excludes 1.1 (for example if it is known not to work in combination with this library)依赖列表是POM的基础。大多数项目的正确运行,需要依赖其他项目。在编译和执行其他goal时,Maven会下载并且链接相应的依赖。
添加依赖示例:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
字段说明
dependencyManagement用于统一版本管理,在多模块项目中,如果父项目中dependencyManagement指定了依赖版本和scoope,那么在子模块中可以省略。
有三种方式,可以在Maven项目中,引用非Maven库中的项目:
mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar
maven
仓库,并且将其部署在私有仓库中scope
为system
,并且定义systemPath
jar
http://repo.maven.apache.org/maven2
Super POM for maven 2.1.x.
1 | <project> |
文件目录结构
1 | . |
./pom.xml
1 | <project> |
./my-module/pom.xml
1 | <project> |
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
1 | <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade-plugin --> |
通过设置主类的方式,打包可执行 jar 包。
1 | <plugin> |
1 | <plugin> |
1 | <plugin> |
1 | <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin --> |
maven-assembly-plugin
插件的使用需要打包配置(通常命名为 assembly.xml、release.xml 等,具体内容参考配置示例),插件内置了一部分配置,比如 jar-with-dependencies
,使用如下配置,来启用。
1 | <plugin> |
这里需要注意两点。
如果指定了预设配置,那么再指定打包配置文件,会被忽略
1 | <plugin> |
jar-with-dependencies
插件,并不会合并 META-INF 下的内容
如果,我们依赖的多个包里面定义了同样的 SPI 接口,那么只会保留其中一个的内容,这样程序在运行时,可能会抛出异常,比如
1 | Caused by: java.lang.IllegalStateException: Could not find policy 'grpclb'. Make sure its implementation is either registered to LoadBalancerRegistry or included in META-INF/services/io.grpc.LoadBalancerProvider from your jar files. |
遇到这种情况,需要自定义打包配置文件,参考配置示例
1 | <plugin> |
1 | <plugin> |
assembly.xml
1 | <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" |
执行命令。
1 | <build> |