K8s 开启临时容器功能

1、开始

k8s 在1.16以后加入了debug 功能,开启临时容器(EphemeralContainers)特性后,就可以调式容器。因为是此功能处于alpha阶段,默认不会启用,下面说下开启方法:

在管理节点编辑如下两个文件:

  • /etc/kubernetes/manifests/kube-apiserver.yaml
  • /etc/kubernetes/manifests/kube-scheduler.yaml

command 部分加入如下代码:--feature-gates=EphemeralContainers=true

这样在接下来创建的新pod 就可以使用临时容器功能。

2、使用

##进程共享模式
~ $ kubectl run some-app --image=nginx --restart=Never
~ $ kubectl debug -it some-app --image=busybox --share-processes --copy-to=some-app-debug

##注入pod 检查网络类问题
## 在1.21.2上测试,运行debug后一直不显示命令行,暂时不可用
~ $ kubectl run distroless-python --image=martinheinz/distroless-python --restart=Never
kubectl debug -it distroless-python --image=praqma/network-multitool --target=distroless-python -- sh

##node 节点调式
##如要调式的node节点名称为work2,这样会创建一个pod,node的/文件在/host目录下
kubectl debug node/work2 -it --image=centos

etcd 备份

环境说明:k8s 版本1.21.1 ,无docker

方法一 pod中执行备份

先exec 进入etcd的pod kubectl exec -nkube-system -it pod/etcd-master -- sh
执行命令:

etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt                  \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key     \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt    \
snapshot save /var/lib/etcd/etcd-snapshot.db

说明,etcd 会把宿主机的 /var/lib/etcd/ 目录mount 到container 的同名目录 /var/lib/etcd/ ,因此执行上述命令后 ,可以在宿主机的对应目录下找到备份文件

方法二 master安装etcdctl二进制文件备份

find 之 perm 篇

-perm 查找文件或目录的权限设置,返回匹配的项目。其中匹配规则有3种写法:

mode   完全匹配,         如 -perm g=w  只匹配 0020  (----w----)
-mode  满足所有设置位匹配 如 -perm -664  可以匹配 0777(转化下好理解rw*rw*r**)
/mode  满足任意一位匹配   如 -perm /220 ; /u+w,g+w ; /u=w,g=w  ,代表u 或则g 有写权限即匹配。()
+mode  已弃用,被/mode 取代

vim 自动缩进

set nu 
"代码显示行号
syntax on 
"关键词高亮显示
set cindent 
"c语法自动缩进
set autoindent 
"新行自动缩进
set shiftwidth=4 
"缩进宽度4
set tabstop=4 
"tab键宽度4
set softtabstop=4 
"制表符宽度4

把相关代码放到 /etc/vim/vimrc 则打开vim自动生效,否则需要每次打开输入生效

