在学习完docker之后,也很有必要再学习k8s的一些理论和技术。
一、基础概念
kubernetes(k8s)和docker在容器管理领域具有不同的侧重点和优势。当前docker主要关注单个容器的构建、运行和管理,而k8s则专注于大规模的容器编排和管理。k8s在以下几个特性中,更具有优势。
特性1:自动化部署和管理
特性2:服务发现和负载均衡
特性3:自动扩展、自愈能力
简单说,k8s属于master-worker架构,master节点负责核心调度,管理,worker节点用来执行用户程序。建议master节点单独部署(一台实体服务器),但可以有多个master node。master node所需的一些组件,kube-apiserver、scheduler、etcd。worker node所需的一些组件,kubelet、kube-proxy、container runtime。
k8s服务参考图
二、k8s集群的操作和命令
1、我们使用kubectl,kubectl
是与 Kubernetes 集群交互的主要命令行工具。其基本语法结构为:
kubectl [command] [TYPE] [NAME] [flags]
2、常见操作命令
集群相关
# 查看所有节点 kubectl get nodes # 查看集群信息 kubectl cluster-info
pod:Pod 是 Kubernetes 中的最小可部署单位,代表一组紧密耦合的容器。每个 Pod 包含一个或多个容器,这些容器共享网络和存储。通常,一个 Pod 运行一个主容器(例如,Web服务器),以及一些辅助容器(如日志收集、监控代理等)。
Pod 通常不直接创建,而是通过更高级别的控制器(如 Deployment)来管理。
相关操作:
# 查看Pod列表 kubectl get pods # 查看指定命名空间下的Pod kubectl get pods -n <namespace> # 详细描述Pod:输出Pod的详细信息,包括事件、状态、配置信息等 kubectl describe pod <pod-name> # 查看Pod的日志 kubectl logs <pod-name> # 进入Pod的容器 kubectl exec -it <pod-name> -- /bin/bash # 删除Pod kubectl delete pod <pod-name> --force
service:是一种用于定义一组 Pod 的网络访问策略的资源对象。它为外部系统或内部组件提供了稳定的访问入口,即使这些 Pod 的 IP 地址会随着 Pod 的创建和销毁而变化。Service 通过将流量分发到符合选择条件的 Pod 来实现负载均衡。
Kubernetes 支持多种类型的 Service,不同类型的 Service 适用于不同的网络需求:
-
ClusterIP(默认类型):
- 仅在集群内部可访问。
- 为 Service 创建一个虚拟 IP(Cluster IP),用于在集群内部的其他服务间进行通信。
- 适用于服务之间的内部通信。
-
NodePort:
- 将服务暴露在每个节点的某个端口上(范围是 30000-32767),通过
<NodeIP>:<NodePort>
访问。 - 适用于需要从集群外部直接访问服务的情况。
- 将服务暴露在每个节点的某个端口上(范围是 30000-32767),通过
-
LoadBalancer:
- 在支持的云环境中(如 AWS、GCP),自动创建一个外部负载均衡器,并将其与 Service 关联。
- 将流量转发到 Service 对应的 NodePort 或 ClusterIP。
- 适用于需要自动创建云提供商的负载均衡器来暴露服务的情况。
-
ExternalName:
- 将服务的 DNS 名称映射到外部的 DNS 名称。
- 没有选择器,与其他服务类型不同,它不会选择集群中的 Pod,而是返回 CNAME 记录。
- 适用于访问集群外部的资源,如数据库服务。
相关操作:
# 查看Service列表:列出所有Service及其对应的ClusterIP、外部IP等信息 kubectl get services # 查看Service详细信息 kubectl describe service <service-name> # 删除service kubectl delete service <service-name>
deployment:Deployment 是一种用于管理应用程序的 Kubernetes 控制器。它提供声明式更新机制,使你能够管理应用的副本数量、更新策略等。Deployment 是管理 Pod 的常用方式,它确保指定数量的 Pod 始终运行,并且可以自动执行滚动更新和回滚操作。
相关操作:
# 创建Deployment:使用指定镜像创建一个新的Deployment kubectl create deployment <deployment-name> --image=<image-name> # 查看Deployment列表 kubectl get deployments # 查看Deployment详细信息 kubectl describe deployment <deployment-name> # 更新Deployment的镜像:更新Deployment中容器的镜像,会触发滚动更新 kubectl set image deployment/<deployment-name> <container-name>=<new-image> # 扩展或缩减Deployment的Pod副本数 kubectl scale deployment <deployment-name> --replicas=<number> # 编辑Deployment kubectl edit deployment <deployment-name> # 删除Deployment kubectl delete deployment <deployment-name>
ConfigMap资源:是 Kubernetes 中用于存储非机密配置信息的对象。它将配置信息以键值对的形式存储,可以将这些配置注入到容器中作为环境变量、命令行参数,或挂载为文件。ConfigMap 允许配置与容器镜像分离,使得应用程序更易于配置和管理。
相关操作:
# 创建ConfigMap kubectl create configmap <configmap-name> --from-literal=<key>=<value> # 查看ConfigMap列表 kubectl get configmaps # 查看ConfigMap详细信息 kubectl describe configmap <configmap-name> # 编辑Configmap kubectl edit configmap <configmap-name>
命名空间:是 Kubernetes 中用于资源隔离的逻辑分区。它允许你在同一个集群中隔离不同的项目或团队的资源。每个 Namespace 之间的资源是独立的,例如 Pod、Service 等,因此可以避免不同应用或团队之间的冲突。
相关操作:
# 查看命名空间列表 kubectl get namespaces # 创建新的命名空间 kubectl create namespace <namespace-name> # 删除命名空间 kubectl delete namespace <namespace-name> # 在指定命名空间中操作:可以用 -n 标志指定操作的命名空间 kubectl get pods -n <namespace-name>
资源监控
# 持续监控pod kubectl get pods -w # 监控特定资源 kubectl top pod