目录


1. 概述

  • 参考资料:
    参考:
  1. Kubernetes Doc(官方)
  2. Kubernetes学习笔记 – 很丰富
    注:
    1. 官方文档写的很详尽;
    
  • 容器管理工具

    • docker
    • pouch
  • 容器编排工具:

    • docker三剑客
      1. docker machine
      2. docker compose
      3. docker swarm
    • mesos + marathon
      1. mesos 主要作用是在分布式计算过程中, 对计算机资源进行管理和分配;
    • Kebernetes

1.1. 是什么

参考:

  1. Doc: What is Kubernetes?
  • 官方介绍:

    Kubernetes is a portable, extensible, open-source platform for
        managing containerized workloads and services, that facilitates both
        declarative configuration and automation. It has a large,
        rapidly growing ecosystem. Kubernetes services, support,
        and tools are widely available.
    
  • 提供的服务:

    服务发现和负载均衡
        Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,
        如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
    
    存储编排
        Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
    
    自动部署和回滚
        你可以使用 Kubernetes 描述已部署容器的所需状态,
        它可以以受控的速率将实际状态 更改为期望状态。
        例如,你可以自动化 Kubernetes 来为你的部署创建新容器,
        删除现有容器并将它们的所有资源用于新容器。
    
    自动完成装箱计算
        Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。
        当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
    
    自我修复
        Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,
        并且在准备好服务之前不将其通告给客户端。
    
    密钥与配置管理
        Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。
        你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
    
  • Node及Pod支持:

    1. 可管理节点数: 2000
    2. 可管理Pod数: 150000

1.2. 为什么

  • 为什么使用kubernetes?
    1. 容器是打包和运行应用程序的好方式。
    2. Kubernetes 为你提供了一个可弹性运行分布式系统的框架
      1. Kubernetes 会满足你的扩展要求、故障转移、部署模式等。
      2. 例如,Kubernetes 可以轻松管理系统的 Canary 部署。

1.3. 其他

  • YAML
    在k8s中,一般使用YAML格式的文件来创建符合我们预期期望的pod,这样的YAML文件称为资源清单

2. K8S架构


2.1. 应用部署架构分类:

  • 无中心节点架构

    • GlusterFS
  • 有中心节点架构

    • HDFS
    • K8S

2.2. K8S架构

  • K8S架构:
    K8S架构

2.3. 组件基本功能

  • 组件:
    == Kubeadm ==
        Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令来快速创建 kubernetes 集群。
        kubeadm 通过执行必要的操作来启动和运行最小可用集群。按照设计,它只关注启动引导,而非配置机器。
            同样的, 安装各种 “锦上添花” 的扩展,例如 Kubernetes Dashboard、 监控方案、以及特定云平台的扩展;
    

3. 环境搭建


