什么是 K8S
近年来云原生,云计算飞速发展
虽然 Docker 已经很强大了,但是在实际使用上还是有诸多不便,比如集群管理、资源调度、文件管理等等。那么在这样一个百花齐放的容器时代涌现出了很多解决方案,比如 Mesos、Swarm、Kubernetes 等等,其中谷歌开源的 Kubernetes 是作为老大哥的存在。
kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。
Kubernetes 解决的核心问题
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
存储编排
Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚
您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
自动二进制打包
Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
密钥与配置管理
Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes 的出现不仅主宰了容器编排的市场,更改变了过去的运维方式,不仅将开发与运维之间边界变得更加模糊,而且让 DevOps 这一角色变得更加清晰,每一个软件工程师都可以通过 Kubernetes 来定义服务之间的拓扑关系、线上的节点个数、资源使用量并且能够快速实现水平扩容、蓝绿部署等在过去复杂的运维操作。
这里我们用一张图来描述 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 ?
什么是 Service ?
service 是一个抽象层,写后端的小伙伴应该知道类似于后端语言中的封装一些数据操作的 Service 层
当然 K8S 也是一样,pod 删除之后,pod 的 IP 会发送变化,不利于 pod 和 pod 之间的通信,有了 Service 之后容器访问 service 无需担心 ip 变化
什么是命名空间(Namespace) ?
命名空间是资源隔离机制,可以将集群中的资源划分为相互隔离的组,后面要用 kubectl 查看 service,pod 等等都需要加上命名空间才能查询到,否则就会找不到资源 使用 -n Namespace 指定命名空间
什么是 deployment ?
这没什么好讲的,但是需要注意,pod 的自愈功能,会让你删除 pod 后自动补上 pod,你需要删除 deployment 才能彻底删除 pod
命令
查看所有 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
问题解决
Comments NOTHING