1、初步掌握

kubernetes

参考文档:

https://www.kubernetes.org.cn/7315.html

https://zhuanlan.zhihu.com/p/410371256

最终完成搭建参考文档: https://zhuanlan.zhihu.com/p/410371256

问题解决:

只能通过部署pod的node节点+端口号,才能访问,并且clusterIP无法访问

# 解决方案
"""
三台服务器都配置了三条规则
iptables -t nat -A OUTPUT -d 10.0.4.8 -j DNAT --to-destination 101.35.241.220
iptables -t nat -A OUTPUT -d 10.0.4.16 -j DNAT --to-destination 150.158.153.179
iptables -t nat -A OUTPUT -d 10.0.8.15 -j DNAT --to-destination 42.194.147.234

在每一个节点上,都执行这三条规则
# 最终执行一下
iptables -P FORWARD ACCEPT
"""

知识图谱

核心概念

  • Pod
  • Controller
  • Service
  • Ingress

RABC Helm Yaml 持久化存储

K8S概述

  • 使用K8S进行容器化应用部署
  • 使用K8S利于应用扩展
  • K8S目标实施让部署容器化应用更加简洁和高效

K8S特性

  • 自动装箱
  • 自我修复
    • 当有一个节点挂掉,K8S将应用转移到第二节点继续执行,并且只有第二节点各项都启动成功才会对外服务,
  • 水平扩展
    • 增加或减少部署的节点
  • 负载均衡
  • 滚动更新
    • 增加三个节点,会一个一个对节点进行检测,然后才会对外服务
  • 版本更新
    • 回滚等
  • 密钥配置
  • 存储编排
  • 批处理

K8S集群架构组件

  • master(主控节点) 和 node(工作节点)
  • controller-manager:假如需要部署一个订单应用,通过scheudler找到node节点进行部署, 此时controller-manager会创建一个controller对应订单应用,并进行一对一的管理。此时在来一个购物车应用,同样也会新建一个controller对购物车应用进行一对一管理
  • kubelet:master 派遣到 node节点的代表,监控node节点的状态,并进行管理
  • kube-proxy:实现网络代理,负载均衡

搭建集群方式

  • kubeadm
  • 二进制包

kubernetes集群命令行工具kubectl

1、kubectl概述

kubectlkubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署

2、kubectl命令的语法
kubectl [command] [TYPE] [NAME] [flags]
  • command:指定要对资源执行的操作,列如create、get、describe 和 delete

  • TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的形式。列如:

    kubectl get pod pod1
    kubectl get pods pod1
    kubectl get po pod1
    
  • NAME:指定资源的名称,名称也大小写敏感,如果省略名称,则会显示所有的资源

    kubectl get pods
    
  • flags:指定可选的参数,列如,可用 -s 或者 -server参数指定kubectl API server的地址和端口

  1. kubectl help获取更多信息

    kubectl --help
    kubectl get --help
    
  2. kubectl 子命令使用分类(command)

    1. 基本命令

      1. 基本命令 create 通过文件名或标准输入创建资源
        expose 将一个资源公开为一个新的service
        run 在集群中运行一个特定的镜像
        set 在对象上设置特定的功能
        get 显示一个或多个资源
        explain 文档参考资料
        edit 使用默认的编辑器编辑一个资源
        delete 通过文件名、标准输入、资源名称或标签选择器来删除资源
    2. 部署和集群管理命令

      1. 部署命令 rollout 管理资源的发布
        rolling-update 对给定的复制控制器滚动更新
        scale 扩容或缩容pod数量,Development、ReplicaSet、RC或Job
        autoscale 创建一个自定选择扩容或缩容并设置pod数量
        集群管理命令 certificate 修改证书资源
        cluster-info 显示集群信息
        top 显示资源(CPU/Memory/Storage)使用,需要Heapster运行
        cordon 标记节点不可调度
        uncordon 标记节点可调度
        drain 驱逐节点上的应用,准备下线维护
        taint 修改节点taint标记
      2. 故障诊断和调试命令

        1. 故障诊断和调试命令 describe 显示特定资源或资源组的详细信息
          logs 在一个pod中打印一个容器日志,如果pod只有一个容器,容器名称是可选的
          attach 附加到一个运行的容器
          exec 执行命令到容器
          port-torward 转发一个或多个本地端口到一个pod
          proxy 运行一个proxy到kubernetes API server
          cp 拷贝文件或目录到容器中
          auth 检查授权
      3. 其他命令

        1. 高级命令 apply 通过文件名或标准输入对资源应用配置
          patch 使用补丁修改、更新资源的字段
          replace 通过文件名或标准输入替换一个资源
          convert 不同的API版本之间转换配置文件
          设置命令 label 更新资源上的标签
          annotate 更新资源上的注释
          completion 用于实现kubectl工具自动补全
          其他命令 api-versions 打印收支持的API版本
          config 修改kubeconfig文件(用于访问API,比如配置认证信息)
          help 所有命令帮助
          plugin 运行 一个命令行插件
          version 打印客户端和服务版本信息

