kubernetes&&Docker整理

本文详细介绍了Kubernetes(K8S)集群的架构、安装、Pod和Controller的管理,包括Flannel和Calico网络的配置,以及Docker的基本操作和常见问题定位。还涵盖了kubectl常用指令和网络管理工具的使用方法。
摘要由CSDN通过智能技术生成

一、介绍
二、K8S集群安装
三、创建Pod
四、k8s-RC-Service-deploy
五、DNS_探针
六、NS&&Dashboard
七、监控
八、存储
Helm–K8s

容器以及LXC
一、docker介绍
二、手动制作镜像
三、自动制作镜像
四、分成_仓库

Master:集群的控制平面,负责集群的决策 ,安装以下软件:
      ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
      Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
      ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
      Etcd:负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境,安装以下软件:
      Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
      KubeProxy : 负责提供集群内部的服务发现和负载均衡
      Docker : 负责节点上容器的各种操作

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器(Deployment),通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
在这里插入图片描述
Pod网络
Service网络

K8S常用指令

kubectl version #version查看kubectl版本信息
kubectl exec -it frontend-65c58c957d-bzbg2 /bin/sh ##进入pod内部

kubectl get pv --all-namespaces ##查看系统存储卷pv信息
kubectl get pvc --all-namespaces ##查看系统存储卷pvc信息
kubectl get rs --all-namespaces ##获得ReplicaSet资源
kubectl get deployments --all-namespaces ##查看deployments资源
kubectl get DaemonSet --all-namespaces ##获取DaemonSet资源信息
kubectl get Cronjob --all-namespaces ##获取定时资源信息
kubectl get Statefulset --all-namespaces ##获取有状态pod信息
kubectl get service --all-namespaces ##查看系统service资源
kubectl get secret --all-namespaces ##获取secret信息
kubectl get configmap --all-namespaces ##获得configmap信息
kubectl get sa #查看管理员
kubectl get pv --sort-by=.metadata.name #列出环境内所有的pv 并以 name字段排序

NameSpace
kubectl create ns dev-test #创建namespace
kubectl delete ns dev-test #删除namespace
[root@master ~]# kubectl get namespace/kubectl get ns #列出所有命名空间
kubectl describe ns ns名称 #查看ns详情
kubectl get ns NS1 #查看指定namespace(命名空间)
kubectl get ns NS1 -o json #查看参数(指定输出格式json、yaml);
#命令:kubectl get ns ns名称 -o 格式参数
#kubernetes支持的格式有很多,比较常见的是wide、json、yaml

kubectl get pods -n kube-system #查看 网络插件类型Flannel or Calico

apiVersion: v1
kind: Namespace  ##pod类型
metadata:
  name: dev

[root@master demo]# kubectl create -f dev_namespace.yaml
namespace/dev created
[root@master demo]# kubectl get -f dev_namespace.yaml ##查询
NAME   STATUS   AGE
dev    Active   5s
[root@master demo]# kubectl delete -f dev_namespace.yaml #删除

Pod
kubectl create -f dev-pod.yaml ##通过配置文件创建pod
kubectl delete -f dev-pod.yaml # #删除pod
kubectl apply test.yaml #如果不存在则创建,若存在,则更新
kubectl creat test.yaml #如果不存在则创建,若存在,则报错

kubectl get pod -A #获取所有名称空间的pod

kubectl get pod #获取pod信息,默认是default名称空间
kubectl get pod -n kube-system #查看系统pod
kubectl get pods -n dev #查看pod(namespace是dev的)
kubectl get pod pod_name #查看某个pod
kubectl describe pod nginx-5ff7956ff6-fg2db -n dev #查看pod详细信息(namespace是dev的)
kubectl get pod pod_name -o yaml #查看某个pod,以yaml格式展示结果
kubectl get pods -o yaml
kubectl get pods -o json
kubectl get pods -n dev -o wide ##查看pod所在IP(集群内IP)(namespace是dev的)
kubectl get pod -o wide #获取pod信息,默认是default名称空间,并查看附加信息【如:pod的IP及在哪个节点运行】

