kubectl 是 Kubernetes 集群的命令行工具,用于管理和操作 Kubernetes 资源。

本文主要是通过介绍高频使用的 kubectl 来学习 Kubernetes 集群。

前提知识

Node

Node 是 Kubernetes 集群中的一个物理或虚拟机器,用于运行应用程序的工作负载。Node 由 Master 管理,可以是虚拟机或物理机。Node 上运行着 kubelet(负责 Pod 的创建、启动、监控和删除)、kube-proxy(负责 Pod 之间的通信和负载均衡)、Container Runtime(负责容器的创建、启动、监控和删除)。

Pod

Pod 是 Kubernetes 中最小的部署单元,是一个或多个容器的集合,共享网络和存储资源。Pod 是 Kubernetes 中的原子单元,是部署、扩展和管理的基本单位。

Pod 运行在 Node 之上,Pod 是短暂的,可能被随时创建或销毁,Pod 之间可以共享网络和存储资源。

Deployment

Deployment 是 Kubernetes 中用于定义应用程序部署的资源对象,用于创建 Pod 和 ReplicaSet。Deployment 可以用于创建、更新和删除应用程序。

Deployment 可以定义应用程序的副本数量,可以定义应用程序的容器镜像,可以定义应用程序的环境变量等。Deployment 定义了期望的 Pod 状态,负责创建和管理 ReplicaSet,ReplicaSet 再负责创建和管理 Pod。

Deployment 提供了声明式更新和回滚应用程序的功能。

Service

Service 是 Kubernetes 中用于定义应用程序服务的资源对象,用于将应用程序暴露给其他应用程序或用户。Service 可以通过 ClusterIP、NodePort、LoadBalancer 和 ExternalName 类型将应用程序暴露给外部。

Service 为一组功能相同的 Pod 提供单一访问点。通过标签选择器关联到特定 Pod,提供负载均衡、服务发现、服务代理等功能。

Namespace

Namespace 是 Kubernetes 中用于隔离资源的逻辑分区,用于将资源划分为不同的逻辑单元。Namespace 可以用于隔离资源、限制资源的使用、提供资源的访问控制等。

Namespace 可以用于隔离不同的环境、不同的团队、不同的应用程序等。

StatefulSet

StatefulSet 是 Kubernetes 中用于管理有状态应用程序的资源对象,用于创建和管理有状态的应用程序。StatefulSet 可以保证 Pod 的唯一性、稳定性、持久性等。

常用 kubectl 命令

获取资源信息

# 获取 Pod 信息
kubectl get nodes
# 获取所有命名空间的 Pod 信息
kubectl get pods --all-namespaces
# 获取详细的 Pod 信息
kubectl get pods -o wide

kubectl get services --all-namespaces

获取特定类型资源

kubectl get deployments
kubectl get services
kubectl get namespaces
kubectl get pod
# export yaml
kubectl get pod -o yaml
kubectl get pod -o json

描述 Pod 信息

# 描述 Pod 信息
kubectl describe pod <pod-name>
# 描述 Node 信息
kubectl describe node <node-name>

获取集群信息

kubectl cluster-info

创建资源

kubectl create -f <yaml-file>.yaml
# 应用配置文件
kubectl apply -f <yaml-file>.yaml
# 创建部署
kubectl create deployment <deployment-name> --image=<image-name>

删除资源

kubectl delete pod <pod-name>
# 删除 deployment
kubectl delete deployment <deployment-name>
# 删除 service
kubectl delete service <service-name>

查看日志

kubectl logs <pod-name>

进入容器

kubectl exec -it <pod-name> -- /bin/bash

扩容和更新

# 扩容
kubectl scale deployment <deployment-name> --replicas=3
# 更新部署中的容器的镜像
kubectl set image deployment/<deployment-name> <container-name>=<new-image>

端口转发

将服务的端口映射到本地端口,适合用来 Debug,或者临时进行测试使用。

kubectl port-forward name local_port:pod_port