1.了解Kubernetes(K8S)是什么?它的功能、优缺点?

是谷歌开源的容器编排系统,使用Go语言编写,适合管理大规模的容器集群

k8s 是用于自动化部署、扩展和管理容器化应用程序的开源系统。

管理容器化应用的平台,开源的,更简单高效地部署容器化应用

dockercompose对比

功能:

  • 通过yaml配置文件实现一键集群中容器的批量部署;

  • 扩容、缩容、更新、回滚、发布、服务发现...

  • 默认提供负载均衡,高可用

优缺点:

  • 优点:

  • 支持自动部署、扩缩容、负载均衡和滚动更新

  • 支持多副本部署和跨节点分布,避免单点故障。

2.为什么要学习K8S,学完K8S后能做什么?

3.了解K8S和Docker关系、区别?

K8S和Docker关系是平台与工具的关系

Docker 是创建和运行容器的工具,K8S 是管理大量容器的平台

4.了解K8S的结构,核心组件?用 “是什么 - 解决什么问题 - 核心作用” 的结构?

  • Master管理节点、 控制平面(Control Plane,旧称Master)

    • API server:集群的“统一入口”,对于k8s的所有操作,都要经过API server;负责验证请求、转发指令,是组件间通信的唯一渠道。

    • etcd:是专门存储配置信息的数据库,key-value结构

    • Controller Manager:控制管理器,运行多种“控制器”进程(如节点控制器、副本控制器),监控集群状态,自动修复异常(如Pod崩溃了,自动新建一个)。

    • Scheduler:调度器,将容器调度到相应的节点上运行

  • Worker Node 工作节点:容器的运行监控管理

    • kubelet:每个节点上的“代理程序”,代理Master执行具体的任务管理容器运行时,监控容器的状态,向Master节点汇报节点状态

    • kube-proxy:利用LVS、iptable的Linux的组件实现负载均衡与网络通信,节点的“网络代理”,管理节点网络规则,实现Pod之间、Pod与外部的通信,支持Service的负载均衡。

    • Container Runtime:用于创建、运行容器的工具,例如:Docker、Podmon、Containerd、CRI-0

5.了解K8S的安装部署方式有哪些?

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

  • 初始化master节点,全局设置

#打印初始化配置
kubeadm config print init-defaults
#返回新的node节点的token
kubeadm token create --print-join-command
  • init:初始化Master节点

  • join:初始化Node节点并加入集群

  • reset:重置当前节点,无论是Master节点还是Node节点都可以重置

  • token: kubeadm init或输出的命令中返回的kubeadm join

kubectl:k8s集群管理命令

kubectl主要职责是对资源对象进行操作。

k8s当中的一切皆为资源;

  • cluster 集群

  • cs 组件对象

  • cm ConfigMap对象

  • ds DaemonSet对象

  • deploy deployments对象,k8s最常用的控制器

  • ep Endpoints端点集合;ip地址列表

  • ev events集群事件

  • ingress 访问入口

  • no nodes节点

  • ns namespaces命名空间

  • rs replicasents副本数,动态更新Pod的副本数,只支持扩容缩容

  • cronjob 周期任务管理器

  • svc services,服务入口

# 查看API资源
kubectl api-resources
​
# 查看API版本
kubectl api-versions
  • 查看资源

kubectl get 资源 -o 格式
* wide 显示详细信息
* json 以json格式显示详细信息
* yaml 以yaml格式显示详细信息
#查看pod信息
kubectl get pod -o wide
kubectl get pod -o yaml
kubectl get pod -o json
#查看所有信息
kubectl get all
#-w 等待显示资源状态的修改

创建资源

vim 01-nginx-pod.yml
​
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: web
spec:
  hostNetwork: true
  containers:
  - name:  nginx
    image: 192.168.57.200:8099/library/nginx:1.21
    ports:
    - containerPort: 80
#创建资源
kubectl create -f xxx.yaml
  • 删除资源

kubectl delete pod nginx -n dafault
kubectl delete -f 01-nginx-pod.yml
​
kubectl delete 资源类型 名称  -n命名空间
  • 更新资源