3.1. 环境准备

  • 环境预先设置

    1. 配置 主机IP地址 网关配置
        vim /etc/sysconfig/network-scripts/ifcfg-ens33
    2. 主机名称解析
        cat /etc/host
            ip地址        主机名
            192.168.0.130 k8s-master1
            192.168.0.131 k8s-worker1
            192.168.0.132 k8s-worker2
    3. 主机安全设置
        1. 关闭防火墙
            systemctl stop firewalld
            systemctl disable firewalld
            or   systemctl disable --now firewalld
            // 检查是否运行
                firewall-cmd --state
                systemctl status firewalld
        2. SELINUX配置
            cat /etc/selinux/config
            sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
            修改完成后重启;
            getenforce  查看修改是否成功
    4. 主机时间同步
        yum -y install ntpdate
        crontab -e
            0 */1 * * * ntpdate time1.aliyun.com  //添加到文件中; 每个一个小时同步一次
        // 设置时区为上海
            timedatectl set-timezone Asia/Shanghai 
    5. 永远关闭swap分区
        vim /etc/fstab
        注释掉, 保存退出
            # UUID=7bc09e06-b102-4089-a642-5b25087297ca swap    swap    defaults        0 0
        重启后, free -m 查看是否含有 swap 分区;
            Swap:             0           0           0
    6. 添加网桥过滤:
       1. 添加网桥过滤及地址转发
            cat /etc/sysctl.d/k8s.conf
                net.bridge.bridge-nf-call-ip6tables = 1
                net.bridge.bridge-nf-call-iptables = 1
                net.ipv4.ip_forward = 1
                vm.swappiness = 0
        2. 加载 br_netfilter 模块
            [root@k8s-worker2 ~]# modprobe br_netfilter
            [root@k8s-worker2 ~]# lsmod | grep br_netfilter
            br_netfilter           22256  0
            bridge                151336  1 br_netfilter
        3. 加载网桥过滤配置文件
            sysctl -p /etc/sysctl.d/k8s.conf
    7. 开启ipvs
        1. 安装 ipset 及 ipvsadm
            yum -y install ipset ipvsadm
        2. 在所有节点执行以下脚本:
            cat > /etc/sysconfig/modules/ipvs.modules <<EOF
            #!/bin/bash
            modprobe -- ip_vs
            modprobe -- ip_vs_rr
            modprobe -- ip_vs_wrr
            modprobe -- ip_vs_sh
            modprobe -- nf_conntrack_ipv4
            EOF
        3. 授权 运行 检查是否加载
            chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod |grep -e ip_vs -e nf_conntrack_ipv4
        4. 检查是否加载
            lsmod |grep -e ip_vs -e nf_conntrack_ipv4
    
  • manager worker节点 安装指定版本的docker

    1. YUM源配置
        # 建议使用清华镜像, 官方下载慢
            wget -o /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
    
    2. 查看docker-ce版本
        # 查看版本并排序
            yum list docker-ce.x86_64 --showduplicates|sort -r
    3. 安装指定版本的docker-ce
        # 此版本不需要修改服务启动文件及 iptables 默认规则
            yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7
    4. 启动docker
        systemctl enable docker
        systemctl start  docker
    
    注: 配置docker 国内yum源
        # 安装必要依赖
            yum install -y yum-utils device-mapper-persistent-data lvm2
        # 添加aliyun docker-ce yum源
            yum -y install yum-utils
            yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo       # 阿里云
        # 重建yum缓存
        yum makecache fast
    
    5. 修改 docker-ce 服务配置文件
        cat /usr/lib/systemd/system/docker.service
            [Service]
            Type=notify
            # the default is not to use systemd for cgroups because the delegate issues still
            # exists and systemd currently does not support the cgroup feature set required
            # for containers run by docker
            ExecStart=/usr/bin/dockerd    # 若原文件此行后面有 -H 选项, 请删除 -H(含)后面所有的内容
            ExecReload=/bin/kill -s HUP $MAINPID
    6. 控制docker行为
        cat  /etc/docker/daemon.json
        # 添加以下内容: 
            {
                "exec-opts": ["native.cgroupdriver=systemd"]
            }
    
    

    备注:

    1. 后续集群搭建见: 集群搭建: 一主两从

参考:

  1. B站: 黑马程序员Kubernetes(K8S)超快速入门教程

3.2. 搭建单机环境


3.3. 集群搭建


3.3.1. 一主两从

  • 前期准备:
    在3台服务器上, 安装指定版本的docker-ce,
    1 master;
    2 worker

