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

被折叠的 条评论
为什么被折叠?



