Centos7打开终端自动进入Tmux会话

编辑~/.bash_profile

vim ~/.bash_profile

添加以下脚本.

1
2
3
4
# 登录到远程系统,将进入一个名为'default'的新Tmux会话。
if [ -z "$TMUX" ]; then
tmux attach -t default || tmux new -s default
fi

tmux常用方法

参考: https://www.ruanyifeng.com/blog/2019/10/tmux.html

新建会话

1
tmux new -s my_session。

脱离会话

也叫分离当前会话.

  • Ctrl + bd使其脱离,即使在网络断开后,该进程依然会在Tmux会话中运行.

列出所有会话

  • Ctrl+b s:列出所有会话。

重命名会话

  • Ctrl+b $:重命名当前会话。

连接会话

1
tmux attach-session -t my_session。

关闭会话

  • Ctrl+b x:关闭当前窗格。

Centos7安装hexo

yum安装nodejs LTS V16

nodejs地址: https://nodejs.org/zh-cn/download/

1
2
3
4
5
# 安装yum源
curl -fsSL https://rpm.nodesource.com/setup_lts.x | bash -

# yum安装nodejs
sudo yum -y install nodejs

查看node和npm版本

1
2
node -v
npm -v

安装hexo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
npm install hexo-cli -g
npm install hexo

hexo -v

# 安装hexo部署插件
npm install hexo-deployer-git --save

# 安装hexo-server,用于预览静态网站
npm install hexo-server --save

# 安装本地搜索插件
npm install hexo-generator-searchdb --save

# 安装文章字数统计及阅读时常功能
npm install hexo-wordcount --save

# 安装图片显示插件(实测没用)
npm install hexo-asset-img --save

发布文件

1
2
3
4
5
6
7
8
# 编辑这个文章
source\_posts\hexo部署gitpage.md


# 解决办法清除缓存和已生成的静态文件
# 生成静态页面并发布文章
# 打开hexo服务
hexo clean && hexo g -d && hexo s

Centos7安装socks5

编译安装socks5

安装编译环境

1
yum -y install gcc gcc-c++ automake make pam-devel openldap-devel cyrus-sasl-devel openssl-devel

下载源码包

项目地址: http://ss5.sourceforge.net/software.htm

1
wget https://jaist.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz

编译安装

1
2
3
tar zxvf ss5-3.8.9-8.tar.gz
cd ss5-3.8.9/
./configure && make && make install

修改配置文件ss5.conf

vim /etc/opt/ss5/ss5.conf

1
2
3
4
5
6
7
8
#auth段  SHost SPort  Authentication
#认证 源地址段 源端口 认证方式
#认证 允许所有地址所有端口访问 以用户密码验证
auth 0.0.0.0/0 - u

#permit段 Auth SHost SPort DHost DPort Fixup Group Band ExpDate
#permit段 认证方式 源地址段 源端口 目的地地址段 目的地端口 Fixup Group Band ExpDate
permit u 0.0.0.0/0 - 0.0.0.0/0 - - - - -

添加用户名和密码

vim /etc/opt/ss5/ss5.passwd

一行一个账号,用户名和密码之间用空格间隔

1
2
user1 mima123
user2 mima123

创建服务用户

1
2
3
4
# 创建服务账号ssproxy
useradd -M -s /sbin/nologin ssproxy
#-M 不指定home
#-s 指定shell为nologin

修改暴露的端口

vim /etc/sysconfig/ss5

添加一行,-b后面的参数代表监听的ip地址和端口号,-u 后面的参数表示本地计算机以哪个账户连接

1
2
3

# Add startup option here
SS5_OPTS=" -u ssproxy -b 0.0.0.0:1080"

添加权限并设置开机自启动

1
2
3
4
5
6
7
8
# 添加可执行权限
chmod +x /etc/init.d/ss5

# 加入服务
chkconfig --add ss5

# 设置开机自启动并现在启动
systemctl enable --now ss5

开机无法自启动处理

1
2
3
4
5
6
# 查看服务详情
systemctl status ss5 -l

# 错误提示
Can’t create pid file /var/run/ss5/ss5.pid
Can’t unlink pid file /var/run/ss5/ss5.pid

由于每次重启后/var/run/ss5/文件夹都会被删除,所以需要修改/etc/init.d/ss5