后续步骤:

  • 1. 部署软件及配置

    1. 软件版本及yum源
      20210816220849

      yum源:

      # aliyun yum源
      # 添加 k8s.repo
          [kubernetes]
          name=Kubernetes
          baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
          enabled=1
          gpgcheck=0
          repo_gpgcheck=0
          gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
              http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      
    2. 安装软件

      # 查看镜像中最新版本
          yum list kubeadm | sort -r
      #指定版本否则都会默认安装库中最新版本,会因为彼此依赖的版本不同安装失败,版本一定要选择好
          yum -y install --setopt=obsoletes=0 kubelet-1.17.2-0 kubeadm-1.17.2-0 kubectl-1.17.2-0 
      
      # kubernetes-cni-0.6.0
      #设置开机启动并启动kubelet
          systemctl enable kubelet && systemctl start kubelet
      
    3. 软件配置
      主要配置 kubelet, 不配置坑导致集群无法启动;

      # 为实现 docker使用的 cgroupdriver 与 kubelet 使用的cgroup的一致性, 建议修改以下内容: 
          vim /etc/sysconfig/kubelet
          KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"  # 添加该内容
      
      # 开机启动 kubelet
          systemctl  enable  kubelet
      
  • 2. k8s集群容器镜像准备:

    由于 使用kubernetes部署集群, 集群所有核心组件均以Pod运行, 需要为 主机准备
        镜像, 不同角色主机准备不同的镜像;
    建议科学上网下载镜像;
    
    1. Master主机镜像
      # 查看集群使用的 容器镜像
          [root@k8s-master1 ~]# kubeadm config images list
          k8s.gcr.io/kube-apiserver:v1.17.2
          k8s.gcr.io/kube-controller-manager:v1.17.2
          k8s.gcr.io/kube-scheduler:v1.17.2
          k8s.gcr.io/kube-proxy:v1.17.2
          k8s.gcr.io/pause:3.1
          k8s.gcr.io/etcd:3.4.3-0
          k8s.gcr.io/coredns:1.6.5
      
    2. 下载Master主机镜像
      # 导出到文件
          kubeadm config images list >> k8s-image.list
      # 编写镜像下载脚本
          #!/bin/bash
          img_list='k8s.gcr.io/kube-apiserver:v1.17.2
          k8s.gcr.io/kube-controller-manager:v1.17.2
          k8s.gcr.io/kube-scheduler:v1.17.2
          k8s.gcr.io/kube-proxy:v1.17.2
          k8s.gcr.io/pause:3.1
          k8s.gcr.io/etcd:3.4.3-0
          k8s.gcr.io/coredns:1.6.5'
      
          for img in ${img_list}
          do 
              docker pull $img
          done
      # 没有科学上网:
          #!/bin/bash
          img_list='kube-apiserver:v1.17.2
          kube-controller-manager:v1.17.2
          kube-scheduler:v1.17.2
          kube-proxy:v1.17.2
          pause:3.1
          etcd:3.4.3-0
          coredns:1.6.5'
      
          for img in ${img_list}
          do 
              echo "docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$img"
              echo "docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${img}  k8s.gcr.io/$img"
              echo "docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$img"
              docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$img
              docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${img}    k8s.gcr.io/$img
              docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$img
          done
      
          # 参考: https://blog.csdn.net/mcpYES/article/details/112793229
      
    3. Worker主机镜像
      # 可以从 Master 中获取镜像 
          [root@k8s-worker2 k8s-images]# docker images
          REPOSITORY              TAG         IMAGE ID       CREATED         SIZE
          k8s.gcr.io/kube-proxy   v1.17.2     cba2a99699bd   19 months ago   116MB
          k8s.gcr.io/pause        3.1         da86e6ba6ca1   3 years ago     742kB
      
      # 将两个文件保存为 tar, 拷贝到 Worker节点 并 加载到镜像;
          docker save -o kube-p.tar k8s.gcr.io/kube-proxy:v1.17.2
          docker save -o pause.tar k8s.gcr.io/pause:3.1
      # Worker节点加载tar包:
          docker load -i kube-p.tar
          docker load -i pause.tar
      
      
  • 3. k8s集群初始化:
    在哪台主机操作, 哪台就是Master节点; --> 在Master主机操作;

    1. 主机初始化
        kubeadm init --kubernetes-version=v1.17.2 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.130
    
    2. 准备集群文件
        [root@master1 ~]# mkdir .kube 
        [root@master1 ~]# cp /etc/kubernetes/admin.conf ./.kube/config 
        [root@master1 ~]# chown $(id -u):$(id -g) .kube/config
    
    3. 网络插件使用
        安装 calico 或 
        kubectl apply -f calico.yml
    4. 添加工作节点到集群
        kubeadm join            // 初始化时得到的命令
    
  • 4. 验证集群是否可用:

    1. 查看节点状态 
        kubectl get nodes
    2. 查看集群健康状态
        kubectl get cs 
        kubectl cluster-info
    3. 查看 pod 状态
        kubectl get pods --namespace kube-system
    
    

4. 学习思路


4.1. 急速入门

  • 思路:
    20210819095834

参考:

  1. 黑马程序员: Kubernetes(K8S)超快速入门教程

4.2. 深入学习

  • 思路:
    20210819095915

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