2022
08
contained 安装及使用
contained 安装及使用
contained 安装及使用 containerd 是一个行业标准的容器运行时,强调简单性、健壮性和可移植性。它可作为 Linux 和 Windows 的守护进程使用,可以管理其主机系统的完整容器生命周期:图像传输和存储、容器执行和监督、低级存储和网络附件等。 containerd is a member of CNCF with graduated status. 早在 2016 年 3 月,Docker 1.11的Docker Engine里就包含了containerd,而现在则是把containerd从Docker Engine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在 Docker Engine 里containerd相比,独立的containerd将具有更多的功能,可以涵盖整个容器运行时管理的所有需求。 containerd并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如Swarm, Kubernetes, Mesos等容器编排系统。 containerd以Daemon的形式运行在系统上,通过暴露底层的gRPC API,上层系统可以通过这些API管理机器上的容器。 每个containerd只负责一台机器,Pull 镜像,对容器的操作(启动、停止等),网络,存储都是由 containerd 完成。具体运行容器由runC负责,实际上只要是符合OCI规范的容器都可以支持。 对于容器编排服务来说,运行时只需要使用containerd+runC,更加轻量,容易管理。 5.独立之后containerd的特性演进可以和Docker Engine分开,专注容器运行时管理,可以更稳定。 安装 centos 1yum install -y containerd.io ubuntu 1apt install -y containerd.io 设置开机自启 1systemctl enable containerd 2systemctl start containerd 3systemctl status containerd 验证 1ctr version ctr 命令 命令 作用 plugins, plugin 提供有关容器插件的信息 version 打印客户端和服务器版本 containers, c, container 管理容器 content 管理内容 events, event 显示容器事件 images, image, i 管理图像 leases 管理租约 namespaces, namespace, ns 管理租命名空间 pprof 为 containerd 提供 golang pprof 输出 run 运行一个容器 snapshots, snapshot 管理快照 tasks, t, task 管理任务 install 安装一个新包 oci OCI 工具 shim 直接与 shim 交互 help, h 显示命令列表或一个命令的帮助
JOBCHER BLOG
Planet 下载及安装
Planet 下载及安装 官网下载 Planet 是一款用于发布和关注 Web 内容的免费开源软件,它不需要集中式服务器或服务。它使用 IPFS 来实现点对点的内容分发。此外,您可以将您的内容链接到以太坊名称 (.eth),以便其他人可以通过 Planet 以 .eth 名称关注您。由于 IPFS 和 ENS 都是去中心化的,因此您可以以去中心化的方式构建您的网站或关注其他网站。 如何使用 标准是 EIP-1577,这个 Content Hash 字段可以接受一些可能的值。例如,IPFS——另一种去中心化的内容分发技术。而vitalik.eth 网站已经在 IPFS 上运行。 通过 Planet 关注来自 vitalik.eth 的更新 使用 Planet 创建网站后,右键单击侧栏中的项目,然后选择Copy IPNS,然后您将在粘贴板中看到如下所示的内容: 1k51qzi5uqu5dgv8kzl1anc0m74n6t9ffdjnypdh846ct5wgpljc7rulynxa74a 公开 ENS 然后您可以像这样将该 IPNS 放入您的 ENS ContentHash 中: 确保在该字符串之前添加了 ipns://。 完成! 然后您的网站将链接到您的 ENS。恭喜!现在你有一个在 ENS + IPFS 上运行的去中心化网站!
JOBCHER BLOG
关系数据库 索引操作
索引 在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。 索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。 students表: id class_id name gender score 1 1 小明 M 90 2 1 小红 F 95 3 1 小军 M 88 如果要经常根据score列进行查询,就可以对score列创建索引: 1ALTER TABLE students 2ADD INDEX idx_score (score); 使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如: 1ALTER TABLE students 2ADD INDEX idx_name_score (name, score); 索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。 唯一索引 在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。 但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复: 1ALTER TABLE students 2ADD UNIQUE INDEX uni_name (name); 通过UNIQUE关键字我们就添加了一个唯一索引。 也可以只对某一列添加一个唯一约束而不创建唯一索引: 1ALTER TABLE students 2ADD CONSTRAINT uni_name UNIQUE (name); 这种情况下,name列没有索引,但仍然具有唯一性保证。 无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化 通过对数据库表创建索引,可以提高查询速度。 通过创建唯一索引,可以保证某一列的值具有唯一性。 数据库索引对于用户和应用程序来说都是透明的。
JOBCHER BLOG
skywalking APM 监控
skywalking 基于 OpenTracing 规范,专门为微服务架构以及云原生服务。 APM 监控 一个基于微服务架构的电商系统 APM (Application Performance Management) 即应用性能管理,属于 IT 运维管理(ITOM)范畴. 分为一下三个方面: Logging 服务在处理某个请求时打印的错误日志,可以将这些日志信息记录到Elasticsearch或是其他存储中。通过 Kibana 或是其他工具来分析这些日志了解服务的行为和状态,大多数情况下。日志记录的数据很分散,并且相互独立。例如错误日志,请求处理过程中关键步骤的日志等等。 Metrics Metric是可以聚合的,例如为电商系统中每个 HTTP 接口添加一个计数器,计算每个接口的 QPS,可以通过简单的加和计算得到系统的总负载情况。 Tracing 在微服务架构系统中一请求会经过很多服务处理,调用链路会非常长,要确定中间哪个服务出现异常是非常麻烦的事情,通过分布式链路追踪,运维人员就可以构建一个请求的视图。视图上战术了一个请求从进入系统开始到返回响应的整个流程。 系统交互图 系统加载图 > 目前流行的APM监控 Zipkin 对 web.xml 进行修改,代码侵入 twitter 开源 Cat 支持 Java、C/C++、Node.Js、Python、go 代码侵入,埋点 美团开源 Pinpoint 基于字节码注入技术,代码无侵入 韩国公司开发,社区交流滞后 只支持 hbase 颗粒度更细 Skywalking 观测性分析平台 基于字节码注入技术,代码无侵入 服务、服务实例、端点指标分析 服务拓扑图分析 服务、服务实例和端点(Endpont)SLA 分析 支持 es,h2,mysql,TiDb,sharding-sphere skywalking 整体框架 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。 下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。 右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。 左部分 SkyWalking UI :负责提供控台,查看链路等等。 skywalking 配置 使用 docker-compose 安装 使用 mysql 作为存储
JOBCHER BLOG
systemd 守护命令
介绍 systemd 是 linux 中用来启动守护进程,Linux 最早一直采用 init 进程 (systemd 架构图) systemd 命令 systemd 不是一个具体的命令,而是一组命令,用于系统管理的各个方面 1.systemctl systemctl是 Systemd 的主命令,用于管理系统。 1# 重启系统 2$ sudo systemctl reboot 3 4# 关闭系统,切断电源 5$ sudo systemctl poweroff 6 7# CPU停止工作 8$ sudo systemctl halt 9 10# 暂停系统 11$ sudo systemctl suspend 12 13# 让系统进入冬眠状态 14$ sudo systemctl hibernate 15 16# 让系统进入交互式休眠状态 17$ sudo systemctl hybrid-sleep 18 19# 启动进入救援状态(单用户状态) 20$ sudo systemctl rescue 2.systemd-analyze systemd-analyze命令用于查看启动耗时 1# 查看启动耗时 2systemd-analyze 3 4# 查看每个服务的启动耗时 5$ systemd-analyze blame 6 7# 显示瀑布状的启动过程流 8$ systemd-analyze critical-chain 9 10# 显示指定服务的启动流 11$ systemd-analyze critical-chain atd.
docker 问题处理
docker 问题处理
docker 无法启动 打开服务器输入docker ps,输出错误 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 怀疑是不是docker.services 部署没成功,systemctl start docker 启动 docker,结果服务器还是报错 Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details. systemctl status docker.service 输出日志: 1● docker.service - Docker Application Container Engine 2 Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) 3 Active: failed (Result: exit-code) since Thu 2022-08-04 11:43:05 CST; 2min 57s ago 4TriggeredBy: ● docker.
JOBCHER BLOG
kubernetes 存储
kubernetes 存储 k8s 支持多种途径的多种类型的存储。例如 iSCSI,SMB,NFS,以及对象存储。都是不同类型的部署在云上或者自建数据中心的外部存储系统。k8s 上的所有存储都被称作卷 CSI 容器存储接口 CSI 是 k8s 存储体系中一部分,是一个开源项目,定义了一套基于标准的接口,从而使容器能够以一种统一的方式被不同的容器编排的工具使用。可以将插件称为provisioner 持久化 持久化卷 (pv) 持久化卷申请 (pvc) 存储类 (sv) PV 代表 k8s 的存储,pvc 代表的是许可证,赋予 pod 访问 pv 的权限。cs 使分配过程是动态的。 使用 iSCSI 操作存储 iscsi 卷能将 iSCSI (基于 IP 的 SCSI) 卷挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,iscsi 卷的内容在删除 Pod 时会被保留,卷只是被卸载。 这意味着 iscsi 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。 iSCSI 的一个特点是它可以同时被多个用户以只读方式挂载。 这意味着你可以用数据集预先填充卷,然后根据需要在尽可能多的 Pod 上使用它。 不幸的是,iSCSI 卷只能由单个使用者以读写模式挂载。不允许同时写入。 创建 iscsi-pv.yaml iscsi-pvc.yaml iscsi-pv.yaml 1apiVersion: v1 2kind: PersistentVolume 3metadata: 4 name: iscsi-pv 5spec: 6 capacity: 7 storage: 500Gi 8 accessModes: 9 - ReadWriteOnce 10 iscsi: 11 targetPortal: 10.
07
JOBCHER BLOG
linux服务器 删除空间却未释放
linux 服务器 删除空间却未释放 在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink),然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用,这样就会导致我们明明删除了文件,但是磁盘空间却未被释放 获取占用列表状态 1lsof | grep deleted 可以看到哪些文件还被使用,未被释放空间。 释放磁盘空间 一种方法是 kill 掉相应的进程,或者停掉使用这个文件的应用,让 os 自动回收磁盘空间,当 linux 打开一个文件的时候,Linux 内核会为每一个进程在/proc/, /proc/nnnn/fd/目录(nnnn 为 pid)建立一个以其 pid 为名的目录用来保存进程的相关信息,而其子目录 fd 保存的是该进程打开的所有文件的 fd(fd:file descriptor); kill进程是通过截断 proc 文件系统中的文件可以强制要求系统回收分配给正在使用的的文件,这是一项高级技术,仅当管理员确定不会对运行中的进程造成影响时使用。 1kill -9 12345 # PID 重启服务 lsof 命令 lsof全名list opened files,也就是列举系统中已经被打开的文件。我们都知道,linux 环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件。
JOBCHER BLOG
logstash 多管道部署
logstash 多管道部署 找到 logstash 目录位置,一般来说在 /etc/logstash 路径下,修改 logstash.yml 1#增加 日志记录 2path.logs: /var/log/logstash 增加管道 增加 conf.d目录下 test.conf input { beats { host => "0.0.0.0" port => 23000 # 修改端口IP } } filter { mutate{ add_field => { "cluster" => "test" # 修改标签 "job" => "logstash" } } } output { file { path => "/data/路径名称" # 路径名称 gzip => false #匹配以空格开头的行 } } 修改 pipelines.yml 1- pipeline.id: 名称 2 path.config: "/etc/logstash/conf.d/配置文件.conf" 3 queue.
06
JOBCHER BLOG
kubernetes 从1.23.x 升级到 1.24.x
kubernetes 从1.23.x 升级到 1.24.x k8s 在1.24.x之后的版本放弃了和 docker 的兼容,使用 containerd 作为底层的容器,直接参照官方文档的资料进行更新就会报错。因为你没有安装 containerd,所以要安装 containerd 并配置才能正确的升级 k8s 我用的是CentOS7.9的版本,因此以下操作都是在CentOS下操作。 Master 节点操作 1.升级 kubeadm 1yum install -y kubeadm-1.24.2-0 --disableexcludes=kubernetes 2kubeadm version 3kubeadm upgrade plan 4sudo kubeadm upgrade apply v1.24.2 2.安装 containerd 1yum install containerd.io -y 2containerd config default > /etc/containerd/config.toml 3vim /var/lib/kubelet/kubeadm-flags.env 修改 kubeadm-flags.env 变量: 1KUBELET_KUBEADM_ARGS="--pod-infra-container-image=k8s.gcr.io/pause:3.6 --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock" 3.升级 kubelet 1yum install -y kubelet-1.24.2-0 kubectl-1.24.2-0 --disableexcludes=kubernetes 2systemctl daemon-reload && systemctl restart containerd && systemctl restart kubelet 查看状态:
JOBCHER BLOG
编写 kubernetes 资源描述文件
编写 kubernetes 资源描述文件 1. 部署一个应用 1apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本 2kind: Deployment #该配置的类型,我们使用的是 Deployment 3metadata: #译名为元数据,即 Deployment 的一些基本属性和信息 4 name: nginx-deployment #Deployment 的名称 5 labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解 6 app: nginx #为该Deployment设置key为app,value为nginx的标签 7spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用 8 replicas: 1 #使用该Deployment创建一个应用程序实例 9 selector: #标签选择器,与上面的标签共同作用,目前不需要理解 10 matchLabels: #选择包含标签app:nginx的资源 11 app: nginx 12 template: #这是选择或创建的Pod的模板 13 metadata: #Pod的元数据 14 labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod 15 app: nginx 16 spec: #期望Pod实现的功能(即在pod中部署) 17 containers: #生成container,与docker中的container是同一种 18 - name: nginx #container的名称 19 image: nginx:1.
JOBCHER BLOG
nginx ssh-key connection exception
nginx ssh-key connection exception Not long ago, I wanted to restart the company’s gitlab server.I couldn’t coonect to ssh when it restarted.emm……I try copy the ssh rsa.pub,but it didn’t work. error log: identity_sign: private key ~/.ssh/id_rsa contents do not match public what is happen? solution reconfigure gitlab ssh key! create new ssh key 1ssh-keygen -t rsa -C 'git@gitlab.com' -f ~/.ssh/gitlab-rsa update config file,enter ~./ssh,open config 1# add host 2Host gitlab.com 3 HostName gitlab.
JOBCHER BLOG
kubernetes manual expansion
k8s manual expansion We find k8s-master node.Input the Command: expand 1kubectl scale --replicas=3 deploy my-test-deploy shrink 1kubectl scale --replicas=1 deploy my-test-deploy trouble cleaning get resource list 1kubectl get deployment 2kubectl get pods 3kubectl get nodes 4# exists in the namespace 5kubectl api-resources --namespaced=true 6# not exists in the namespace 7kubectl api-resources --namespaced=false show info 1kubectl describe pod my-test-pod 2kubectl describe deployment my-test-pod exec container 1kubectl exec -ti my-test-pod /bin/bash
JOBCHER BLOG
nginx exporter 安装配置
nginx exporter 安装配置 二进制安装 1wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v0.10.0/nginx-prometheus-exporter_0.10.0_linux_amd64.tar.gz 2tar -zxvf nginx-prometheus-exporter_0.10.0_linux_amd64.tar.gz -C ./nginx-exporter 在 nginx 上配置 1./configure \ 2… \ 3--with-http_stub_status_module 4make 5sudo make install 在 nginx.config 上配置 server { # 新增 location /nginx_status { stub_status on; access_log off; } } 重启 nginx 服务 1nginx -t 2nginx -s reload 启动 nginx exporter 1nginx-prometheus-exporter -nginx.scrape-uri http://<nginx>:8080/nginx_status 配置 prometheus 添加 prometheus.yml 1- job_name: "nginx-exporter" 2 file_sd_configs: 3 - files: 4 - "./file_sd/nginx-exporter.yaml" 在 ./file_sd/新建 nginx-exporter.
04
JOBCHER BLOG
go Struct 结构体
go Struct 结构体 结构体是将零个或多个任意类型的变量,组合在一起的聚合数据类型,也可以看做是数据的集合。 声明结构体 1//demo_11.go 2package main 3 4import ( 5 "fmt" 6) 7 8type Person struct { 9 Name string 10 Age int 11} 12 13func main() { 14 var p1 Person 15 p1.Name = "Tom" 16 p1.Age = 30 17 fmt.Println("p1 =", p1) 18 19 var p2 = Person{Name:"Burke", Age:31} 20 fmt.Println("p2 =", p2) 21 22 p3 := Person{Name:"Aaron", Age:32} 23 fmt.Println("p2 =", p3) 24 25 //匿名结构体 26 p4 := struct { 27 Name string 28 Age int 29 } {Name:"匿名", Age:33} 30 fmt.
JOBCHER BLOG
go Slice切片语法
go Slice 切片语法 切片是一种动态数组,比数组操作灵活,长度不是固定的,可以进行追加和删除。 len() 和 cap() 返回结果可相同和不同。 声明切片 1//demo_7.go 2package main 3 4import ( 5 "fmt" 6) 7 8func main() { 9 var sli_1 [] int //nil 切片 10 fmt.Printf("len=%d cap=%d slice=%v\n",len(sli_1),cap(sli_1),sli_1) 11 12 var sli_2 = [] int {} //空切片 13 fmt.Printf("len=%d cap=%d slice=%v\n",len(sli_1),cap(sli_2),sli_2) 14 15 var sli_3 = [] int {1, 2, 3, 4, 5} 16 fmt.Printf("len=%d cap=%d slice=%v\n",len(sli_3),cap(sli_3),sli_3) 17 18 sli_4 := [] int {1, 2, 3, 4, 5} 19 fmt.
JOBCHER BLOG
go 基础知识
go 基础知识 目录结构 1├─ code -- 代码根目录 2│ ├─ bin 3│ ├─ pkg 4│ ├─ src 5│ ├── hello 6│ ├── hello.go bin 存放编译后可执行的文件。 pkg 存放编译后的应用包。 src 存放应用源代码。 Hello World 代码 1//在 hello 目录下创建 hello.go 2package main 3 4import ( 5 "fmt" 6) 7 8func main() { 9 fmt.Println("Hello World!") 10} 基础命令 1go build hello 2#在src目录或hello目录下执行 go build hello,只在对应当前目录下生成文件。 3go install hello 4#在src目录或hello目录下执行 go install hello,会把编译好的结果移动到 $GOPATH/bin。 5go run hello 6#在src目录或hello目录下执行 go run hello,不生成任何文件只运行程序。 7go fmt hello 8#在src目录或hello目录下执行 go run hello,格式化代码,将代码修改成标准格式。 数据类型 类型 表示 备注 字符串 string 只能用一对双引号("")或反引号(``)括起来定义,不能用单引号(’’)定义! 布尔 bool 只有 true 和 false,默认为 false。 整型 int8 uint8 int16 uint16 int32 uint32 int64 uint64 int uint 具体长度取决于 CPU 位数。 浮点型 float32 float64 常量声明 常量,在程序编译阶段就确定下来的值,而程序在运行时无法改变该值。
JOBCHER BLOG
VSCode插件推荐=> Code Runner
VSCode 插件推荐=> Code Runner Run code snippet or code file for multiple languages: C, C++, Java, JavaScript, PHP, Python, Perl, Perl 6, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, Scheme, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, Lisp, Kit, V, SCSS, Sass, CUDA, Less, Fortran, Ring, and custom command
JOBCHER BLOG
ant build.xml 编写
ant build.xml 编写 生成 build.xml Eclipse 自动生成 Ant 的Build.xml 配置文件,生成的方法很隐蔽 选择你要生成Build.xml文件的项目,右键. Export-> General -> Ant Buildfiles . 点 Next,选择项目,再点Finish. 编写 build.xml 1<?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 3<!-- 每个构建文件对应一个项目。<project>标签时构建文件的根标签。它可以有多个内在属性,就如代码中所示,其各个属性的含义分别如下。 4(1) default表示默认的运行目标,这个属性是必须的。 5(2) basedir表示项目的基准目录。 6(3) name表示项目名。 7(4) description表示项目的描述。 8 --> 9<project default="build" name="Sort"> 10 <!-- 设置属性或文件路径,读取属性使用${property},value路径默认项目根目录 --> 11 <property file="ant/builds.properties" /> 12 13 <property name="src.dir" value="src/statics" /> 14 15 <property name="classes.dir" value="ant/classes" /> 16 17 <property name="lib.dir" value="lib" /> 18 19 <property name="dist.
JOBCHER BLOG
kubernetes 调度过程
k8s 调度过程 执行滚动升级 修改 deployment.yml 文件,追加 rollingUpdate 1# 部署应用 2apiVersion: apps/v1 3kind: Deployment 4metadata: 5 name: jobcher-blog-deployment 6 labels: 7 app: jobcher-blog 8spec: 9 replicas: 3 10 selector: 11 matchLabels: 12 app: jobcher-blog 13 minReadySeconds: 10 #准备10s 14 strategy: 15 type: RollingUpdate 16 rollingUpdate: 17 maxUnavailable: 1 #更新期间不少于3-1 18 maxSurge: 1 #更新期间不超过3+1 19 template: 20 metadata: 21 labels: 22 app: jobcher-blog 23 spec: 24 containers: 25 - name: jobcher-blog-pod 26 image: hub.
JOBCHER BLOG
Golang go build 编译不同版本
Golang go build 编译不同系统下的可执行文件 Mac 系统编译 1CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go 2CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go Linux 系统编译 1CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go 2CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go windows 系统编译 1SET CGO_ENABLED=0 SET GOOS=darwin3 SET GOARCH=amd64 go build test.go 2SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build test.go GOOS:目标可执行程序运行操作系统,支持 darwin,freebsd,linux,windows GOARCH:目标可执行程序操作系统构架,包括 386,amd64,arm
JOBCHER BLOG
记录一次上门打散工
记录一次上门打散工 壬寅年头磨难多 人间规则奈吾何 吟诗为把瘟神送 风起大江扬洪波 疫情减弱,遍邀亲友,无人相约,但闻昔日挚友,感怀往事邀吾往之。欲把殷勤牵挂诉,幸之。遂至友舍,诉之:帮忙装个监控吧~ 买物料 和朋友两个人出发,帮朋友邻居家装个监控,他这个监控是要求装在车库里,但是网线要从 4 楼下放下去。所以,我们首先要出门购买一下物料: 带 RJ45 接口监控 足够长的网线 走了 10000 多步人都走傻了~ 布线 这个没啥好说的,纯粹体力活,感谢朋友的暴风之锤,提高了工作效率,加快了项目进度 感谢 感谢朋友,给我这次项目实践和锻炼的机会让我认识到了自己的能力的不足~ 欢迎关注我的博客www.jobcher.com
JOBCHER BLOG
ansible 命令
ansible 命令 Inventory:Ansible 管理的主机信息,包括 IP 地址、SSH 端口、账号、密码等 Modules:任务均有模块完成,也可以自定义模块,例如经常用的脚本。 Plugins:使用插件增加 Ansible 核心功能,自身提供了很多插件,也可以自定义插件。例如 connection 插件,用于连接目标主机。 Playbooks:“剧本”,模块化定义一系列任务,供外部统一调用。Ansible 核心功能。 编辑主机清单 1[webservers] 2192.168.0.20 ansible_ssh_user=root ansible_ssh_pass=’200271200’ 3192.168.0.21 ansible_ssh_user=root ansible_ssh_pass=’200271200’ 4192.168.0.22 ansible_ssh_user=root ansible_ssh_pass=’200271200’ 5 6[dbservers] 710.12.0.100 810.12.0.101 1sed -i "s/#host_key_checking = .*/host_key_checking = False/g" /etc/ansible/ansible.cfg 命令行 1ansible all -m ping 2ansible all -m shell -a "ls /root" -u root -k 常用模块 在目标主机执行 shell 命令。 shell 1- name: 将命令结果输出到指定文件 2 shell: somescript.sh >> somelog.txt 3- name: 切换目录执行命令 4 shell: 5 cmd: ls -l | grep log 6 chdir: somedir/ 7- name: 编写脚本 8 shell: | 9 if [ 0 -eq 0 ]; then 10 echo yes > /tmp/result 11 else 12 echo no > /tmp/result 13 fi 14 args: 15 executable: /bin/bash copy 将文件复制到远程主机。 1- name: 拷贝文件 2 copy: 3 src: /srv/myfiles/foo.
JOBCHER BLOG
Ant中如何添加第三方jar包依赖
Ant 中如何添加第三方 jar 包依赖 如果使用 ant 进行 java 项目的编译部署,那怎么添加第三方 jar 包的依赖呢?方法如下: 在项目的根目录下创建 lib 目录,并把所有需要的第三方 jar 包放到此目录下。 在 build.xml 中依次添加:path、property,并在 javac 中添加 classpath,添加 unjar。完整配置如下: 1<?xml version="1.0" encoding="UTF-8"?> 2<project name="MyTool" default="build" basedir="."> 3 <description>The ant project to build MyTool.</description> 4 <property name="srcDir" location="src" description="源文件的存放目录" /> 5 <property name="libDir" location="lib" description="第三方jar包的存放目录" /> 6 <property name="antDir" location="ant" description="编译后所有文件存放的根目录" /> 7 <property name="binDir" location="${antDir}/bin" description="编译后class文件的存放目录" /> 8 <property name="jarDir" location="${antDir}/jar" description="打包后jar包的存放目录" /> 9 <property name="jarFile" location="${jarDir}/MyTool.
JOBCHER BLOG
k8s本地联调神器kt-connect
k8s 本地联调神器 kt-connect 转载自 Bboysoul’sBlog k8s 集群内部的服务网络怎么和我们本地网络打通。kt-connect 就是用来解决这个问题的 使用方法 下载安装什么的都很简单,一个二进制而已 1https://github.com/alibaba/kt-connect 如果你安装好了,那么直接使用下面的命令使用就好了 1sudo ktctl connect 当然也可以指定配置文件 1sudo ktctl --kubeconfig ~/.kube/local connect 执行完成之后,这个集群的所有svc都可以直接在本地解析,当然直接 ping pod 的 ip 也是可以的
JOBCHER BLOG
OpenELB:让k8s私有环境对外暴露端口
OpenELB:云原生负载均衡器插件 OpenELB 是一个开源的云原生负载均衡器实现,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。 在 Kubernetes 中安装 OpenELB 1kubectl apply -f https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml 查看状态 1kubectl get po -n openelb-system 使用 kubectl 删除 OpenELB 1kubectl delete -f https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml 1kubectl get ns 配置 OpenELB 1kubectl edit configmap kube-proxy -n kube-system 2 3# 修改 网卡 4ipvs: 5 strictARP: true 重启组件 1kubectl rollout restart daemonset kube-proxy -n kube-system 为 master1 节点添加一个 annotation 来指定网卡: 1kubectl annotate nodes master1 layer2.openelb.kubesphere.io/v1alpha1="192.168.0.2" 创建地址池 layer2-eip.yaml 1apiVersion: network.
JOBCHER BLOG
kubernetes ansible自动化部署
kubernetes ansible 自动化部署 服务器规划 角色 IP 组件 k8s-master1 10.12.12.15 kube-apiserver kube-controller-manager kube-scheduler etcd k8s-master2 10.12.12.17 kube-apiserver kube-controller-manager kube-scheduler etcd k8s-02 10.12.12.22 kubelet kube-proxy docker etcd k8s-03 10.12.12.21 kubelet kube-proxy docker etcd load Balancer(master) 10.12.12.15 10.12.12.23(VIP) nginx keepalived load Balancer(backup) 10.12.12.17 nginx keepalived 系统初始化 关闭 selinux,firewalld 关闭 swap 时间同步 写 hosts ssh 免密(可选) etcd 集群部署 生成 etcd 证书 部署三个 ETC 集群 查看集群状态 部署 Masterß 生成 apiserver 证书 部署 apiserver、controller-manager 和 scheduler 组件 启动 TLS Bootstrapping 部署 Node 安装 Docker 部署 Kubelet 和 kube-proxy 在 Master 上运行为新 Node 颁发证书 授权 apiserver 访问 kubelet 部署插件(准备好镜像) Flannel Web UI CoreDNS Ingress Controller Master 高可用 增加 Master 节点(与 Master1 一致) 部署 nginx 负载均衡器 Nginx+Keepalived 高可用 修改 Node 连接 VIP
03
JOBCHER BLOG
Git 规则
Git 飞行规则(Flight Rules) 编辑提交(editting commits) 我刚才提交了什么? 我的提交信息(commit message)写错了 我提交(commit)里的用户名和邮箱不对 我想从一个提交(commit)里移除一个文件 我想删除我的的最后一次提交(commit) 删除任意提交(commit) 我尝试推一个修正后的提交(amended commit)到远程,但是报错: 我意外的做了一次硬重置(hard reset),我想找回我的内容 暂存(Staging) 我需要把暂存的内容添加到上一次的提交(commit) 我想要暂存一个新文件的一部分,而不是这个文件的全部 我想把在一个文件里的变化(changes)加到两个提交(commit)里 我想把暂存的内容变成未暂存,把未暂存的内容暂存起来 未暂存(Unstaged)的内容 我想把未暂存的内容移动到一个新分支 我想把未暂存的内容移动到另一个已存在的分支 我想丢弃本地未提交的变化(uncommitted changes) 我想丢弃某些未暂存的内容 分支(Branches) 我从错误的分支拉取了内容,或把内容拉取到了错误的分支 我想扔掉本地的提交(commit),以便我的分支与远程的保持一致 我需要提交到一个新分支,但错误的提交到了 main 我想保留来自另外一个 ref-ish 的整个文件 我把几个提交(commit)提交到了同一个分支,而这些提交应该分布在不同的分支里 我想删除上游(upstream)分支被删除了的本地分支 我不小心删除了我的分支 我想删除一个分支 我想从别人正在工作的远程分支签出(checkout)一个分支 Rebasing 和合并(Merging) 我想撤销 rebase/merge 我已经 rebase 过, 但是我不想强推(force push) 我需要组合(combine)几个提交(commit) 安全合并(merging)策略 我需要将一个分支合并成一个提交(commit) 我只想组合(combine)未推的提交(unpushed commit) 检查是否分支上的所有提交(commit)都合并(merge)过了 交互式 rebase(interactive rebase)可能出现的问题 这个 rebase 编辑屏幕出现’noop’ 有冲突的情况 Stash 暂存所有改动 暂存指定文件 暂存时记录消息 使用某个指定暂存 暂存时保留未暂存的内容 杂项(Miscellaneous Objects) 克隆所有子模块 删除标签(tag) 恢复已删除标签(tag) 已删除补丁(patch) 跟踪文件(Tracking Files) 我只想改变一个文件名字的大小写,而不修改内容 我想从 Git 删除一个文件,但保留该文件 配置(Configuration) 我想给一些 Git 命令添加别名(alias) 我想缓存一个仓库(repository)的用户名和密码 我不知道我做错了些什么 其它资源(Other Resources) 书(Books) 教程(Tutorials) 脚本和工具(Scripts and Tools) GUI 客户端(GUI Clients) 编辑提交(editting commits) 我刚才提交了什么?
JOBCHER BLOG
shell 脚本(1)
shell 脚本之变量 变量替换 语法 说明 ${变量名#匹配规则} 从变量开头进行规则匹配,将符合最短的数据删除 ${变量名##匹配规则} 从变量开头进行规则匹配,将符合最长的数据删除 ${变量名%匹配规则} 从变量尾部进行规则匹配,将符合最短的数据删除 ${变量名%%匹配规则} 从变量尾部进行规则匹配,将符合最长的数据删除 ${变量名/旧字符串/新字符串} 变量内容符合旧字符串则,则第一个旧字符串会被新字符串取代 ${变量名//旧字符串/新字符串} 变量内容符合旧字符串则,则全部的旧字符串会被新字符串取代 字符串处理 计算字符串长度 - 语法 说明 方法一 ${#string} 无 方法二 expr length “$string” string 有空格,则必须加双引号 获取子串在字符串中的索引位置 语法: expr index $string $substring 计算子串长度 语法: expr match $string substr 抽取子串 ${string:position} :从 string 中的 position 开始 ${string:position:length}:从 position 开始,匹配长度为 length ${string:-position}:从右边开始匹配 ${string:(position)}:从左边开始匹配 expr substr $string $position $length:从 position 开始,匹配长度为 length
JOBCHER BLOG
kubernetes 脚本快速安装
kubernetes 脚本快速安装 1、三台机器设置自己的 hostname(不能是 localhost) 1# 修改 hostname; k8s-01要变为自己的hostname 2hostnamectl set-hostname k8s-01 3# 设置 hostname 解析 4echo "127.0.0.1 $(hostname)" >> /etc/hosts 2、所有机器批量执行如下脚本 1#先在所有机器执行 vi k8s.sh 2# 进入编辑模式(输入i),把如下脚本复制 3# 所有机器给脚本权限 chmod +x k8s.sh 4#执行脚本 ./k8s.sh 1#/bin/sh 2 3#######################开始设置环境##################################### \n 4 5 6printf "##################正在配置所有基础环境信息################## \n" 7 8 9printf "##################关闭selinux################## \n" 10sed -i 's/enforcing/disabled/' /etc/selinux/config 11setenforce 0 12printf "##################关闭swap################## \n" 13swapoff -a 14sed -ri 's/.*swap.*/#&/' /etc/fstab 15 16printf "##################配置路由转发################## \n" 17cat <<EOF | sudo tee /etc/modules-load.