Kubernetes基础概念和命令
K8s基础概念
Master节点:管理整个K8s集群
生产环境至少3个节点,大型集群建议5个节点;
测试环境1个节点;
Worker节点:运行容器,Pod,容器的生命周期管理;
每个节点运行10~100个Pod;根据pod的规模调整Worker节点的数量;
Pod
Pod是K8s中最小的管理单元,Pod是用于管理容器的;
Pod的作用是“虚拟的节点”,微型节点,一个Pod中至少可以管理运行一个或多个容器,在同一个Pod中的容器可以共享网络和存储;
管理器
用户管理Pod的一系列管理器;
副本管理;
生命周期管理;
弹性的扩缩容管理;
Deployment:管理无状态服务(Nginx、Tomcat、PHP)
StatefulSet:管理无状态服务(MySQL)
Job:管理一次性服务
CronJob:计划执行服务
服务发现与网络通信:应用“通信”的规则
通过网络将数据请求转发给指定容器;实现负载均衡的功能;
Service组件实现Pod的服务发现与负载均衡;
配置与存储:应用“吃喝”的保障
ConfigMap:存储配置文件
Secret:存放密码或密钥
PV/PVC:持久化存储的资源与资源绑定
资源管理:资源“分类”的方法
Namespace:可以给不同的业务分组管理,实现资源的隔离与限制;
Label:标签,实现Pod调度、Pod的资源管理器、服务器发现、负载均衡;
K8s基础命令
kubeadm:快速安装k8s命令行工具
初始化Master节点,全局设置
config:指定初始化集群时使用的配置文件init:初始化Master节点join:初始化Node节点并加入集群reset:重置当前节点,无论是Master节点还是Node节点都可以重置token: kubeadm join# 打印默认初始化配置kubeadm config print init-defaults# 生成新的加入令牌kubeadm token create --print-join-command kubectl:K8s集群管理命令
kubectl主要职责是对资源对象进行操作。
K8s中一切皆为资源;
| 资源 | 缩写 | 说明 |
|---|---|---|
| cluster | 集群 | |
| componentstatu ses | cs | 组件对象 |
| configmaps | cm | ConfigMap对象 |
| daemonsets | ds | DaemonSet对象 |
| deployments | deploy | 无状态服务对象,K8s最常用的控制器 |
| endpoints | ep | 端点集合(实现同一类Pod的IP地址列表) |
| events | ev | events集群事件集合 |
| ingress | ing | 访问入口 |
| nodes | no | 节点 |
| namespaces | ns | 命名空间 |
| pods | po | 获取Pod信息 |
| replicasets | rs | Pod副本数 |
| cronjob | 周期性任务控制 | |
| services | svc | 做负载均衡的服务入口 |
# 查看API资源kubectl api-resources# 查看API版本kubectl api-versions查看资源
kubectl get 资源 -o 格式格式: * wide 显示详细信息* json 以json格式显示详细信息* yaml 以yaml格式显示详细信息-w 等待显示资源状态的修改-n 指定命名空间创建、删除、更新资源
# 通过YAML创建资源,需要先vim这个yaml文件#(不指定名称可以换成.,表示当前目录下所有文件)vim 资源名称------------------------apiVersion: v1kind: Podmetadata:name: nginxlabels:app: webspec:hostNetwork: truecontainers:- name: nginximage: 192.168.57.200:8099/library/nginx:latestports:- containerPort: 80------------------------kubectl create -f 资源名称# 如果是需要换成h5-game,需要提前在节点上login并拉取镜像docker login 192.168.57.200:8099docker pull 192.168.57.200:8099/yun11/h5-game:1.0# 删除资源kubectl delete 资源类型 名称 -n 命名空间kubectl delete -f 资源名称# 修改或者更新资源(镜像),应用某一个资源,资源不存在时创建资源,资源存在时不进行操作,也支持修改资源(用的比create多,也可以修改)kubectl apply -f 资源名称# 直接操作资源kubectl delete pod <pod-name> # 删除指定Podkubectl delete pod --all # 删除所有Podkubectl create namespace <name> # 创建命名空间查看资源的详细信息,运行状态,常用于排错
kubectl describe pod nginx查看运行日志,用于排错
# 查看Pod日志kubectl logs <pod-name># 实时查看日志kubectl logs -f <pod-name> 在线更新运行中配置,yaml格式
kubectl edit pod nginx-game进入容器进行修改
kubectl exec -it <pod-name> -- bash直接创建pod并启动容器
kubectl run --image=192.168.57.200:8099//镜像 镜像名 --port=8080# 举例说明kubectl run --image=192,168.57.200:8099/library/tomcat:8 tomcat-app --port=8080kubectl delete pod tomcat-app双向复制
kubectl cp init.sh nginx-game:/datakubectl cp nginx-game:/data/.更新与回滚
kubectl set image deployment/<name> <container>=<image> # 更新镜像kubectl rollout undo deployment/<name> # 回滚部署kubectl scale deployment <name> --replicas=<number> # 伸缩Pod数量标签管理(过滤器,筛选功能类似select)
kubectl label nodes <node-name> <key>=<value> # 给节点添加标签kubectl label pod <pod-name> <key>=<value> # 给Pod添加标签kubectl label pod <pod-name> <key>- # 删除标签Node节点操作
添加:
准备工作:
1.Docker
2.系统优化
让Master生成join+token命令
[root@master~]# kubeadm token create --print-join-commandNode节点执行kubeadm join命令
# Node节点先重启[root@node2 ~]# systemctl start kubelet# 然后再运行加入命令join...
删除:
在Master节点中设置Node为不可调用
[root@master~]# kubectl cordon node2在Master节点中强制驱逐Node节点的Pod
# 需要先删除上面的Pod,或者资源[root@master~]# kubectl drain node2 --ignore-daemonsets --delete-emptydir-data从Master节点中删除节点记录
[root@master~]# kubectl delete node node2清理被移除的节点
[root@node2 ~]# systemctl stop kubelet# 重置节点:清理该节点上的 Kubernetes 配置:[root@node2 ~]# kubeadm reset# 清理残余数据:删除 etcd 数据目录和 Kubernetes 配置文件:[root@node2 ~]# rm -rf /etc/cni/net.d /var/lib/kubelet /var/lib/etcd
查看
kubectl get nodekubectl describe node node2Kubernetes中Yaml
基本语法格式
--- # YAML起始分割作用,可以在一个文件中写多个配置apiVersion: v1 # 查询API版本,kubectl api-resources | grep podskind: Pod # K8s资源类型metadata: # 元数据,包含资源对象的名称和标签等设置name: myapp # 资源名称,可以用来重启查看删除labels: # 标签,筛选app: webapp # 标签键值对info: abcdspec: # 容器的详细配置规格containers: # 容器定义- name: web1 # 容器名称,第一个image: nginx:1.21 # 容器镜像- name: web2 # 第二个容器名称(如果只有一个后面就不写)image: mysql:8.0.20 # 第二个容器镜像关键字段解析
apiVersion: 指定使用的Kubernetes API版本,不同资源类型使用不同版本
kind: 定义资源类型,如Pod、Deployment、Service等
metadata: 包含资源的标识信息(名称、标签、注释等)
spec: 描述资源的期望状态,这是最复杂的部分
status: 记录资源的实际状态,由Kubernetes自动生成,使用清单时通常省略
# 查看K8S自带的资源管理帮助文档kubectl explain deployment--dry-run生成YAML文件框架
快速生成YAML模板
Kubernetes提供了强大的模板生成功能,无需手动编写YAML。
# 1、生成Pod模板kubectl run myapp --image=nginx:1.17 --dry-run=client -o yaml > pod.yaml# 举例:kubectl run myapp --image=nginx:1.26 --dry-run=client -o yaml > 01-nginx-pod.yaml# 查看结果cat 01-nginx-pod.yaml apiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: myappname: myappspec:containers:- image: nginx:1.26name: myappresources: {}dnsPolicy: ClusterFirstrestartPolicy: Alwaysstatus: {}# 2、生成Namespace模板kubectl create namespace work --dry-run=client -o yaml > namespace.yaml# 举例kubectl create namespace work --dry-run=client -o yaml > 02-namespace.yaml# 查看结果cat 02-namespace.yaml apiVersion: v1kind: Namespacemetadata:creationTimestamp: nullname: workspec: {}status: {}# 3、生成Deployment模板kubectl create deployment myapp --image=dbimg:1.35 --dry-run=client -o yaml > deployment.yaml# 举例kubectl create deployment myapp --image=nginx:1.24 --dry-run=client -o yaml > 03-nginx-deployment.yaml# 查看结果cat 03-nginx-deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:creationTimestamp: nulllabels:app: myappname: myappspec:replicas: 1selector:matchLabels:app: myappstrategy: {}template:metadata:creationTimestamp: nulllabels:app: myappspec:containers:- image: nginx:1.24name: nginxresources: {}status: {}资源操作命令详解
1.创建资源
# 从YAML文件创建资源kubectl create -f myapp.yaml# 创建多个资源kubectl create -f dir/ # 目录下所有YAML文件kubectl create -f file1.yaml -f file2.yaml2.应用声明式配置
# 创建或更新某个资源(推荐方式)kubectl apply -f myapp.yaml# 查看将要应用的变更kubectl apply -f myapp.yaml --dry-run=client# 强制替换配置kubectl replace --force -f myapp.yaml3.删除资源
# 删除指定资源kubectl delete -f myapp.yaml# 删除多个资源kubectl delete -f directory/# 基于标签删除(可能的多个pod)kubectl delete pod -l app=webapp高级操作技巧
1. 部分更新资源(打补丁)
# 使用merge混合策略(默认是strategic策略性合并)更新标签,适用于简单字段更新
cat > patch.yaml << EOF
metadata:labels:key: myapp-value
EOFkubectl patch pod myapp --type=merge --patch-file patch.yaml# 使用JSON patch删除标签
cat > remove-label.yaml << EOF
- op: removepath: /metadata/labels/key
EOFkubectl patch pod myapp --type=json --patch-file remove-label.yaml
2. 添加注解
# 添加或更新注解
kubectl annotate pod myapp webapp="nginx.1.17" description="前端Web服务器"# 查看注解信息
kubectl describe pod myapp | grep Annotations
3. 实时编辑资源(对于改动不大的情况,使用edit更快速)
# 编辑运行中的资源
kubectl edit pod myapp# 编辑Deployment配置(编辑时会打开默认文本编辑器,修改保存后会立即生效)
kubectl edit deployment/myapp
常见问题排查
1. YAML格式错误
# 常见的格式错误
error: error parsing pod.yaml: error converting YAML to JSON: yaml: line 10: did not find expected key# 解决方法:使用YAML验证工具或在线校验器
2. 资源已存在错误
# 使用create时如果资源已存在会报错
Error from server (AlreadyExists): error when creating "myapp.yaml": pods "myapp" already exists# 解决方法:使用apply代替create,或者先删除再创建
3. 字段验证错误
# API服务器会验证字段合法性
The Deployment "myapp" is invalid: spec.template.spec.containers[0].name: Required value# 解决方法:使用kubectl explain查看字段要求
掌握Kubernetes资源清单文件的使用是容器编排的基础技能。