kubectl get pod -A --show-labels #查看pod的标签信息

kubectl get pods -L app #显示pod的app标签的这个值
kubectl get pods --show-labels ###示所有pods的标签
Node
kubectl get nodes -o wide #获取节点和服务版本信息,并查看附加信息
kubectl get nodes #查看所有node节点
kubectl get ing -A #查看在运行中服务
kubectl describe node node1 ##查看节点的详细信息
kubectl delete pod podName #删除指定的pod (k8s 自动重新部署)
kubectl delete pod -n test podName #删除指定名称空间的指定pod

控制器(deployment)

# 命令格式: kubectl run deployment名称  [参数] 
# --image  指定pod的镜像
# --port   指定端口
# --replicas  指定创建pod数量
# --namespace  指定namespace
#创建pod(3个)
kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n dev

kubectl get nginx -n dev #查看deployment的信息
kubectl get nginx -n dev -o wide #查看deployment的信息(以wide方式)
kubectl describe nginx -n dev #查看deployment的详细信息
kubectl delete deploy nginx -n dev #删除

Service

kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev #创建Service
kubectl get svc svc-nginx1 -n dev -o wide #查看(svc),指定命名空间dev
kubectl get service -o wide #获取service列表
kubectl get svc |grep pod #查看pod端口
kubectl get svc -A # 查看所有名称空间的service信息

Other
kubectl logs --tail=200 -f pod-name-xxxx #查看日志
kubectl top node #查看node的使用情况
kubectl top pod -l -ncpu-loader --sort-by=cpu -A #找CPU消耗最高的Pod
kubectl get ing -A #查看在运行中服务
kubectl -n kube-system exec kube-flannel-ds-id cat /etc/kube-flannel/net-conf.json ##查看flannel用的什么网络实现

######获取容器IP
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-ID> ###查看某个容器ip
docker inspect <container id> | grep IPAddress ##查看某个容器ip
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq) ##获取所有容器名称及其IP地址,方式一
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) ##获取所有容器名称及其IP地址,方式二

Flannel网络

所有node节点配置flannel网络插件: yum install flannel -y 会生成一个flannel0网卡
Flannel网络
Flannel的设计目的是使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

Flannel实质上是一种“覆盖网络(overlaynetwork)”,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发;默认使用Vxlan技术作为Backend。
VXLAN,即Virtual Extensible LAN,虚拟扩展局域网。
VXLAN可以完全在内核态实现封装和解封装工作,从而通过“隧道”机制,构建出覆盖网络(Overlay Network)

  • 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。

  • etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。
    在这里插入图片描述
    Container:即运行的容器–包含各自的IP;
    Cni0:网桥设备,没创建一个POD都会创建一对veth pair。其中一端是POD中的eth0,另一端是Cni0网桥中的端口(即网卡)
    Flanel.1:TUN设备(虚拟网卡),用来进行VXLAN报文的处理(封装和解封)。不同node之间的pod数居流都是从高overlay设备以隧道模式发送到对端的。
    Flanneld:flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。同时Flanneld监听K8s集群数据库,为flannel1设备提供封装数据时必要的mac、ip等网络数据信息。

Calico网络

Calico网络
Calico 不使用 vlan 或 vxlan 技术;Calico 不使用隧道或 NAT 来实现转发,而是巧妙的把所有二三层流量转换成三层流量,并通过 host 上路由配置完成跨 Host 转发。
在这里插入图片描述
1.Felix:运行在每一台 Host 的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等。

2.etcd:分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用;

3.BGP Client(BIRD):Calico 为每一台 Host 部署一个 BGP Client,使用 BIRD 实现,BIRD 是一个单独的持续发展的项目,实现了众多动态路由协议比如 BGP、OSPF、RIP 等。在 Calico 的角色是监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播告诉剩余 Host 节点,从而实现网络互通。

