什么是K8S

近年来云原生,云计算飞速发展
虽然 Docker 已经很强大了,但是在实际使用上还是有诸多不便,比如集群管理、资源调度、文件管理等等。那么在这样一个百花齐放的容器时代涌现出了很多解决方案,比如 Mesos、Swarm、Kubernetes 等等,其中谷歌开源的 Kubernetes 是作为老大哥的存在。
k8s
kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。

Kubernetes 解决的核心问题

服务发现和负载均衡

Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

存储编排

Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚
您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。

自动二进制打包

Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

密钥与配置管理

Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes 的出现不仅主宰了容器编排的市场,更改变了过去的运维方式,不仅将开发与运维之间边界变得更加模糊,而且让 DevOps 这一角色变得更加清晰,每一个软件工程师都可以通过 Kubernetes 来定义服务之间的拓扑关系、线上的节点个数、资源使用量并且能够快速实现水平扩容、蓝绿部署等在过去复杂的运维操作。

这里我们用一张图来描述k8s的结构
k8s结构

组件说明

主要介绍关于 K8s 的一些基本概念

主要由以下几个核心组件组成:

  • apiserver
    所有服务访问的唯一入口,提供认证、授权、访问控制、API 注册和发现等机制

  • controller manager
    负责维护集群的状态,比如副本期望数量、故障检测、自动扩展、滚动更新等

  • scheduler
    负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上

  • etcd
    键值对数据库,保存了整个集群的状态

  • kubelet
    负责维护容器的生命周期,同时也负责 Volume 和网络的管理

  • kube-proxy
    负责为 Service 提供 cluster 内部的服务发现和负载均衡

  • Container runtime
    负责镜像管理以及 Pod 和容器的真正运行
    除了核心组件,还有一些推荐的插件:

  • CoreDNS
    可以为集群中的 SVC 创建一个域名 IP 的对应关系解析的 DNS 服务

  • Dashboard
    给 K8s 集群提供了一个 B/S 架构的访问入口
    Ingress Controller
    官方只能够实现四层的网络代理,而 Ingress 可以实现七层的代理

  • Prometheus
    给 K8s 集群提供资源监控的能力

  • Federation
    提供一个可以跨集群中心多 K8s 的统一管理功能,提供跨可用区的集群
    以上内容参考链接: https://www.escapelife.site/posts/2

K8S镜像加速

编辑 /etc/containerd/config.toml 这个文件
自行查询如何配置

概念

什么是pod ?

pod其实就是容器的一个集合,pod里面存放容器
pia18Fe.md.png

什么是Service ?

service是一个抽象层,写后端的小伙伴应该知道类似于后端语言中的封装一些数据操作的Service层
当然K8S也是一样,pod删除之后,pod的IP会发送变化,不利于pod和pod之间的通信,有了Service之后容器访问service无需担心ip变化
pia1tSA.md.png

什么是命名空间(Namespace) ?

命名空间是资源隔离机制,可以将集群中的资源划分为相互隔离的组,后面要用kubectl查看service,pod等等都需要加上命名空间才能查询到,否则就会找不到资源 使用 -n Namespace 指定命名空间
pia1LOx.md.png

什么是deployment ?

这没什么好讲的,但是需要注意,pod的自愈功能,会让你删除pod后自动补上pod,你需要删除deployment才能彻底删除pod
pia3FXt.md.png

命令

查看所有pod

1
kubectl get pod  -A

查看指定命名空间下的pod,如ns-test

1
kubectl get pod  -n ns-test

查看节点状态

1
kubectl get nodes

查看指定pod的日志

1
kubectl logs nginx-deployment-6dddcd576d-9nrp6 -n ns-test

查看指定pod的详细信息 (输出重要信息在最后)

1
kubectl describe po  nginx-deployment-6dddcd576d-9nrp6 -n ns-test

重建指定pod (calico-node-px4qb)

1
kubectl delete pod calico-node-px4qb -n kube-system --grace-period=0 --force

关于k8s资源类型和缩写

资源类型缩写描述
clusters   
componentstatusescs 
configmapscm  
daemonsetsds 
deploymentsdeploy 
endpointsep 
eventev 
horizontalpodautoscalershpa 
ingressesing 
jobs  
limitrangeslimits 
namespacesns 
networkpolicies  
nodesno 
statefulsets  
persistentvolumeclaimspvc 
persistentvolumespv 
podspo 
podsecuritypoliciespsp 
podtemplates  
replicasetsrs 
replicationcontrollersrc 
resourcequotasquota 
cronjob  
secrets  
serviceaccountsa 
servicessvc 
storageclasses  
thirdpartyresources  
   

遇到的问题

我是基于kvm部署了两台CentOS虚拟机安装的K8S
采用一主一节点 (master和Worker)

配置

  • master 2H4G 50G 192.168.3.48
  • node1 4H4G 30G 192.168.3.47
    部署完成之后检查节点状态
    1
    2
    3
    4
    [root@master ~]# kubectl get nodes 
    NAME STATUS ROLES AGE VERSION
    master Ready control-plane,master 2d6h v1.22.12
    node1 Ready worker 2d6h v1.22.12
    都是Ready就绪状态代表成功了

等到我第二天打开机器之后,两台机器机器启动之后
我登录 master 部署个pod发现突然发现pod状态错误了(ImagePullBackOff )
这是一个拉镜像超时的错误,我又去docker里试了下 docker pull nginx:latest
过了一会显示超时了,初步判断是网络问题,master无法访问外网

解决问题

在宿主机里桥接网卡开启STP
我的master和node1都是桥接我宿主机自定义的br0网卡的,这张是桥接网卡,桥接了eth0

用brctl show命令查看了所有桥接的网卡然后都开启STP(防止网络环路)由于是桥接,容易产生网络环路导致上不了网

1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~]# brctl show
bridge name bridge id STP enabled interfaces
br-231539c7c5b9 8000.02427b31635a yes
br-a2b80e1c104e 8000.024222972d25 yes vethbcbc7ee
br-c61398b3214a 8000.0242443e77f7 yes veth6181231
veth863d6fc
vethf712da7
br0 8000.0ae0afd60175 yes enp6s0
vnet0
vnet1
docker0 8000.02425a418436 yes
virbr0 8000.525400ac2030 yes virbr0-nic

可以看到所有桥接网卡都开启了STP
附上开启的命令

1
brctl 网卡名 stp on

问题解决