彻底搞透${var##pattern}类用法

我理解后给的定义如下

  • 这是一种根据某个标记删除变量左边或右边片段的用法。
  • 删左边用#,删右边用%,这个好记,#和%在键盘上一个左一个右,看下键盘就清楚。
  • 还有单个符号匹配最少,两个符号匹配最多

所以衍生出四种表达式

${var#pattern} 最小匹配左删除
${var##pattern} 最大匹配左删除
${var%pattern} 最小匹配右删除
${var%%pattern} 最大匹配右删除

var为变量 pattern为匹配格式

这样比较抽象,实际举个例子

比如var=”/var/logs/nginx/access.log”,

  • 我想取文件名access.log,那么需要删除/左边部分/var/logs/nginx,得出得用#,然后发现左边部分有很多份/分隔得用##,最后左边部分可以用*来表示,pattern就可以写成*/,最后就得到 ${var##*/}
  • 我想取文件所在路径 /var/logs/nginx/ ,那么需要删除/右边部分access.log,得出得用%,然后发现只需要匹配一个/分隔,那用单%就可以了,最后右边部分也可以用*表示,pattern可以写成/*,最后得到 ${var%/*}
[root@mail k8s]# var="/var/logs/nginx/access.log"
[root@mail k8s]# echo  ${var##*/}
access.log
[root@mail k8s]# echo ${var%/*}
/var/logs/nginx

所以这里的*/ 和 /* 都是匹配的格式,删左边的*写标记符/左边,删右边*就写/右边

再来个例子

还有种用法是重命名”aafad23aa54d11eaaa3efa163e57590a_09Pod管理与使用.pdf”这种类型的文件为”09Pod管理与使用.pdf”,还是讲下逻辑过程:

var=”aafad23aa54d11eaaa3efa163e57590a_09Pod管理与使用.pdf” ,这里要删除”aafad23aa54d11eaaa3efa163e57590a_”部分,很明显可以找出

  • 分隔符”_”
  • 左删除,用#,最少最多删效果是一样的所以#或##都可以
  • 匹配格式写 *_

最终的表达式就是 ${var#*_} 或则 ${var##*_}

[root@mail k8s]# var="aafad23aa54d11eaaa3efa163e57590a_09Pod管理与使用.pdf"
[root@mail k8s]# echo ${var##*_}
09Pod管理与使用.pdf
[root@mail k8s]# echo ${var#*_}
09Pod管理与使用.pdf

sudo

添加普通用户使用管理员权限,只需用visudo 命令修改/etc/sudoers文件。格式说明

root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
#%wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
模块含义
用户名或群组名表示系统中的那个用户或群组,可以使用 sudo 这个命令。
被管理主机的地址用户可以管理指定 IP 地址的服务器。这里如果写 ALL,则代表用户可以管理任何主机;如果写固定 IP,则代表用户可以管理指定的服务器。如果我们在这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而是代表指定的用户可以从任何 IP 地址来管理当前服务器。
可使用的身份就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略。
授权命令表示 root 把什么命令命令授权给用户,换句话说,可以用切换的身份执行什么命令。需要注意的是,此命令必须使用绝对路径写。默认值是 ALL,表示可以执行任何命令。多命令逗号分隔
如果要设置为免输密码,在 授权命令的位置 替换成 NOPASSWD: ALL

证书链合并

浏览器报错的证书链的问题,我们一般会有三种证书:

  • RootCA.crt(rCA,被信任的根证书)
  • IntermediateCA.crt(mCA,某些厂商有多个中间证书)
  • server.crt(sCA,通过CSR签下来的证书)

某些厂商的rCA和mCA是需要用户自己下载的。为了让浏览器能够信任我们的证书,我们需要配置一条完整的证书链,证书链由sCA和mCA构成就好,rCA是浏览器内置,不需要服务器给提供。nginx配置证书链的时候,就是指定一个证书文件,这个文件中含有我们整个证书链的所有证书就好,证书合并的时候,

正确的合并方法: 是把 mCA 合并到 sCA 中。当有多个 mCA 文件时,mCA 从下级到上级(根证书为最上级)依次合并到 sCA 中。在这个过程中,rCA 被视为多余的文件。

# Combined Certificates

-----BEGIN CERTIFICATE-----
...... sCA ......
------END CERTIFICATE------

-----BEGIN CERTIFICATE-----
...... mCA (lower) ......
------END CERTIFICATE------

-----BEGIN CERTIFICATE-----
...... mCA (upper) ......
------END CERTIFICATE------

证书链的问题解决后,基本应该就可以正常工作了。

.crt服务器证书文件直接通过记事本打开,.cer中级证书也直接通过记事本打开,然后按照如上规则,将两个文件合并(服务器证书内容在最上面,中级证书内容在下面),最后直接使用合并后的文件即可,这样就不会再报中级证书(证书链)的问题了。

注:实际上.crt跟.cer证书文件内容一样,只是扩展名不同而已。

注:服务器证书包含.crt和.key文件

附证书链检测网站: https://csr.chinassl.net/ssl-checker.html

jenkins agent 部署

如果jenkins 主节点不能直接连接待部署项目的服务器A,但是A可以访问互联网,主节点也暴露在互联网上,可以通过在A所在的网络的选一台B主机安装agent ,通过这个agent来构建和发布。

相关配置注意点:

  • agent启动方式选择 “通过java Web启动代理”;
  • agent 配置标签,用法选择“只允许运行绑定到这台机器的Job”
  • 工具位置配置 agent中nodejs 安装的路径
  • agent 需要安装 git ,nodejs, agent需要 git, maven,node.js, java(以上都可以在全局工具配置自动安全), rsync(部署同步包到目的主机,双方都要装)
  • nodejs目录设置777权限,保证agent可以下载相关的编译依赖包 chmod -R 777 [node目录]
    自动部署,这部省略
  • 配置 JAVA_HOME 配置 ,全局默认路径/usr/lib/jvm/default-java (我的master),所以agent,安装了open-jdk要有这个目录,并且link到对应的jkd程序目录
  • agent网络,要允许访问,git-88, jenkins master 8087-8088 ,nexus 88(maven包和npm包)

在master上新建节点完成上面的操作后,返回节点列表,此时的点击显示未连接状态。点解刚创建的节点名称“test”,如下图

点击如图2的agent.jar 下载后传到agent所在服务器,然后在agent节点运行给出的命令启动agent服务。

启动后等待一会,就可以看到节点列表显示已经连接状态。