文章目录

  • 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)

参考博客:


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-deploymentpod 不能被调度至一个已经存在有 k8s-app=rsq 标签的 pod 所在的 node 节点上。

12 K8s statefulset 使一个控制器中不同pod挂载不同目录(不用pv/pvc存储)

要想实现这种方法,可以才contianers的二级字段中使用subPathExpr字段,这个字段可以引用变量

linux K8s docker 生产 k8s操作docker_kubernetes

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