你不知道的 K8s 组件优缺点,惊了个呆。。

Kubernetes 作为事实上的容器编排标准,已在企业和开源社区得到广泛的认同和使用。它不仅提供了高度可扩展、自管理的容器编排平台,具备强大的自动化管理能力,还拥有丰富的生态系统和第三方插件,可以实现各种定制化和扩展化需求。
除了普及 K8s 基本知识,例如,Pod 作为最小可部署单元,拥有独立 IP、主机名和进程;K8s 通过众多组件来管理和控制 Pod 的部署、更新、伸缩与网络等,还有哪些不被经常介绍,但需要了解的特性?本文试着来盘一盘。

01 Label

K8s 拥有众多组件,例如 Deployment 可以实现灰度发布、滚动升级;StatefulSet 可以保证有状态应用的有序部署和扩容;Service 可以实现负载均衡、服务发现等网络功能;Ingress 可以对外暴露应用服务,并提供 URL 路由、TLS 加密等服务;PV/PVC 可以实现数据持久化、共享等需求。
虽然,K8s 对于容器化应用的运维提供了完整的工具链,但当你遇到一大堆 Pod、节点等资源无从下手时,这里推荐你第一个功能是 Label,你既可以通过 app 来区分 Pod,也可以通过版本发布方式来区分 Pod,更先进更科学的 Label 方法,也欢迎大厂来提供哦。

PS:如果您的 Pod 长这样,那需要打标签了。

如何打 Label 

K8s 不仅可以给资源打标签,还可以通过标签选择器筛选出你想要的对象。

  • 列出标签

kubectl get po --show-labels
  • 只展示特定标签

kubectl get po -L label1, label2 /
  • 为已创建的 Pod 添加标签

kubectl label po xxxx xxxx=manual
  • 为节点添加标签

kubectl label node gke-kubia-8f56-node-0rrx gpu=true
  • 通过标签选择器列出节点

kubectl get node -l gpu=true
当然,Label 也有不足:例如 Label 在集群中不是唯一标识,不能自动更新,需要手动更新或删除,对于大规模的集群管理,会带来复杂度。

02 namespace

命名空间是 K8s 集群级别的资源,它的适用场景与标签不同,适合于跨多个团队或项目,K8s 默认会有一个 Default 命名空间,还有几个命名空间用于特定的目的,例如 kube-system 主要运行系统级资源等等。
可以通过 kubectl get ns 可以查看 namespace 资源:
# kubectl get namespace/ns(缩写)NAME              STATUS           AGEdefault                   Active           102dkube-node-lease           Active           102dkube-public               Active           102dkube-system               Active           102dtest                      Active           61d
# 查看详细命名空间信息情况# kubectl describe namespace defaultName: defaultLabels: <none>Annotations: <none>Status: ActiveNo resource quota.No LimitRange resource.…省略部分信息…

管理 namespace 资源

namespace资源属性较少,通常只需要指定名称即可创建,如“kubectl create namespace qa”。
namespace 资源的名称仅能由字母、数字、下划线、连接线等字符组成。
删除 namespace 资源会级联删除其包含的所有其他资源对象。
# 创建新的命名空间资源信息:# kubectl create ns testnamespace/test created# kubectl get nsNAME                     STATUS           AGEtest                      Active           4s
# 删除已有命名空间资源信息:# kubectl delete ns test --- 删除操作比较危险,慎用- 创建指定命名空间# kubectl create ns test# kubectl get ns testNAME STATUS AGEtest Active 61d
  • 切换指定命名空间:

切换命名空间后,kubectl get pods 如果不指定-n,查看的就是 kube-system 命名空间的资源了。