#当资源不存储时创建资源,也可以更新资源(镜像)
kubectl apply -f 01-nginx-pod.yml
  • 查询资源的详细信息,运行状态,常用于排除

kubectl describe pod nginx
  • 查看运行日志

kubectl logs nginx-game 
  • 在线更新运行中配置,yaml格式

kubectl edit pod nginx-game
  • 进入容器

kubectl exe -it nginx-game -- bash
  • 直接创建pod并启动容器

kubectl run --image=nginx nginx-app --port=8082
​
kubectl run --image=192.168.57.200:/8099/library/tomcat:8 tomcat-app --port=8080
​
kubectl dalete pod tomcat-app
  • 双向复制

kubectl cp init.sh nginx-game:/data
kubectl cp nginx-game:/data/ ./

Node节点操作

  • 准备工作:

    1. docker

    2. 系统优化

  • 添加

    • 让master生成join+tonken命令

    kubeadm token create --print-join-command
    • node节点执行kubeadm join命令

    ​
    systemctl start  kubelet
    ​
    kubeadm token create --print-join-command
    kubeadm join 192.168.8.12:6443 --token iixae5.y2sl9rn9eoy2cbb5 --discovery-token-ca-cert-hash sha256:6d1a6db991e3eefedf6545676a9ece9c60c51d38a453363466bb9c39a07ccde7 
    ​

    删除:

    • master设置Node为不可调用

    kubectl cordon node3
    • 在master节点强制驱除node中pod

    kubectl drain node3 --ignore-daemonsets --delete-emptydir-data
    • 从master节点中删除节点记录

     kubectl delete node node2
     #查看
      kubectl get node
    • 清理被移除的节点

    #关闭kubelet
    kubectl stop kubelet
    #重置所有k8s配置
    kubeadm reset
    #清理残余数据:删除 etcd 数据目录和 Kubernetes 配置文件:
    ​

Kubernetes 中YAML

---  #yaml起始分隔作用,可以在一个文件中写多个配置
apiVersion: v1   #查看版本:kubectl api-resources |grep pods
kind: Pod  #k8s资源类型
metadata:      #元数据,包含资源对象名称和标签
  name: myapp  #资源名称(自定义)
  labels:      #标签
    app: webapp
    info: abcd
spec:      #详细配置规格
  containers:   #容器定义
  - name: web1
    images: nginx:1.21
  - name: mysql
    images:mysql:8.0.
    
    
#生成yaml模板
kubectl create ns test --dry-run=client -o yaml > 05.namespace.yaml

NameSpace命名空间

资源的分组管理

资源限制,

#创建命名空间
kubectl create ns test
#查看所有命名空间
kubectl get ns
​
 kubectl get ns
NAME              STATUS   AGE
default           Active   7d23h
kube-flannel      Active   7d23h
kube-node-lease   Active   7d23h
kube-public       Active   7d23h
kube-system       Active   7d23h
test              Active   56s
* default 默认命名空间,查询资源时默认显示
* kube-flannel 网络插件的命名空间
kubectl get all -n kube-flannel 
* kube-node-lease 是 K8s 集群中用于节点租约(Node Lease)的一个命名空间。
* kube-public 所有用户(包括未经过身份验证的用户)都可以读取。
* kube-system k8s服务的命名空间,k8s的组件
​
#删除命名空间,会将命名空间中的所有资源全部删除
kubectl delete ns test
​
#指定资源的namespace
apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    run: myapp
  namespace: test   #创建资源时,指定namespace
spec:
  containers:
  - image: 192.168.57.200:8099/library/nginx:1.21
    imagePullPolicy: IfNotPresent
    name: myapp
​
#创建pod
kubectl apply -f 06.nginx-test.yaml
#指定命名空间查看pod
kubectl get pod -n test 
​

资源限制:

Namespace的资源限制主要通过两种资源对象实现:

  • ResourceQuota(资源配置)

  • LimitRange(限制范围)

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