K8s && Docker 相关操作指令
K8s statefulset 使一个控制器中不同pod挂载不同目录(不用pv/pvc存储)要想实现这种方法,可以才contianers的二级字段中使用subPathExpr字段,这个字段可以引用变量
文章目录
- 1 Docker镜像删除的多种方法
- 2 Docker常见问题
- 3 K8s节点驱逐
- 4 Centos7 修改Docker Root Dir
- 5 K8s 重新生成token并加入集群
- 6 K8s彻底删除calico网络
- 7 K8s彻底删除flannel网络
- 8 Docker 快速保存多个镜像
- 9 Docker Harbor 修改镜像存储路径与 Harbor 迁移
- 10 K8s 避免pod调度到指定node节点
- 11 K8s 调度一个控制器中多个pod分别至指定的node节点
- 12 K8s statefulset 使一个控制器中不同pod挂载不同目录(不用pv/pvc存储)
- 13 K8s 修改节点pod上限数量
- 14 Docker 创建network
- 15 查看一个Namespace下的所有资源
- 16 Docker通过overlay2目录查找容器
1 Docker镜像删除的多种方法
(1)停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)
(2)如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)
(3)查看当前有些什么images
docker images
(4)删除images,通过image的id来指定删除谁
docker rmi <image id>
(5)想要删除untagged images,也就是那些id为的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
(6)要删除全部image的话
docker rmi $(docker images -q)
参考博客:
http://www.cnblogs.com/q4486233/p/6482711.html
2 Docker常见问题
(1)停止所有正在运行的容器
docker kill $(docker container ls -q)
(2)批量清理已经停止的容器
docker container prune
(3)获取某个容器的 PID 信息
docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
(4)获取某个容器的 IP 地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>
(5)临时退出一个正在交互的容器的终端,而不终止它
先按Ctrl -p 后按 Ctrl -q # 如果按 Ctrl-c 往往会让容器内应用进程终止,进而会终止容器
(6)修改已经创建容器的端口映射
#(1)修改相对应容器的hostconfig.json(如果config.v2.json文件有也有修改)
vim /var/lib/docker/containers/[容器hash]/hostconfig.json
#(2)修改PortBindings参数配置,宿主机8001端口映射容器80端口示例:
“PortBindings”:{“80/tcp”:[{“HostIp”:””,”HostPort”:”8001″}]},”
#(3)重启docker
systemctl restart docker
#(4)启动相关容器
docker start <容器id>
(7)查看docker容器的挂载卷
docker inspect -f {{.Mounts}} <容器id>
(8)查看docker容器的IP地址
docker inspect -f {{.NetworkSettings.IPAddress}} <容器id>
3 K8s节点驱逐
如果你想从Kubernetes集群中删除节点,正确流程如下:
(1)获取节点列表
kubectl get node
(2)设置不可调度
kubectl cordon $node_name
(3)驱逐节点上的Pod
kubectl drain $node_name --ignore-daemonsets
(4)移除节点
该节点上已经没有任何资源了,可以直接移除节点:
kubectl delete node $node_name
这样,我们平滑移除了一个 k8s 节点。
4 Centos7 修改Docker Root Dir
# 1、查看当前Docker Root Dir
[root@node ~]# docker info
...
Docker Root Dir: /var/lib/docker
...
# 2、停止docker服务
systemctl stop docker
# 3、修改docker service文件,如下位置添加--graph=/mnt/docker 新的存储位置
[root@node ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --graph=/home/docker
# 4、将原目录下的文件拷贝至新目录下
cp -rf /var/lib/docker/* /home/docker/
# 5、重新加载配置并启动docker
systemctl daemon-reload
systemctl start docker
5 K8s 重新生成token并加入集群
# 1. 生成新token并查看
kubeadm token create
kubeadm token list
# 2. 获取ca证书sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 3. 加入集群
kubeadm join 192.168.1.1:6443 --token ayhdt4.u83rp3re562iwvwu --discovery-token-ca-cert-hash sha256:1ff60a352c181ead103cb3f76fc328115bdb7e5c705d2348e8900df0ecec297e --ignore-preflight-errors=Swap
6 K8s彻底删除calico网络
# 1. 删除K8s对象
kubectl delete -f calico.yaml
# 2. 检查所有节点上的网络,看看是否存在Tunl0
ip addr show
# 3. 如果有Tunl0,将其删除
modprobe -r ipip
# 4. 删除calico相关其它网卡
ip link delete cali486a4365347
ip link delete cali4d0daae17d9
ip link delete vxlan.calico
ip link delete kube-ipvs0
# 5. 移除Calico配置文件
ls /etc/cni/net.d/
# 6看看是否存在Calico相关的文件和目录
# 如:10-calico.conflist, calico-kubeconfig, calico-tls,如果有将其移除。
7 K8s彻底删除flannel网络
# 1. 在master节点删除flannel
kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 2. node节点清理flannel网络相关文件
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
注:执行完上面的操作,重启kubelet
8 Docker 快速保存多个镜像
docker save -o k8s.tar.gz `docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}'`
9 Docker Harbor 修改镜像存储路径与 Harbor 迁移
# 1、关闭 Harbor
docker-compose down -v
# 2、修改 Harbor 配置文件 harbor.yml
# The default data volume
data_volume: /datadisk/docker_images
# 3、运行prepare程序
./prepare
# 4、启动 Harbor
docker-compose up -d
# 5、拷贝原有镜像文件至新目录下
cp -a /data/* /datadisk/docker_images/
10 K8s 避免pod调度到指定node节点
比如一个DaemonSet,若不想让其调度至Master节点,但是Master节点又配置的可调度,这个时候可以给Master节点打个额外的污点(taint
),然后在DaemonSet的资源清单中定义tolerations
即可。
# 1. 给Master节点打污点:
kubectl taint node master schedule=disabled:NoSchedule
# 2. DaemonSet资源清单定义
tolerations:
- key: schedule
operator: Equal
effect: NoSchedule
11 K8s 调度一个控制器中多个pod分别至指定的node节点
这里使用的pod非亲和性来实现的,可以使得pod副本调度至不同的节点上,给出一个简单示例:
kind: Deployment
apiVersion: apps/v1
metadata:
name: rsq-deployment
labels:
k8s-app: rsq
namespace: scr
spec:
replicas: 5
selector:
matchLabels:
k8s-app: rsq
template:
metadata:
labels:
k8s-app: rsq
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- rsq
topologyKey: "kubernetes.io/hostname"
这里用到 affinity
字段中的 podAntiAffinity
,也就是pod反亲和性。
即一个名为 rsq-deployment
的 pod
不能被调度至一个已经存在有 k8s-app=rsq
标签的 pod
所在的 node
节点上。
12 K8s statefulset 使一个控制器中不同pod挂载不同目录(不用pv/pvc存储)
要想实现这种方法,可以才contianers
的二级字段中使用subPathExpr
字段,这个字段可以引用变量
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
securityContext:
runAsUser: 0
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
ports:
- name: mysql
containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
subPathExpr: $(MY_POD_NAME)
volumes:
- name: data
hostPath:
path: /datadisk/k8s-volumes/mysql/data/
13 K8s 修改节点pod上限数量
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false --max-pods=300"
systemctl restart kubelet
14 Docker 创建network
docker network create -d l2bridge --subnet=10.244.2.0/24 --gateway=10.244.2.1 cbr0
15 查看一个Namespace下的所有资源
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n xxx
16 Docker通过overlay2目录查找容器
# 1 首先进入到 /var/lib/docker/overlay2 目录下,查看谁占用的较多
cd /var/lib/docker/overlay2
du -s ./* | sort -rn | more
# 2 找到目录名之后就可以
root@train-3090x4-amd-1-251:~# docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep d3afcef20b85b7f0d1df523faa7b8d9484cae9271f71dde5929139615c5026d6
120031, e130286e6f048fb6754096ce4218417b4fde25ddd50d9e35be80eddaf97f49d2, /felix, /var/lib/docker/overlay2/d3afcef20b85b7f0d1df523faa7b8d9484cae9271f71dde5929139615c5026d6/work
第二个 e1302开头的就是容器id
更多推荐
所有评论(0)