start段加上一句 mkdir /var/run/ss5/,

stop段的rm -f /var/run/ss5/ss5.pid改为rm -rf /var/run/ss5/

image-20220423222235864

查看本地端口监听状态

1
ss -tunlp|grep 1080

第五章-k8s调度-pod调度控制篇

1. 创建一个pod,分配到指定标签node上

  • pod名: web
  • 镜像: nginx
  • node标签: disk=ssd

答案

1
2
# 给node打标签
kubectl label node n2 disk=ssd

kubectl run web --image=nginx -oyaml --dry-run >1.yaml创建yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
labels:
run: web
name: web
spec:
containers:
- image: nginx
name: web
imagePullPolicy: IfNotPresent
nodeSelector:
disk: ssd

kubectl apply -f 1.yaml创建pod

1
2
3
4
# 查看pod运行是否运行在n2节点
[m1 root ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web 1/1 Running 0 2m41s 100.104.217.1 n2 <none> <none>

2.确保每个节点上运行一个pod

  • pod名称: nginx
  • 镜像: nginx

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cache
spec:
selector:
matchLabels:
app: store
# 副本数3
replicas: 3
template:
metadata:
labels:
app: store
spec:
affinity:
# pod反亲和
podAntiAffinity:
# 硬需求/硬策略
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
# 禁止在同一node上部署多个标签为app=strore的副本
- key: app
operator: In
values:
- store
# 用主机名来作为拓扑域
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine

3.查看集群中状态为ready的node数量,并将结果写到指定文件

答案:

1
2
3
4
5
6
7
8
9
# 查看nodes状态()
[m1 root ~]# kubectl describe nodes|grep -i taint
Taints: <none>
Taints: <none>
Taints: <none>
Taints: <none>

# 写入结果
echo 4 >/nodes_num.txt

第四章:K8s管理应用生命周期-Deployment篇

1.创建一个deployment副本数为3,然后滚动更新镜像版本,并记录这个更新记录,最后再回滚到上一个版本

  • 名称: nginx
  • 镜像版本: 1.16
  • 更新镜像版本: 1.17

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 创建deploy,镜像nginx1.6,副本数3
kubectl create deployment nginx --image=nginx:1.16 --replicas=3

# 更新镜像版本到1.17,并对本次升级加上变化注解--记录这次更新
kubectl set image deployment/nginx nginx=nginx:1.17 --record

# 查看镜像是否为1.17
[master root ~]# kubectl describe deployment/nginx|grep -i image
kubernetes.io/change-cause: kubectl set image deployment/nginx nginx=nginx:1.17 --record=true
Image: nginx:1.17

# 查看rs
[master root ~]# kubectl get rs -owide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
nginx-6d4cf56db6 0 0 0 11m nginx nginx:1.16 app=nginx,pod-template-hash=6d4cf56db6
nginx-db749865c 3 3 3 4m30s nginx nginx:1.17 app=nginx,pod-template-hash=db749865c

# 查看deployment历史版本
[master root ~]# kubectl rollout history deployment
deployment.apps/nginx
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/nginx nginx=nginx:1.17 --record=true

# 回滚到上一个版本,监视deployment的滚动升级状态直到完成
[master root ~]# kubectl rollout undo deployment nginx && kubectl rollout status -w deployment nginx
deployment.apps/nginx rolled back
Waiting for deployment "nginx" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx" rollout to finish: 1 old replicas are pending termination...
deployment "nginx" successfully rolled out

# 查看deploy/nginx的镜像版本
[master root ~]# kubectl describe deployments.apps nginx|grep -i image
Image: nginx:1.16

2. 给deploy/web扩容副本数为3

答案

1
2
3
4
5
6
7
8
9
10
11
12
# 创建deploy/web
kubectl create deployment web --image=nginx

# 扩容副本数为3
kubectl scale deployment web --replicas=3

# 查看有几个pod
[master root ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
web-96d5df5c8-c6xcs 1/1 Running 0 2m42s
web-96d5df5c8-kslrm 1/1 Running 0 109s
web-96d5df5c8-xhv5n 1/1 Running 0 109s

3.把deploy输出为json文件,再删除创建的deploy

答案

1
2
3
4
5
6
7
8
9
10
# 把deploy/web输出为json文件
[master root ~]# kubectl get deployments.apps web -ojson> dep.json

# 根据json删除这个deploy
[master root ~]# kubectl delete -f dep.json
deployment.apps "web" deleted

# 查看这个dep还在不在
[master root ~]# kubectl get deployments.apps
No resources found in aliang-cka namespace.

4.生成一个deploy的yaml文件保存到/opt/deploy.yaml

  • 名称:web
  • 标签: app_env_stage=dev

答案

1
2
# 生成yaml文件
kubectl create deployment web --image=nginx -oyaml --dry-run > /opt/deploy.yaml

修改后的yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
app_env_stage: dev
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
app_env_stage: dev
template:
metadata:
labels:
app: web
app_env_stage: dev
spec:
containers:
- image: nginx
name: nginx

第四章:K8s管理应用生命周期-Pod篇

1.创建一个4容器pod

容器列表:

  • nginx
  • redis
  • memcached
  • consul

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
labels:
run: test
name: test
spec:
containers:
- image: nginx
name: test
- image: redis
name: redis
- image: memcached
name: memcached
- image: consul
name: consul

apply这个yaml

1
2
3
4
5
6
kubectl apply -f pod.yaml 

# 查看pod状态
[master root ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test 4/4 Running 0 2m17s

2.在节点上配置kubelet托管启动一个pod

  • 节点: node1
  • pod名称: web
  • 镜像: nginx
1
2
3
4
5
6
7
8
# ssh登录到node1
ssh node1

# 查看配置文件中的静态pod路径staticPodPath: /etc/kubernetes/manifests
cat /var/lib/kubelet/config.yaml

# 在staticPodPath中创建static-web.yaml
touch /etc/kubernetes/manifests/static-web.yaml

static-web.yaml文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
# 静态pod的名称
name: static-web
labels:
# 标签
role: myrole
spec:
containers:
# 容器名
- name: web
# 镜像名
image: nginx

查看静态pod

1
2
[master root ~]# kubectl get po|grep -i static-web
static-web-node 1/1 Running 0 6m10s

3.检查容器中文件是否创建,如果没有被检测到pod重启–探针

  • 文件路径: /tmp/test.sock

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
labels:
run: test
name: test
spec:
containers:
- image: nginx
name: test
args:
- /bin/bash
- -c
- touch /tmp/test.sock; sleep 600;
livenessProbe:
exec:
command:
- cat
- /tmp/test.sock
initialDelaySeconds: 0
periodSeconds: 1

第三章:K8s监控与日志

1.查看pod日志,并将日志中Eoor的行记录到指定文件

  • pod名称: web
  • 文件: /opt/web

答案:

1
kubectl logs web-96d5df5c8-pj8cg |grep -i error > /opt/web

2.查看指定标签使用cpu最高的pod,并记录到指定文件

  • 标签: app=web
  • 文件: /opt/cpu

答案

先部署metric-server服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 下载metric-server服务
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 重命名yaml文件
mv components.yaml metric-server.yaml

# 修改yaml文件,在容器参数中添加忽略证书
## 添加忽略证书
- --kubelet-insecure-tls

# apply这个yaml
kubectl apply -f metric-server.yaml

# 验证是否注册到apiservers,结果必须为True
kubectl get apiservices.apiregistration.k8s.io |grep metrics

# 查看所有namespace下的pod的资源使用率,并按照cpu排序
[master root ~/k8s-yaml]# kubectl top pod -l app=web --sort-by="cpu" -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
aliang-cka web-96d5df5c8-pj8cg 0m 3Mi

# 将结果写入到文件
[master root ~/k8s-yaml]# kubectl top pod -l app=web --sort-by="cpu" -A > /opt/cpu

第六章:K8s网络-Service与Ingress篇

1.给一个pod创建service,并可以通过ClusterIP/NodePort访问

  • 名称: web-service
  • pod名称: web
  • 容器端口: 80

答:

1
2
3
4
# 查看pod的标签
kubectl get po web -owide --showlable

# 创建service,选择pod的标签

2.任意名称创建deployment和service,使用busybox容器nslookup解析service

答:

1
2
3
4
5
6
7
8
9
```



## 3.列出命名空间下,某个service关联的所有pod,并将pod名称写到/opt/pod.txt中(使用标签筛选)

### 答:

```bash

4.使用ingress将美女示例应用暴露到外部访问

  • 镜像: lizhenliang/java-demo

答:

1

第一二章K8s核心概念和集群搭建

1. 搭建一个k8s集群

1
2
3
4
[master root ~]# kubectl get no -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready control-plane,master 13d v1.22.7 192.168.123.200 <none> Rocky Linux 8.5 (Green Obsidian) 5.4.180-1.el8.elrepo.x86_64 docker://20.10.12
node Ready <none> 13d v1.22.7 192.168.123.220 <none> Rocky Linux 8.5 (Green Obsidian) 5.4.180-1.el8.elrepo.x86_64 docker://20.10.12

2.新建一个命名空间,创建一个deployment并暴露Service

  • 命名空间: aliang-cka
  • 名称: web
  • 镜像: nginx

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 新建一个命名空间
kubectl create namespace aliang-cka

# 使用kubens切换到aliang-cka这个命名空间
kubens aliang-cka

# 新建deployment
kubectl create deployment web --image=nginx

# 查看web这个deployment创建成功没有
[master root ~]# kubectl get deployments.apps web
NAME READY UP-TO-DATE AVAILABLE AGE
web 1/1 1 1 7m23s
[master root ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-96d5df5c8-pj8cg 1/1 Running 0 7m30s

# 暴露一个服务
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort

# 访问验证
[master root ~]# curl 10.83.28.128|grep title
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 615 100 615 0 0 300k 0 --:--:-- --:--:-- --:--:-- 300k
<title>Welcome to nginx!</title>

3.列出命名空间下指定标签pod

命名空间: kube-system

标签: k8s-app=kube-dns

答案

1
2
3
4
5
6
7
8
9
10
11
# 查询pod,-n=kube-system,-l=k8s-app=kube-dns
[master root ~]# kubectl get po -n kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-78fcd69978-8kjtl 1/1 Running 1 (10d ago) 12d
coredns-78fcd69978-jkxkd 1/1 Running 1 (10d ago) 12d

# 查看完整标签
[master root ~]# kubectl get po -n kube-system -l k8s-app=kube-dns --show-labels
NAME READY STATUS RESTARTS AGE LABELS
coredns-78fcd69978-8kjtl 1/1 Running 1 (10d ago) 12d k8s-app=kube-dns,pod-template-hash=78fcd69978
coredns-78fcd69978-jkxkd 1/1 Running 1 (10d ago) 12d k8s-app=kube-dns,pod-template-hash=78fcd69978

遇到的k8s面试题

硬驱逐和软驱逐

答:

参考: 硬驱逐条件和软驱逐条件

kubernetes-pod驱逐机制

1、硬驱逐:没有宽限期,硬驱逐条件时, kubelet 会立即杀死 pod
2、软驱逐:有宽限期, 在超过宽限期之前,kubelet 不会驱逐 Pod。

image-20220311125648437

deployment如何像daemonset一样每个node运行一个

答:

pod反亲和可以实现.

svc和endpoint的区别

答:

svc工作原理:

svc是通过标签选择pod.

endpoint工作原理:

endpoint是监听svc选择的pod的ip.通过kube-proxy来轮询访问pod.

ansible中include 和 import的区别

参考: ansible中include 和 import的区别

答:

ansible 目前有 import_tasksinclude_tasksimport_playbookinclude_playbookimport_roleinclude_role

importinclude 区别相近:
区别一

  • import_tasks(Static)方法会在playbooks解析阶段将父task变量子task变量全部读取并加载
  • include_tasks(Dynamic)方法则是在执行play之前才会加载自己变量

**区别二 **

  • include_tasks方法调用的文件名称可以加变量

  • import_tasks方法调用的文件名称不可以有变量

具体参考:https://www.cnblogs.com/mauricewei/p/10054041.html

也正是因为「include_task」是动态导入,当我们给「include_role」导入的role打tag时,实际并不会执行该role的task。

RUN,CMD,ENTRYPOINT的区别

参考 RUN,CMD,ENTRYPOINT的区别

  • RUN命令执行命令并创建新的镜像层,通常用于安装软件包
  • CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
  • ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)