# kubectl config set-context --current --namespace=kube-systemContext "kubernetes-admin@kubernetes" modified.说明:表示从默认所在的default的命名空间状态,切换到指定的命名空间资源中
# kubectl get podsNAME READY STATUS RESTARTS AGEcalico-kube-controllers-6949477b58-5dqv4 1/1 Running 1 61dcalico-node-4ggj8 1/1 Running 1 102dcalico-node-4rmhx 1/1 Running 1 102dcalico-node-5xmjw 1/1 Running 2 102dcoredns-7f89b7bc75-krpzf 1/1 Running 1 61dcoredns-7f89b7bc75-qvj5m 1/1 Running 1 61detcd-k8s-master-01 1/1 Running 1 102detcd-k8s-master-02 1/1 Running 1 102dkube-apiserver-k8s-master-01 1/1 Running 1 102dkube-apiserver-k8s-master-02 1/1 Running 1 102dkube-controller-manager-k8s-master-01 1/1 Running 4 102dkube-controller-manager-k8s-master-02 1/1 Running 4 102dkube-proxy-2zrtt 1/1 Running 1 102dkube-proxy-dcxsv 1/1 Running 2 102dkube-proxy-hs8x2 1/1 Running 1 102dkube-scheduler-k8s-master-01 1/1 Running 4 102dkube-scheduler-k8s-master-02 1/1 Running 4 102d
# kubectl config set-context --current --namespace=defaultContext "kubernetes-admin@kubernetes" modified.
# 说明:表示从指定的命名空间所在的状态,切换到default的命名空间资源中
# kubectl get podsNAME READY STATUS RESTARTS AGEnginx-test-75c685fdb7-6g5m7 1/1 Running 1 61dnginx-test-75c685fdb7-6j9s8 1/1 Running 1 61dpod-first 1/1 Running 0 54m
当然,关于命名空间这里只是介绍了基础,还有多租户、隔离等相关内容没有介绍。
关于使用 kubeConfig 高效切换命名空间的方法,也欢迎各位专家指正。

03 Service

Service 是用于在 K8s 集群内暴露一组 Pod 访问入口的抽象对象。它提供了一个稳定的 IP 地址和 DNS 名称,使得外部应用程序能够通过服务访问指定的一组 Pod。服务还提供了负载均衡机制,以便将流量分发到具有相同标签选择器的多个 Pod 上。
如果您觉得 Pod 或一组 Pod 可以直接对外提供服务,那这里您可要好好看了,因为 Pod 提供 IP 不是永久的,并且 Pod 的 IP 地址是集群内部的,不能从外部访问。

Service 架构图
要让 Pod 能从外部访问,K8s 提供了一种机制——Service 来提供对外的访问,Service 也是一种特殊的 LoadBalancer 类型服务。
另外,Pod 生命周期完成后是会被销毁的,重新创建的 Pod 会有新的 IP 地址、主机名和进程,如果单纯只有 Pod,不利于 K8s 大规模的服务与管理。

当然,Service 也有缺点,比如 Service 只支持四层负载均衡,在实现七层负载均衡时候,Service 不支持,官方推荐的 Ingress 也有一些问题,这里暂且不涉及这方面内容,更多四层和七层的内容,请关注下篇。

04 小结

在 K8s 中,从架构方面了解 K8s 固然没有错,如果一直停留在架构图层面,就不够了。需要深入挖掘、善于实践、抽丝剥茧。
本文从 Label 入手,强调了打标签的重要性,也涉及了命名空间,注意:这里的命名空间需要与 Linux 的命名空间区分开~,还涉及了 Service 方面的内容。
当然,本文还有很多没有涉及到的地方,如 RC、探针、DeamonSet 等方面的内容,更深入的内容,也欢迎广大网友投稿。
最后,本文可能有不准确的地方,欢迎各位专家批评指正。

👇点击下方名片,即可添加星标

AIGC 浪潮来袭?如何理性看待 AIGC 浪潮下的软件研发趋势?6月29日,DOIS DevOps 国际峰会 2023 · 北京站,中国农业农行、中信银行等重磅嘉宾超强上线,你不了解一下?

近期好文:

到底要多 “牛X” 的网络,才能带得动 AIGC?

“高效运维”公众号诚邀广大技术人员投稿

投稿邮箱:jiachen@greatops.net,或添加联系人微信:greatops1118。
点个“在看”,一年不宕机

标签

发表评论