• 容器编排学习(一)k8s集群管理


    一  Kubernetes 

    1  概述

    就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的一一编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理就在这个时候,kubernetes出现了

    kubernetes的名字来自希腊语,意思是舵手或领航员k8s是将k和s之间的8个字母ubernete替换为8的缩写

    k8s的创造者,是众人皆知的行业巨头一Google。k8s并不是一件全新的发明,他是Google10多年大规模容器管理技术Borg的开源版本。2014年6月k8s由Google公司正式公布出来并宣布开源

    k8s 是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、自维护等功能

    2  核心架构

    master (管理节点)

    • 提供集群的控制
    • 对集群进行全局决策
    • 检测和响应集群事件

    核心组件

    API Server 

    • 是整个系统的对外接口,供客户端和其它组件调用
    • 后端元数据存储于etcd中(键值数据库)

    Scheduler

    • 负责对集群内部的资源进行分配和调度

    ControllerManager

    • 负责管理控制器,相当于大总管

    etcd

    • 存储kubernetes在运行过程中产生的所有元数据

    服务端口

    软件工具包

    kubeadm:集群配置工具

    kubelet:管理pod,在集群中的每个节点上启动

    kubectl:用来与集群通信的命令行工具

    contained:容器管理软件(Runtime)

    ipvsadm:集群管理工具

    iproute-tc:网络流量管理工具

    node      (计算节点)

    • 运行容器的实际节点
    • 提供运行环境
    • 在多个节点上运行
    • 水平扩展

    Node核心组件

    Kubelet

    • 负责监视Pod、包括创建、修改、删除等

    Kube-proxy

    • 主要负责为Pod对象提供代理
    • 实现service的通信与负载均衡

    Runtime

    • 容器管理(contained )

    image  (镜像仓库)

    • 存储镜像
    • 为节点提供镜像支持

    仓库组件:Registry 或 Harbor

    二  calico

    1  概述

    在虚拟化平台中,比如 OpenStack、Docker 等都需要实现workloads 之间互连,但同时也需要对容器做隔离控制,设置访问策略,calico 就可以解决以上所有问题

    calico 可以让不同节点上的容器实现互联互通,同时也可以设置访问策略,它是一种容器之间网络互通的解决方案

    2  优势

    更节约资源:Calico 使用的三层路由方法,抑制二层广播减少了资源开销,并且具有可扩展性。

    更容易管理:因为没有隧道,意味着 workloads 之间路径更短更简单,配置更少,更容易管理

    更少的依赖: Calico 仅依赖三层路由可达

    适配性广:较少的依赖性使它能适配所有 VM、Container、白盒或者混合环境场景。

    三  kubeadm

    常用选项

    命令选项命令说明
    help命令帮助信息
    version版本信息
    config镜像管理命令
    init集群初始化命令
    reset还原、删除集群配置
    join计算节点加入集群
    tokentoken凭据管理

    四  集群管理命令

    kubectl 是用于控制 Kubernetes 集群的命令行工具

    1  语法格式

    kubectl [command] [TYPE] [NAME] [flags]

    command:子命令,如create,get,describe,delete

    type:资源类型,可以表示为单数,复数或缩写形式

    name:资源名称,如果省略,则显示所有资源信息

    flags:指定可选标识或附加的参数

    2  集群信息管理命令

    子命令说明备注
    help用于查看命令及子命令的帮助信息
    cluster-info显示集群的相关配置信息
    version查看服务器及客户端的版本信息
    api-resources查看当前服务器上所有的资源对象
    api-versions查看当前服务器上所有资源对象的版本
    config管理当前节点上kubeconfig 的认证信息

    help

    1. # 查看帮助命令信息
    2. [root@master ~]# kubectl help version
    3. Print the client and server version information for the current context.
    4. Examples:
    5. # Print the client and server versions for the current context
    6. kubectl version
    7. ... ...

    cluster-info

    1. # 查看集群状态信息
    2. [root@master ~]# kubectl cluster-info
    3. Kubernetes control plane is running at https://192.168.1.50:6443
    4. CoreDNS is running at https://192.168.1.50:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

    version

    1. # 查看服务端与客户端版本信息
    2. [root@master ~]# kubectl version
    3. WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
    4. Client Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.0", GitCommit:"b46a3f887ca979b1a5d14fd39cb1af43e7e5d12d", GitTreeState:"clean", BuildDate:"2022-12-08T19:58:30Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}
    5. Kustomize Version: v4.5.7
    6. Server Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.0", GitCommit:"b46a3f887ca979b1a5d14fd39cb1af43e7e5d12d", GitTreeState:"clean", BuildDate:"2022-12-08T19:51:45Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}

    api-resources

    1. # 查看资源对象类型
    2. [root@master ~]# kubectl api-resources
    3. NAME SHORTNAMES APIVERSION NAMESPACED KIND
    4. bindings v1 true Binding
    5. endpoints ep v1 true Endpoints
    6. events ev v1 true Event
    7. ... ...

    api-versions

    1. # 查看资源对象版本
    2. [root@master ~]# kubectl api-versions
    3. admissionregistration.k8s.io/v1
    4. apiextensions.k8s.io/v1
    5. apiregistration.k8s.io/v1
    6. apps/v1
    7. ... ...

    config

    1. # 查看当前认证使用的用户及证书
    2. [root@master ~]# kubectl config get-contexts
    3. CURRENT NAME CLUSTER AUTHINFO NAMESPACE
    4. * kubernetes-admin@kubernetes kubernetes kubernetes-admin
    5. # 使用 view 查看详细配置
    6. [root@master ~]# kubectl config view
    7. apiVersion: v1
    8. clusters:
    9. - cluster:
    10. certificate-authority-data: DATA+OMITTED
    11. server: https://192.168.1.50:6443
    12. name: kubernetes
    13. contexts:
    14. - context:
    15. cluster: kubernetes
    16. user: kubernetes-admin
    17. name: kubernetes-admin@kubernetes
    18. current-context: kubernetes-admin@kubernetes
    19. kind: Config
    20. preferences: {}
    21. users:
    22. - name: kubernetes-admin
    23. user:
    24. client-certificate-data: REDACTED
    25. client-key-data: REDACTED

    主机管理授权

    1. [root@harbor ~]# vim /etc/hosts
    2. 192.168.1.30 harbor
    3. 192.168.1.50 master
    4. 192.168.1.51 node-0001
    5. 192.168.1.52 node-0002
    6. 192.168.1.53 node-0003
    7. 192.168.1.54 node-0004
    8. 192.168.1.55 node-0005
    9. [root@harbor ~]# dnf install -y kubectl
    10. [root@harbor ~]# mkdir -p $HOME/.kube
    11. [root@harbor ~]# rsync -av master:/etc/kubernetes/admin.conf $HOME/.kube/config
    12. [root@harbor ~]# chown $(id -u):$(id -g) $HOME/.kube/config
    13. [root@harbor ~]# kubectl get nodes
    14. NAME STATUS ROLES AGE VERSION
    15. master Ready control-plane 24h v1.26.0
    16. node-0001 Ready <none> 22h v1.26.0
    17. node-0002 Ready <none> 22h v1.26.0
    18. node-0003 Ready <none> 22h v1.26.0
    19. node-0004 Ready <none> 22h v1.26.0
    20. node-0005 Ready <none> 22h v1.26.0

    五  Pod

    1  概述

    Pod 就像是豌豆英一样,它由一个或者多个容器组成

    Pod 是Kubernetes中最小的管理元素

    Pod 是一个服务的多个进程的聚合单位

    安同一个 Pod共享网络IP及权限

    同一个 Pod 共享主机名称

    同一个 Pod 共享存储设备

    2  创建过程

    为什么要使用Pod?

    • 服务之间有相关性
    • 启动容器的时候需要初始化或进行相关配置

    3  生命周期

    Pod 对象自从创建开始至终止的时间范围称为其生命周期,在这段时间中Pod 处在多种不同的状态,并执行相关操作

    创建主容器为必需的操作,其他为可选操作(初始化容器启动后钩子、存活性探测、就绪性探测以及终止前钩子等

    4  相位状态

     Pod的status字段是一个PodStatus的对象,Pod对象总是应该处于其生命进程中以下几个相位 (phase) 之一

    PendingPod 创建过程中,但它尚未被调度完成
    RunningPod中所有容器都已经被创建成功
    CompletedPod 所有容器都已经成功终止,并不会被重启
    FailedPod中的所有容器中至少有一个容器退出是非0状态
    Unknown无法正常获取到Pod对象的状态信息

    3  Pod核心管理命令(一) 

    子命令说明备注
    run/create创建资源对象可输出资源文件模板
    get查看资源对象的状态信息常用参数: -o 显示格式
    describe查询资源对象的属性信息
    logs查看容器的报错信息常用参数: -c 容器名称

    run 

    1. # 创建 Pod
    2. [root@master ~]# kubectl run myweb --image=myos:nginx
    3. pod/myweb created
    4. # 查询资源对象
    5. [root@master ~]# kubectl get pods -o wide
    6. NAME READY STATUS RESTARTS AGE IP NODE
    7. myweb 1/1 Running 0 3s 10.244.1.3 node-0001
    8. [root@master ~]# curl http://10.244.1.3
    9. Nginx is running !

    get

    语法格式:kubectl  get  资源类型  [资源名称]  [选项/参数]

    常用参数:

            -o name       只显示名字

            -o wide         显示更加的详细信息

            -o yaml         以 Yaml 语法格式显示资源对象

            -o json          以 json  语法格式显示资源对象

    1. # 查看 Pod 资源对象
    2. [root@master ~]# kubectl get pods
    3. NAME READY STATUS RESTARTS AGE
    4. myweb 1/1 Running 0 10m
    5. # 只查看资源对象的名字
    6. [root@master ~]# kubectl get pods -o name
    7. pod/myweb
    8. # 查看资源对象运行节点的信息
    9. [root@master ~]# kubectl get pods -o wide
    10. NAME READY STATUS RESTARTS AGE IP NODE
    11. myweb 1/1 Running 0 10m 10.244.1.3 node-0001
    12. # 查看资源对象详细信息,Yaml 格式
    13. [root@master ~]# kubectl get pod myweb -o yaml
    14. apiVersion: v1
    15. kind: Pod
    16. metadata:
    17. name: myweb
    18. ... ...
    19. # 查看名称空间
    20. [root@master ~]# kubectl get namespaces
    21. NAME STATUS AGE
    22. default Active 39h
    23. kube-node-lease Active 39h
    24. kube-public Active 39h
    25. kube-system Active 39h
    26. # 查看 kube-system 名称空间中的 Pod 信息
    27. [root@master ~]# kubectl -n kube-system get pods
    28. NAME READY STATUS RESTARTS AGE
    29. etcd-master 1/1 Running 0 39h
    30. kube-apiserver-master 1/1 Running 0 39h
    31. kube-controller-manager-master 1/1 Running 0 39h
    32. kube-scheduler-master 1/1 Running 0 39h
    33. ... ...
    create

    系统命名空间

    default 默认的命名空间,不声明命名空间的Pod都在这里

    kube-node-lease 为高可用提供心跳监视的命名空间

    kube-public 公共数据,所有用户都可以读取它

    kube-system 系统服务对象所使用的命名空间

    注意:k8s 系统核心服务都运行在 kube-system 名称空间中

    语法格式:kubectl create <资源对象>  [选项/参数]

    1. # 创建名称空间资源对象
    2. [root@master ~]# kubectl create namespace work
    3. namespace/work created
    4. # 查看名称空间
    5. [root@master ~]# kubectl get namespaces
    6. NAME STATUS AGE
    7. default Active 39h
    8. kube-node-lease Active 39h
    9. kube-public Active 39h
    10. kube-system Active 39h
    11. work Active 11s
    run

    语法格式:kubectl run pod名称  [选项/参数]

    1. # 创建简单 Pod 资源对象
    2. [root@master ~]# kubectl -n work run myhttp --image=myos:httpd
    3. pod/myhttp created
    4. # 查询资源对象
    5. [root@master ~]# kubectl -n work get pods -o wide
    6. NAME READY STATUS RESTARTS AGE IP NODE
    7. myhttp 1/1 Running 0 3s 10.244.2.2 node-0002
    8. # 访问验证
    9. [root@master ~]# curl http://10.244.2.2
    10. Welcome to The Apache.
    describe

    语法格式:kubectl describe 资源类型 [资源名称]  [选项/参数]

    Events 下是事务日志,常用于排错

    1. # 查看资源对象的属性信息
    2. [root@master ~]# kubectl describe pod myweb
    3. Name: myweb
    4. Namespace: default
    5. Priority: 0
    6. Service Account: default
    7. Node: node-0001/192.168.1.51
    8. ... ...
    9. Events:
    10. Type Reason Age From Message
    11. ---- ------ ---- ---- -------
    12. Normal Scheduled 16m default-scheduler Successfully assigned default/myweb to node-0001
    13. Normal Pulled 16m kubelet Container image "myos:nginx" already present on machine
    14. Normal Created 16m kubelet Created container myweb
    15. Normal Started 16m kubelet Started container myweb
    16. # 查看 work 名称空间下的 pod 信息
    17. [root@master ~]# kubectl -n work describe pod myhttp
    18. Name: myhttp
    19. Namespace: work
    20. Priority: 0
    21. Service Account: default
    22. Node: node-0002/192.168.1.52
    23. ... ...
    logs

    语法格式:kubectl logs Pod名称  [选项/参数]

    1. # 访问服务,并查看日志
    2. [root@master ~]# curl http://10.244.1.3/info.php
    3. [root@master ~]# curl http://10.244.2.2/info.php
    4. ... ...
    5. # 查看 myweb 日志
    6. [root@master ~]# kubectl logs myweb
    7. 2022/11/12 18:28:54 [error] 7#0: *2 open() "/usr/local/nginx/html/info.php" failed (2: No such file or directory), client: 10.244.0.0, server: localhost, request: "GET /info.php HTTP/1.1", host: "10.244.2.12"
    8. # 查看 myhttp 日志
    9. [root@master ~]# kubectl -n work logs myhttp
    10. [root@master ~]#

    排错三兄弟

    kubectl get、kubectl describe、kubectl logs 

    4  Pod核心管理命令(二)

    子命令说明备注
    exec在某一个容器内执行特定的命令可选参数: -c 容器名称
    cp在容器和宿主机之间拷贝文件或目录可选参数: -c 容器名称
    delete删除资源对象可选参数: -l 标签
    exec

    语法格式:kubectl exec  [选项/参数]  Pod名称 --操作命令

    常用参数:-it 分配交互式终端

    1. # 在容器内执行命令
    2. [root@master ~]# kubectl exec myweb -- ls
    3. 50x.html
    4. index.html
    5. [root@master ~]# kubectl exec -it myweb -- /bin/bash
    6. [root@myweb html]# ifconfig eth0
    7. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
    8. inet 10.244.1.3 netmask 255.255.255.0 broadcast 10.244.2.255
    9. ether 3a:32:78:59:ed:25 txqueuelen 0 (Ethernet)
    10. ... ...
    cp

    语法格式:kubectl cp [选项/参数] 原文件 目标文件

    路径格式:[Pod名称:绝对路径]

    1. # 与容器进行文件或目录传输
    2. [root@master ~]# kubectl cp myweb:/etc/yum.repos.d /root/aaa
    3. tar: Removing leading `/' from member names
    4. [root@master ~]# tree /root/aaa
    5. /root/aaa
    6. ├── local.repo
    7. ├── Rocky-AppStream.repo
    8. ├── Rocky-BaseOS.repo
    9. └── Rocky-Extras.repo
    10. 0 directories, 4 files
    11. [root@master ~]# kubectl -n work cp /etc/passwd myhttp:/root/mima
    12. [root@master ~]# kubectl -n exec myweb -- ls /root/
    13. mima
    delete

    集群中所有资源均可使用 delete 命令删除

    语法格式:kubectl delete [选项/参数] 资源类型 资源名称

    1. # 删除资源对象
    2. [root@master ~]# kubectl delete pods myweb
    3. pod "myweb" deleted
    4. # 删除 work 名称空间下所有 Pod 对象
    5. [root@master ~]# kubectl -n work delete pods --all
    6. pod "myhttp" deleted
    7. # 删除名称空间
    8. [root@master ~]# kubectl delete namespaces work
    9. namespace "work" deleted

    六  资源对象文件

    1  概述

    k8s中把可以创建或配置的应用和服务称为资源对象。Kubernetes 对象是“目标性记录”,使用这些对象去表示整个集群的状态。我们在集群中创建的 Pod、负载均衡、存储、网络服务等等都是资源对象,创建 Kubernetes 对象时,必须提供资源对象的一些基本信息(例如:资源的对象的名字),以及描述描述该对象的期望状态特征(规约),如果我们在文件中使用 Yaml 的语法格式描述了上面的信息,这个文件就是资源对象文件

    为什么要使用资源对象文件?

    • 命令无法持久化,没有历史记录,不方便重现
    • 服务众多,多个容器之间有关联性,管理不方便
    • 很多高级的复杂的功能靠简单的命令方式无法实现,这些都需要使用资源文件描述

    2  作用

    可以创建、删除、变更、管理资源对象

    3  创建

    简单资源对象可以使用“kubectI”直接创建

    高级资源对象需要使用“资源对象文件”创建

    4  最简单的资源对象文件

    1. [root@master ~]# vim myweb.yaml
    2. --- # Yaml文件起始标志
    3. kind: Pod # 当前创建资源的类型
    4. apiVersion: v1 # 当前资源对应的版本
    5. metadata: # 属性信息,元数据
    6. name: myweb # 属性信息,资源的名称
    7. spec: # 资源的特定描述
    8. containers: # 容器资源的特定描述
    9. - name: webserver # 容器的名称
    10. image: myos:nginx # 启动容器使用的镜像
    11. status: {} # 资源状态,运行后自动生成

    5  静态Pod

    静态 Pod 是由 kubelet 守护进程直接管理的 Pod,不需要AP|服务器监管。与由控制面管理的 Pod 不同

    kubelet 监视每个静态 Pod(在它崩溃之后重新启动)

    静态 Pod 永远都会绑定到一个指定节点上的 Kubelet

    静态Pod的spec不能引用其他 API对象

    静态 Pod 配置路径: /var/lib/kubelet/config.yaml

    6  资源文件管理命令

    子命令说明备注
    create创建文件中定义的资源支持指令式和资源对象文件配置
    apply创建(更新)文件中定义的资源只支持资源对象文件(声明式)
    delete删除文件中定义的资源支持指令式和资源对象文件配置

    注意:删除Pod后kubelet会自动重建Pod,删除资源文件才能彻底删除Pod

    列如:rm -f /etc/kubernetes/manifests/myweb.yaml

    命令语法:kubectl  [create|apply|delete]  -f  资源文件名称.yaml

    create
    1. # 创建资源对象
    2. [root@master ~]# kubectl create -f myweb.yaml
    3. pod/myweb created
    4. # 不能更新,重复执行会报错
    5. [root@master ~]# kubectl create -f myweb.yaml
    6. Error from server (AlreadyExists): error when creating "myweb.yaml": pods "myweb" already exists
    delete
    1. # 使用资源对象文件删除
    2. [root@master ~]# kubectl delete -f myhttp.yaml
    3. pod "myhttp" deleted
    4. [root@master ~]# kubectl get pods
    5. No resources found in default namespace.
    apply
    1. # 创建资源对象
    2. [root@master ~]# kubectl apply -f myweb.yaml
    3. pod/myweb created
    4. # 更新资源对象
    5. [root@master ~]# kubectl apply -f myweb.yaml
    6. pod/myweb configured
    7. # 删除资源对象
    8. [root@master ~]# kubectl delete -f myweb.yaml
    9. pod "myweb" deleted
    10. # 拓展提高
    11. # 与 kubectl apply -f myweb.yaml 功能相同
    12. [root@master ~]# cat myweb.yaml |kubectl apply -f -

  • 相关阅读:
    Mybatis缓存
    如何正确清理DNS缓存
    获取唯一的短邀请码
    Linux常用操作 & Vim一般使用 & SSH介绍 & SSH密钥登录
    【工具】新手如何正确使用Pycharm?
    spring框架限制接口是否要登录过才能访问
    力扣大厂热门面试算法题 21-23
    基于分组码的消息验证码的程序实现
    PHP基础笔记-NO.1
    [Unity3d] 网络开发基础【个人复习笔记/有不足之处欢迎斧正/侵删】
  • 原文地址:https://blog.csdn.net/2301_79227925/article/details/132635286