4.BGP Route Reflector:在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数。

登录Pod中,使用ethtool -S eth0,查看veth pair另一端的设备号,pod网卡另一端的设备好号是18,在node上查看编号为18的网络设备,可以发现该网络设备就是caliadce112d250
在这里插入图片描述在这里插入图片描述在这里插入图片描述

BGP:
在安装calico网络时,默认安装是IPIP网络。calico.yaml文件中,将CALICO_IPV4POOL_IPIP的值修改成 “off”,就能够替换成BGP网络.
在这里插入图片描述BGP网络相比较IPIP网络,最大的不同之处就是没有了隧道设备 tunl0。 前面介绍过IPIP网络pod之间的流量发送tunl0,然后tunl0发送对端设备。BGP网络中,pod之间的流量直接从网卡发送目的地,减少了tunl0这个环节。
在这里插入图片描述

pod1 ping pod2: pod1中的
在这里插入图片描述
master节点上路由信息。根据匹配到的 192.168.190.192 路由,该路由的意思是:去往网段192.168.190.192/26 的数据包,发送网段172.171.5.96。而5.96就是node节点。所以,该数据包直接发送了5.96节点通过 ens160网卡。

node节点上的路由信息。根据匹配到的192.168.190.192的路由,数据将发送给 cali6fcd7d1702e设备,为pod2的veth pair 的一端。数据就直接发送给pod2的网卡。
在这里插入图片描述

常见问题定位

排查问题思路:
kubectl get nodes -o wide ##kubel查看pod状态
kubectl describe pod nginx-5ff7956ff6-fg2db -n dev #查看pod详细信息(namespace是dev的)
kubectl describe pod nginx-5ff7956ff6-fg2db ##查看pod详细信息
kubectl logs --tail=200 -f pod-name-xxxx #查看pod日志
kubectl logs -f frontend-65c58c957d-bzbg2 #实时滚动查看一个正在运行的日志
journalctl -f -u kubelet #查看K8S日志
kubectl exec -it frontend-65c58c957d-bzbg2 /bin/sh 进入到Pod内部并运行命令来对应用程序进行故障排除(输入exit即可退出)

Docker常用指令

服务相关命令
systemctl start docker ##启动docker
systemctl stop docker ##关闭docker
systemctl restart docker ##重启docker
systemctl enable docker #设置开机自启动
systemctl status docker ##查看docker状态

docker --help #docker 帮助命令
docker pull --help #忘记参数怎么使用

docker version #查看docker 版本号信息
docker info #显示Docker系统信息,包括镜像和容器数

镜像相关命令
sudo docker images #查看镜像列表

  • -a:列出所有镜像,包括中间层镜像。
  • -q:只显示镜像ID。
  • –no-trunc:显示完整的镜像ID。

docker images -q --no-trunc ##列出所有镜像的完整ID

sudo docker search 镜像名 ##镜像搜索,docker search ubuntu(搜索 ubuntu 基础镜像)
拉取镜像: 不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本
docker pull 镜像名 # 拉取最新镜像
docker pull 镜像名:tag ##指定版本docker pull mysql 5.7.30
docker pull --all-tags nginx #拉取官方nginx镜像的所有标签

sudo docker rmi -f 镜像名/镜像ID # 删除镜像
docker rmi -f $(docker images -aq) #删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID

docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字 ##保存镜像(docker save tomcat -o /myimg.tar)
docker load -i 镜像保存文件位置 ##保存的镜像,在其他server可以直接加载

容器相关命令
运行容器

# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行)     
#--name 给要运行的容器起的名字  /bin/bash  交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash 
eg:
#1. 拉取redis 镜像
docker pull redis:5.0.5
#2.命令启动
docker run -it -d --name redis001 redis:5.0.5 /bin/bash

