什么是 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

kubectl get pod  -A

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

kubectl get pod  -n ns-test

查看节点状态

kubectl get nodes

查看指定 pod 的日志

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

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

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

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

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

关于 k8s 资源类型和缩写

资源类型 缩写 描述
clusters     
componentstatuses cs  
configmaps cm   
daemonsets ds  
deployments deploy  
endpoints ep  
event ev  
horizontalpodautoscalers hpa  
ingresses ing  
jobs    
limitranges limits  
namespaces ns  
networkpolicies    
nodes no  
statefulsets    
persistentvolumeclaims pvc  
persistentvolumes pv  
pods po  
podsecuritypolicies psp  
podtemplates    
replicasets rs  
replicationcontrollers rc  
resourcequotas quota  
cronjob    
secrets    
serviceaccount sa  
services svc  
storageclasses    
thirdpartyresources    
     

遇到的问题

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

配置

  • master 2H4G 50G 192.168.3.48
  • node1 4H4G 30G 192.168.3.47
    部署完成之后检查节点状态
[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(防止网络环路)由于是桥接,容易产生网络环路导致上不了网

[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
附上开启的命令

brctl 网卡名 stp on

问题解决

  • alipay_img
  • wechat_img
此作者没有提供个人介绍
最后更新于 2024-11-17