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 sescs组件对象
configmapscmConfigMap对象
daemonsetsdsDaemonSet对象
deploymentsdeploy无状态服务对象,K8s最常用的控制器
endpointsep端点集合(实现同一类Pod的IP地址列表)
eventsevevents集群事件集合
ingressing访问入口
nodesno节点
namespacesns命名空间
podspo获取Pod信息
replicasetsrsPod副本数
cronjob周期性任务控制
servicessvc做负载均衡的服务入口
 # 查看API资源
 kubectl api-resources
 # 查看API版本
 kubectl api-versions
  • 查看资源

 kubectl get 资源 -o 格式
 格式: * wide 显示详细信息
       * json 以json格式显示详细信息
       * yaml 以yaml格式显示详细信息
 -w 等待显示资源状态的修改
 -n 指定命名空间
  • 创建、删除、更新资源

 # 通过YAML创建资源,需要先vim这个yaml文件
 #(不指定名称可以换成.,表示当前目录下所有文件)
 vim 资源名称
 ------------------------
 apiVersion: v1
 kind: Pod
 metadata:
   name: nginx
   labels:
     app: web
 spec:
   hostNetwork: true
   containers:
   - name: nginx
     image: 192.168.57.200:8099/library/nginx:latest
     ports:
     - containerPort: 80
 ------------------------
 kubectl create -f 资源名称
 ​
 # 如果是需要换成h5-game,需要提前在节点上login并拉取镜像
 docker login 192.168.57.200:8099
 docker 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>        # 删除指定Pod
 kubectl delete pod --all             # 删除所有Pod
 kubectl 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=8080
 kubectl delete pod tomcat-app
  • 双向复制

 kubectl cp init.sh nginx-game:/data
 kubectl 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-command
    • Node节点执行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 node
 kubectl describe node node2

Kubernetes中Yaml

基本语法格式

 ---                      # YAML起始分割作用,可以在一个文件中写多个配置
 apiVersion: v1           # 查询API版本,kubectl api-resources | grep pods
 kind: Pod                # K8s资源类型
 metadata:                # 元数据,包含资源对象的名称和标签等设置
   name: myapp            # 资源名称,可以用来重启查看删除
   labels:                # 标签,筛选
     app: webapp          # 标签键值对
     info: abcd
 spec:                    # 容器的详细配置规格
   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: v1
 kind: Pod
 metadata:
   creationTimestamp: null
   labels:
     run: myapp
   name: myapp
 spec:
   containers:
   - image: nginx:1.26
     name: myapp
     resources: {}
   dnsPolicy: ClusterFirst
   restartPolicy: Always
 status: {}
 ​
 # 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: v1
 kind: Namespace
 metadata:
   creationTimestamp: null
   name: work
 spec: {}
 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/v1
 kind: Deployment
 metadata:
   creationTimestamp: null
   labels:
     app: myapp
   name: myapp
 spec:
   replicas: 1
   selector:
     matchLabels:
       app: myapp
   strategy: {}
   template:
     metadata:
       creationTimestamp: null
       labels:
         app: myapp
     spec:
       containers:
       - image: nginx:1.24
         name: nginx
         resources: {}
 status: {}

资源操作命令详解

1.创建资源

 # 从YAML文件创建资源
 kubectl create -f myapp.yaml
 ​
 # 创建多个资源
 kubectl create -f dir/  # 目录下所有YAML文件
 kubectl create -f file1.yaml -f file2.yaml

2.应用声明式配置

 # 创建或更新某个资源(推荐方式)
 kubectl apply -f myapp.yaml
 ​
 # 查看将要应用的变更
 kubectl apply -f myapp.yaml --dry-run=client
 ​
 # 强制替换配置
 kubectl replace --force -f myapp.yaml

3.删除资源

 # 删除指定资源
 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
EOF

kubectl patch pod myapp --type=merge --patch-file patch.yaml

# 使用JSON patch删除标签
cat > remove-label.yaml << EOF
- op: remove
  path: /metadata/labels/key
EOF

kubectl 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资源清单文件的使用是容器编排的基础技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值