docker rename 容器ID/容器名 新容器名 ##重命名

docker inspect ##查看Docker对象的详细信息,包括容器、镜像、网络、卷和服务等。使用该命令可以获取对象的各种属性和配置信息,例如IP地址、端口映射、环境变量、挂载点等
-f:指定输出格式;
-s:显示对象的大小信息;
--type:指定要查看的对象类型;
--format:指定输出格式
docker inspect my_container 
docker inspect -f '{{.NetworkSettings.IPAddress}}' my_container #输出my_container容器的IP地址

docker exec -it 容器名/容器ID /bin/bash #进入容器
-i:以交互模式运行容器。
-t:为容器分配一个伪终端。
-d:在后台运行容器
docker exec -it redis001 /bin/bash ## 进redis001容器

sudo docker ps #列出当前正在运行的所有容器
sudo docker ps -a # 查看所有容器 -----包含正在运行 和已停止的
docker ps -n 3 -q #列出最近创建的3个容器的ID
docker start 容器ID/容器名 #启动容器
docker stop 容器名/容器ID ##停止容器
docker restart 容器ID/容器名 #重启容器
docker rm -f 容器名/容器ID ###删除一个容器
docker rm -f $(docker ps -aq) ###删除全部容器

docker logs mycontainer ##查看mycontainer容器的日志
docker logs -f mycontainer ##实时查看mycontainer容器的日志
docker logs --tail 10 mycontainer ##查看mycontainer容器最后10行的日志

端口映射:

-p 宿主机端口:容器端口
##宿主机就是指起docker的服务器
##通过外部访问宿主机8888端口 即可访问到 docker 容器 6379 端口
docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash

-v 将容器内的指定文件夹挂载到宿主机对应位置
--name:为容器指定一个名称
#将主机的目录“/app”挂载到容器内部的“/usr/src/myapp”目录
docker run -d -p 8080:80 -v /app:/usr/src/myapp --name myapp nginx

docker ps -a | grep containee_id #查看容器名字;端口映射(宿主机port: 容器port)
sudo iptables -t nat -nvL | grep 202222 ##查看宿主机port对应的ip,也就是宿主机哪个网卡连接容器
``

sudo docker info | grep "Docker Root Dir" #查看docker工作目录
du -hs /var/lib/docker/ #查看docker磁盘占用总体情况
docker system df #查看Docker的磁盘使用具体情况
docker stats --all #查看所有容器的实时资源使用情况,包括CPU、内存、网络和磁盘等方面的数据
docker stats container1 container2 ##查看指定容器的实时资源使用情况
docker stats --format '{{json .}}' container1 #指定输出格式为JSON

###删除容器docker rm
docker rm
-f:强制删除正在运行的容器。
-v:删除容器关联的数据卷
docker rm -f my-container #强制删除正在运行的容器

###删除镜像docker rmi
-f, --force:强制删除镜像,即使有容器正在使用它
docker rmi myimage1 myimage2 myimage3 #删除多个镜像
docker rmi -f myimage

docker volume

docker volume create <volume-name>  ##创建卷
docker volume ls  ##列出所有数据卷
docker volume inspect <volume-name> #查看数据卷的详细信息
docker volume rm <volume-name> ##删除一个数据卷
docker volume prune #删除所有未被使用的数据卷
docker run -v <volume-name>:<container-path> <image-name> #将数据卷挂载到容器中
##例如docker run -v mydata:/data myimage
docker container rm -v <container-name> #将数据卷从容器中移除

docker network

docker network ls #列出所有Docker网络
docker network create my-network #创建名为my-network的桥接网络
docker network connect my-network my-container #将容器连接到指定的Docker网络
docker network disconnect my-network my-container #将容器从指定的Docker网络中断开连接
docker network inspect my-network 查看指定的Docker网络的详细信息
docker network rm my-network #删除指定的Docker网络

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值