October 31, 2022
在 vmware 里扩容Linux硬盘空间
"\u003cp\u003e在mac上创建了一个ubuntu的虚拟机做为k8s远程开发调试机器,但在编译程序的时候发现磁盘空间不足,于是需要对磁盘进行扩容。\u003c/p\u003e\n\u003cp\u003e下面为整个硬盘扩容过程。\u003c/p\u003e\n\u003ch1 id=\"硬盘扩容\"\u003e硬盘扩容\u003c/h1\u003e\n\u003cp\u003e首先将虚拟机关机,在 Vmware Fusion 软件上面菜单,点击 \u003ccode\u003eVirtual Machine\u003c/code\u003e -\u0026gt; \u003ccode\u003eSetting\u003c/code\u003e 菜单,然后在突出框框里的找到硬盘 \u003ccode\u003eHard Disk\u003c/code\u003e ,点击调整硬盘空间大小,然后点击\u003ccode\u003eApply\u003c/code\u003e 应用按钮。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/10/68da0b3518a7ced98a9fd17cb55b89dd-1.webp\" alt=\"image-20230728130214297\"\u003e\u003c/p\u003e\n\u003ch1 id=\"磁盘格式化\"\u003e磁盘格式化\u003c/h1\u003e\n\u003cp\u003e查看当前磁盘分区信息\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esxf@vm:~/workspace$ sudo fdisk -l\n[sudo] password for sxf:\nDisk /dev/loop0: 63.29 MiB, 66359296 bytes, 129608 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\n\nDisk /dev/loop1: …\u003c/code\u003e\u003c/pre\u003e"
October 30, 2022
Linux下两种 DNAT 用法的差异
"\u003cp\u003e前段时间使用 \u003ccode\u003eiptables\u003c/code\u003e 的 \u003ccode\u003eDNAT\u003c/code\u003e 实现一个业务需求的时候,遇到了一些问题这里将其整个过程记录下来。\u003c/p\u003e\n\u003ch2 id=\"需求\"\u003e需求\u003c/h2\u003e\n\u003cp\u003e这里假设开发机地址为 \u003ccode\u003e192.168.3.80\u003c/code\u003e,要实现的需求是当用户在开发机访问一个IP地址 \u003ccode\u003e192.168.3.196\u003c/code\u003e时,将请求转发到另一台机器 \u003ccode\u003e192.168.3.58\u003c/code\u003e,很明显直接使用 \u003ccode\u003eDNAT\u003c/code\u003e 来实现即可。\u003c/p\u003e\n\u003ch2 id=\"问题现象\"\u003e问题现象\u003c/h2\u003e\n\u003cp\u003eiptables 命令如下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo iptables -t nat -F\nsudo iptables -t nat -A PREROUTING -d 192.168.3.196 -p tcp --dport 8080 -j DNAT --to-destination 192.168.3.58:8080\nsudo iptables -t nat -A POSTROUTING -d 192.168.3.58 -p tcp --dport 8080 -j SNAT --to-source 192.168.3.196:8080\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这时在开发机器访问\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecurl http://192.168.3.196:8080\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e发现提示错误\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecurl: (7) Failed …\u003c/code\u003e\u003c/pre\u003e"
July 20, 2022
Linux中调试 iptables
"\u003cp\u003e环境:\u003c/p\u003e\n\u003cp\u003e客户端(windows) 192.168.6.21\u003c/p\u003e\n\u003cp\u003e服务器(Ubuntu): 192.168.6.23\u003c/p\u003e\n\u003ch1 id=\"开启iptables调试内核模块\"\u003e开启iptables调试内核模块\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ modprobe nf_log_ipv4\n $ sysctl net.netfilter.nf_log.2\n net.netfilter.nf_log.2 = nf_log_ipv4\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"添加iptables规则\"\u003e添加iptables规则\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ iptables -t raw -A PREROUTING -p icmp -j TRACE\n $ iptables -t raw -A OUTPUT -p icmp -j TRACE\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"测试规则\"\u003e测试规则\u003c/h1\u003e\n\u003cp\u003e客户端执行 ping 命令,\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e $ ping 192.168.6.23 -n 1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里使用 -n 参数指定发送的包数量为1,方便我们分析日志\u003c/p\u003e\n\u003cp\u003e此时在服务器上执行查看日志命令, 日志文件为:\u003ccode\u003e/var/log/syslog\u003c/code\u003e 或者 \u003ccode\u003e/var/log/kern.log\u003c/code\u003e 或者 \u003ccode\u003e/var/log/messages\u003c/code\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ tail -f /var/log/syslog\n Jul 20 11:28:40 ubuntu kernel: [ …\u003c/code\u003e\u003c/pre\u003e"
June 10, 2022
https 是如何建立连接的
"\u003ch2 id=\"一什么是httpstlsssl\"\u003e\u003cstrong\u003e一、什么是HTTPS、TLS、SSL\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eHTTPS,也称作HTTP over TLS。TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/06/7584c4e760a0c0191e913baf0a49fc9b.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch2 id=\"二http和https协议的区别\"\u003e\u003cstrong\u003e二、HTTP和HTTPS协议的区别\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e1、HTTPS协议需要到证书颁发机构(Certificate Authority,简称CA)申请证书,一般免费证书很少,需要交费。\u003c/p\u003e\n\u003cp\u003e2、HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。\u003c/p\u003e\n\u003cp\u003e3、HTTP和HTTPS使用的是完全不同的连接方式,使用的端口也不一样,前者是80,后者是443。\u003c/p\u003e\n\u003cp\u003e4、HTTP的连接很简单,是无状态的。\u003c/p\u003e\n\u003cp\u003e5、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。\u003c/p\u003e\n\u003cp\u003e从上面可看出,HTTPS和HTTP协议相比提供了\u003c/p\u003e\n\u003cp\u003e· 数据完整性:内容传输经过完整性校验\u003c/p\u003e\n\u003cp\u003e· 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥\u003c/p\u003e\n\u003cp\u003e· 身份认证:第三方无法伪造服务端(客户端)身份\u003c/p\u003e\n\u003cp\u003e其 …\u003c/p\u003e"
June 10, 2022
实现 Linux 终端录屏转gif动画
"\u003cp\u003e在一些开源其中,有些文档使用git动画来介绍的话效果会好很多,所以这里把在Linux终端下如何生成git动画效果整理出来,供大家参考。\u003cimg src=\"https://s3.eu-central-1.amazonaws.com/sickill/github/asciicast2gif/demo-2.gif\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch2 id=\"安装录屏软件-asciinema\"\u003e安装录屏软件 asciinema\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMac\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e brew install asciinema\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eUbuntu\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e sudo apt-add-repository ppa:zanchey/asciinema\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eDebian\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e sudo apt-get install asciinema\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePip安装\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e sudo pip3 install asciinema\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e目前此软件不支持 Windows。更多安装教程参考:\u003c/p\u003e\n\u003ch2 id=\"用法介绍\"\u003e用法介绍\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e ❯ asciinema -h\n usage: asciinema [-h] [--version] {rec,play,cat,upload,auth} ...\n \n Record and share your terminal sessions, the right way.\n \n positional arguments:\n {rec,play,cat,upload,auth}\n rec …\u003c/code\u003e\u003c/pre\u003e"
May 24, 2022
Linux 中的 Tun/Tap 介绍
"\u003ch1 id=\"tuntap-设备\"\u003eTUN/TAP 设备\u003c/h1\u003e\n\u003cp\u003e在计算机中TUN与TAP是操作系统内核中的虚拟网络设备。不同于硬件设备这些虚拟的网络设备全部用软件实现,但提供了与硬件设备完全相同的功能。\u003c/p\u003e\n\u003cp\u003e我们先了解一下物理设备的工作原理\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/07/57e54aad529225723698841910e61c46.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e所有主机物理网卡收到的数据包时,会先将其交给内核的 Network Stack 处理,然后通过 Socket API 通知给用户态的用户程序。\u003c/p\u003e\n\u003cp\u003eLinux 中 \u003ccode\u003eTun/Tap\u003c/code\u003e 驱动程序为应用程序提供了两种交互方式:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e虚拟网络接口和字符设备 \u003ccode\u003e/dev/net/tun\u003c/code\u003e。写入字符设备 \u003ccode\u003e/dev/net/tun\u003c/code\u003e 的数据会发送到虚拟网络接口中;\u003c/li\u003e\n\u003cli\u003e发送到虚拟网络接口中的数据也会出现在该字符设备上;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我们再看下 tun 设备的工作原理\n\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/07/ece6896a211da4167687ea55edc4f2c9.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e用户态应用往字符设备 \u003ccode\u003e/dev/tunX\u003c/code\u003e 写数据时,写入的数据都会出现在TUN虚拟设备上,当内核发送一个包给 TUN 虚拟设备时,通过读这个字符设备 \u003ccode\u003e/dev/tunX\u003c/code\u003e 同样可以拿到包的内容。\u003c/p\u003e\n\u003cp\u003e用户态应用程序写数据到 \u003ccode\u003etun/tap\u003c/code\u003e 设备后进入内核态,内核态通过TCP协议复制到用户态,最后数据再次复制到内核态并通过物理网卡转发出去,期间共经历了三次用户态与内核态的复制 …\u003c/p\u003e"
March 31, 2022
用 Goalng 开发 OPA 策略
"\u003cp\u003e\u003ccode\u003eOpen Policy Agent\u003c/code\u003e 简称\u003ccode\u003eOPA\u003c/code\u003e是一个开源的通用策略引擎,可在整个堆栈中实现统一的、上下文感知的策略实施。OPA 已经成为了云原生计算基金会 ( \u003ca href=\"https://www.cncf.io/\"\u003eCNCF\u003c/a\u003e) 领域的毕业项目,已经在 \u003ca href=\"https://www.openpolicyagent.org/docs/kubernetes-admission-control.html\"\u003eKubernetes\u003c/a\u003e / \u003ca href=\"https://istio.io\"\u003eIstio\u003c/a\u003e 等多个知名项目里使用 。\u003c/p\u003e\n\u003cp\u003eOPA的核心思想就是策略即代码。\u003c/p\u003e\n\u003cp\u003e它使用\u003ccode\u003eRego\u003c/code\u003e语言开发,Rego 的灵感来自 \u003ca href=\"https://en.wikipedia.org/wiki/Datalog\"\u003eDatalog\u003c/a\u003e,它是一种易于理解、已有数十年的历史的查询语言。Rego 扩展了 Datalog 以支持 JSON 等文档模型。对于它的详细介绍请参考官方文档 ,这里不再介绍,本方主要介绍如何使用Golang 来开发一个opa策略。\u003c/p\u003e\n\u003ch1 id=\"概述\"\u003e概述\u003c/h1\u003e\n\u003cp\u003eOPA 将 \u003ccode\u003e策略决策\u003c/code\u003e 与 \u003ccode\u003e策略执行\u003c/code\u003e 分离,当您的软件需要做出策略决策时,它会查询 OPA 并提供结构化数据(例如 JSON)作为输入。 OPA 接受任意结构化数据作为输入。\u003cimg src=\"https://d33wubrfki0l68.cloudfront.net/b394f524e15a67457b85fdfeed02ff3f2764eb9e/6ac2b/docs/latest/images/opa-service.svg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e对于它的输入一般称为 \u003ccode\u003einput\u003c/code\u003e, 可以为任意类型,输出也一样可以为任意类型,即可以输出布尔值 \u003ccode\u003etrue\u003c/code\u003e 或 \u003ccode\u003efalse\u003c/code\u003e,也可以输出一个 \u003ccode\u003eJSON\u003c/code\u003e 字符串对象。\u003c/p\u003e\n\u003ch1 id=\"示例\"\u003e示例\u003c/h1\u003e\n\u003cp\u003e我们先从官方提供的一个 playground 开始,它是一个官方提供的在线执行 …\u003c/p\u003e"
February 25, 2022
一文看懂Golang 定时器源码
"\u003cp\u003e计时器分 Timer 和 Ticker 两种,它们底层基本是一样的,两差的区别请参考 , 这里我们的介绍对象是 Timer 。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2022/03/fcabf1624c9030edb67ec1e8bf7ad4d9.png\" alt=\"\"\u003egolang timer\u003c/p\u003e\n\u003ch1 id=\"计时器结构体.wp-block-heading\"\u003e计时器结构体\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e // NewTimer creates a new Timer that will send\n // the current time on its channel after at least duration d.\n func NewTimer(d Duration) *Timer {\n c := make(chan Time, 1)\n t := \u0026amp;Timer{\n C: c,\n r: runtimeTimer{\n when: when(d),\n f: sendTime,\n arg: c,\n },\n }\n startTimer(\u0026amp;t.r)\n return t\n }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e通过调用 \u003ccode\u003eNewTimer()\u003c/code\u003e 函数创建一个 \u003ccode\u003eTimer\u003c/code\u003e,首先创建一个长度 …\u003c/p\u003e"
January 8, 2022
了解eBPF技术
"\u003cp\u003eeBPF 的全称“扩展的伯克利数据包过滤器 (Extended Berkeley Packet Filter)” 来看,它是一种数据包过滤技术,是从 BPF (Berkeley Packet Filter) 技术扩展而来的。\u003c/p\u003e\n\u003cp\u003eBPF 提供了一种在 内核事件 和 用户程序 事件发生时安全注入代码的机制,这就让非内核开发人员也可以对内核进行控制。随着内核的发展,BPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等,而且它的功能特性还在快速发展中,这种扩展后的 BPF 被简称为 eBPF(早期的 BPF 被称为经典 BPF,简称 cBPF)。实际上,现代内核所运行的都是 eBPF,如果没有特殊说明,内核和开源社区中提到的 BPF 等同于 eBPF 。\u003c/p\u003e\n\u003ch1 id=\"使用场景及分类\"\u003e使用场景及分类\u003c/h1\u003e\n\u003cp\u003e根据 eBPF 的功能和使用场景,主要分类三类:\u003c/p\u003e\n\u003ch2 id=\"跟踪\"\u003e跟踪\u003c/h2\u003e\n\u003cp\u003e从内核和程序的运行状态中提取跟踪信息,来了解当前系统正在发生什么。\u003c/p\u003e\n\u003cp\u003e跟踪类 eBPF 程序主要用于从系统中提取跟踪信息,进而为监控、排错、性能优化等提供数据支撑。\u003c/p\u003e\n\u003cp\u003e其中 \u003ca href=\"https://github.com/iovisor/bcc/blob/master/docs/tutorial.md\"\u003eBCC\u003c/a\u003e 工具集中包含的绝大部分工具也都属于这个类型。\u003c/p\u003e\n\u003ch2 id=\"网络\"\u003e网络\u003c/h2\u003e\n\u003cp\u003e对网络数据包进行过滤和处理,以便了 …\u003c/p\u003e"
November 25, 2021
Golang常见编译参数
"\u003cp\u003e在执行 go build 命令的时候,经常需要添加一些参数,或许是为了调试,也或许是为了生成最终部署二进制文件。\u003c/p\u003e\n\u003cp\u003e在编译特定包时需要传递参数,格式应遵守“包名=参数列表”,如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ego build -gcflags -gcflags=\u0026#39;log=-N -l\u0026#39; main.go\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"-gcflags\"\u003e-gcflags\u003c/h2\u003e\n\u003cp\u003ego build 可以用 \u003cem\u003e-gcflags\u003c/em\u003e 给_go_编译器传入参数,也就是传给 go tool compile 的参数,因此可以用 go tool compile –help 查看所有可用的参数。\u003c/p\u003e\n\u003cp\u003e其中 -m 可以检查代码的编译优化情况,包括逃逸情况和函数是否内联。\u003c/p\u003e\n\u003ch2 id=\"-ldflags\"\u003e-ldflags\u003c/h2\u003e\n\u003cp\u003ego build用 -ldflags 给go链接器传入参数,实际是给go tool link的参数,可以用go tool link –help查看可用的参数。\u003c/p\u003e\n\u003cp\u003e常用-X来指定版本号等编译时才决定的参数值。例如代码中定义var buildVer string,然后在编译时用go build -ldflags “-X main.buildVer=1.0” … 来赋值。注意-X只能给string类型变量赋值。\u003c/p\u003e"
November 25, 2021
Golang中的 CGO_ENABLED 环境变量
"\u003cp\u003eGolang中的编译参数\u003c/p\u003e\n\u003cp\u003e开发中经常使用 \u003ccode\u003ego build\u003c/code\u003e 命令来编译我们的程序源码,然后将生成二进制文件直接部署,极其方便。\u003c/p\u003e\n\u003cp\u003e对于 \u003ccode\u003ego build\u003c/code\u003e 有一些参数,对于针对程序源码进行一些编译优化,下面我们对经常使用的一些参数来介绍一下。\u003c/p\u003e\n\u003ch1 id=\"环境变量\"\u003e环境变量\u003c/h1\u003e\n\u003cp\u003e环境变量需要在go命令前面设置,如果多个变量的话,中间需要用“空格”分隔。下面我们介绍一个非常常见到的一些环境变量\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ CGO_ENABLED=1 GOARCH=amd64 GOOS=linux go build -o myserver main.go\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e除了这里给出的这几个变量外,还有一些其它变量,如 GODEBUG、GOFLAGS、GOPROXY 等,所有支持环境变量都可以在 里找到,有兴趣的话可以看看他们的作用。\u003c/p\u003e\n\u003cp\u003e这里重点介绍一下 \u003ccode\u003eCGO_ENABLED\u003c/code\u003e 环境变量对我们程序的影响。 \u003ccode\u003eCGO_ENABLED\u003c/code\u003e是用来控制golang 编译期间是否支持调用 cgo 命令的开关,其值为1或0,默认情况下值为1,可以用 \u003ccode\u003ego env\u003c/code\u003e 查看默认值。\u003c/p\u003e\n\u003cp\u003e如果你的程序里调用了cgo 命令,此参数必须设置为1,否则将编译时出错。这里直接用文档 中的一个例 …\u003c/p\u003e"
November 23, 2021
理解 firewalld/ufw 与iptables、netfilter 的关系
"\u003cp\u003eiptables 作为 Linux/Unix 下一款优秀的防火墙软件,在安全方面发挥着极其重要的作用,作为系统管理员来讲一点也不陌生。不过对于一些新手来说,复杂性是一个门槛,Linux厂商为了解决这个问题,于是推出了新的管理工具,如 Centos 下的 Firewalld 和 Ubuntu 下的ufw, 他们对新手十分友好,只需要几个很简单的命令即可实现想要的功能,再不也必为记不住iptables中的四表五键而烦恼了。\n那么,是不是有了 firewalld 和 ufw就不需要iptables了呢?并不是的。\u003c/p\u003e\n\u003cp\u003e首先我们要清楚firewalld、ufw 与iptables的关系,可以理解为两者只是对iptables其进行了一层封装,它们在用户交互方面做了非常多的改进,使其对用户更加友好,不需要再记住原来那么多命令了。\u003c/p\u003e\n\u003cp\u003e而目前对于一些系统管理员来讲,大概率还是会直接使用 iptables,主要原因是灵活性,当然也有一定的历史原因。对比前面两个管理工具,他们也存在一定的问题,如只能对单条规则进行管理,详细参考相关文档。\u003c/p\u003e\n\u003cp\u003e另外对于 firewalld 还有图形界面。 …\u003c/p\u003e"
November 23, 2021
利用代理拉取docker镜像
"\u003cp\u003e在日常开发中经常会遇到有些镜像在 gcr.io 仓库,其仓库是google提供的,由于国内网络环境的复杂性是无法拉取到这些镜像的,这时候就需要我们想一些办法来实现拉取了。\u003c/p\u003e\n\u003cp\u003e这里给出了两种解决方法,一种是直接使用代理,这种可以直接拉取远程镜像到本地。另一种是通过中转的方法,先找一个可以直接拉取到镜像的网络,先将存储到本地,然后再转镜像上传到三方国内可以访问的镜像,如我们最常用镜像 \u003ca href=\"https://hub.docker.com\"\u003ehttps://hub.docker.com\u003c/a\u003e。\u003c/p\u003e\n\u003ch1 id=\"代理方式\"\u003e代理方式\u003c/h1\u003e\n\u003cp\u003e使用代理方法的时候,如果通过直接设置 http_proxy 和 https_proxy 这两个环境变量是不可行的。如果是k8s环境的话,可能会使用到 \u003ccode\u003econtainerd\u003c/code\u003e 运行时,这时可能还需要设置 \u003ccode\u003ecrictl\u003c/code\u003e 配置,因此下面将分别介绍这个软件的配置方式。\u003c/p\u003e\n\u003cp\u003e如果k8s运行时,使用的是 Docker Engine ,则可以通过 docker 命令管理镜像;如果使用的是 \u003ccode\u003econtainerd\u003c/code\u003e运行时,则需要通过 \u003ccode\u003ecrictl\u003c/code\u003e 命令管理镜像。\u003c/p\u003e\n\u003cp\u003e不同运行时需要不同的管理客户端,因此下面我们将一下针对这两个软件配置的不同代理配置。 …\u003c/p\u003e"
October 9, 2021
k8s解决证书过期问题
"\u003cp\u003e在k8s中的时间会提示证书过期问题,如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# kubectl get nodes\nUnable to connect to the server: x509: certificate has expired or is not yet valid\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里我们介绍一下续期方法。\u003c/p\u003e\n\u003cp\u003e注意:当前集群通过 kubeadm 命令创建。\u003c/p\u003e\n\u003cp\u003ekubeadm 安装得证书默认为 1 年,\u003cstrong\u003e注意原证书文件必须保留在服务器上才能做延期操作,否则就会重新生成,集群可能无法恢复\u003c/strong\u003e。\u003c/p\u003e\n\u003ch1 id=\"准备\"\u003e准备\u003c/h1\u003e\n\u003cp\u003e这里先查看一下测试集群的证书过期时间\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# kubeadm certs check-expiration\n[check-expiration] Reading configuration from the cluster...\n[check-expiration] FYI: You can look at this config file with \u0026#39;kubectl -n kube-system get cm kubeadm-config -o yaml\u0026#39;\n\nCERTIFICATE …\u003c/code\u003e\u003c/pre\u003e"
September 13, 2021
istio在虚拟机vm下的安装方法
"\u003cp\u003e建议参考官方文档 https://istio.io/latest/zh/docs/setup/install/virtual-machine/ ,这里提醒大家对于命令中文版部分命令与英文版不一致,请以 \u003cstrong\u003e英文版\u003c/strong\u003e 为准。\u003c/p\u003e\n\u003cp\u003e对于istio在vm上的安装教程主要分为三部分。首先是在k8s的master节点生成vm连接主节点的一些配置信息,其实是在vm上应用这些配置信息,最后也就是验证连接是否成功。\u003c/p\u003e\n\u003cp\u003e本篇主要介绍“单网络”的情况, 对于”多网络“请自行参考官方文档。\u003c/p\u003e\n\u003ch1 id=\"vm环境准备\"\u003evm环境准备\u003c/h1\u003e\n\u003ch2 id=\"生成vm通讯配置信息\"\u003e生成vm通讯配置信息\u003c/h2\u003e\n\u003cp\u003e这里主要介绍一些新手迷惑的部分。如环境变量设置及vm注册的方式\u003c/p\u003e\n\u003ch3 id=\"设置环境变量\"\u003e设置环境变量\u003c/h3\u003e\n\u003cp\u003e在设置变量时,对于”单网络“来讲 CLUSTER_NETWORK 和 VM_NETWORK 保留空值即可。如我这里设置如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ VM_APP\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;myapp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ VM_NAMESPACE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;vm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ WORK_DIR\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;/root/myapp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ SERVICE_ACCOUNT\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;vm-sa\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ CLUSTER_NETWORK\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34; …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"