YAML文件概述

k8s集群中对资源管理和资源对象编排部署都可以通过样式(YAML)文件来解决,

YAML文件书写格式
  1. YAML介绍

    1. 标记语言,以数据为中心,可读性高,变大数据序列的格式
  2. YAML基本语法

    1. 使用空格作为缩进
    2. 缩进的空格数目不重要,只有相同层级的元素左侧对齐即可
    3. 低版本缩进时不允许使用Tab键,只允许使用空格
    4. 使用 # 标识注释,从这个字符一直到行尾,都会被解释器忽略
    5. 使用 --- 表示 新的yaml文件开始
  3. yaml文件组成部分

    1. 控制器定义(到template之前)
    2. 被控制对象(template之后)

如何快速编写yaml文件
  1. 使用kubectl create 命令快速生成yaml文件,在进行修改(适用于为部署的项目)

    1. kubectl create deployment web --image=nginx -o yaml --dry-run > m1.yaml
      
      """
      参数详解
      --image=nginx:指定一个镜像
      -o yaml:不真正创建一个资源而是生成一个yaml文件
      --dry-run:尝试运行,不是真的执行
      > m1.yaml:输出生成的yaml
      """
      
  2. 使用kubectl get 命令导出yaml文件(适用于已经部署好的项目)

  3. kubectl get deploy
    #  显示deploy资源
    kubectl get deploy nginx -o=yaml [--export] > m2.yaml
    # 将相关内容导出为yaml文件
    

Pod概述

基本概念
  1. 最小的部署单元
  2. k8s不是直接处理容器,而是处理pod。pod由一个或多个container组成,
  3. 一个pod中的容器共享网络命名空间
  4. pod是短暂的(重启ip就会变化)
pod的意义
  1. 创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程序
  2. Pod是多进程设计,可以运行多个容器
    1. 一个pod有多个容器,一个容器里面运行一个应用程序
  3. Pod存在 为了亲密性应用
    1. 两个应用之间进行交互
    2. 网络之间进行调用
    3. 两个应用需要频繁调用
Pod实现机制
  1. 共享网络
    1. 容器存在于同一个namespace下面
    2. 通过Pause容器,把其他业务容器加入到Pause容器里面,让所有的容器在同一个命名空间中,实现网络共享
  2. 共享存储
    1. 引入数据卷(volumn),使用数据卷进行持久化存储
镜像拉取策略

Pod资源限制
# 创建一个deployment
# mysql-deploy.yaml
apiVersion: apps/v1  #API版本
kind: Deployment  # 副本控制器RC
metadata:
  labels:  # 标签
    app: mysql
  name: mysql  # 对象名称,全局唯一
spec:
  replicas: 1  # 预期的副本数量
  selector:
    matchLabels:
      app: mysql
  template:  # pod模板
    metadata:
      labels:
        app: mysql
    spec:
      containers:  # 定义容器
      - image: mysql:5.7
        name: mysql
        ports:
        - containerPort: 3306  # 容器应用监听的端口号
        env:                   # 注入容器中的环境变量
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

# 创建pod
kubectl apply -f mysql-deploy.yaml

# 查看刚刚创建的deployment
kubectl get deploy

# 查看pod的创建情况
kubectl get pods

# 创建一个与pods关联的service
# mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
    
    
    
# 创建service
"""
metadata.name: Service对外的服务名
spec.ports: 虚端口
spec.selector: 确定了哪些Pod副本(实例)对应本服务
"""

kubectl create -f mysql-svc.yaml

# 查看刚刚创建的Service对象
kubectl get svc [mysql]

posted @ 2023-03-11 23:06  暮歌行  阅读(7)  评论(0编辑  收藏  举报