K8s Docker的Good选择

引子:在现代开发当中,整体式的应用早已成为过去时,如今的应用由数十乃至数百个松散结合的容器式组件构成,而这些组件需要通过相互间的协同合作,才能使既定的应用按照设计运作。容器编排是指对单独组件和应用层的工作进行组织的流程。

而容器编排会遇到如下的问题:

  • 一个容器故障停机了,怎么让另外一个容器立刻启动去替补停机的容器
  • 当并发访问量变大的时候,怎么样做到横向扩展的容器数量

为解决这些容器编排问题,,产生了伊西俄容器编排的软件。K8S就是google开源的容器编排工具。

K8S简介:

kubernetes,是一个全新的基于容器技术的分布式架构领先方法,其本质是一组服务器集群,可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。

k8s的功能:

  • 自我修复: 一旦某个docker崩溃,会在1s之内启动新docker顶替崩溃的docker
  • 弹性伸缩: 根据需要,自动对集群中的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务器启动了多个容器,能自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,立即回退到原来的版本
  • 存储编排:根据容器自身的需求自动创建存储卷

K8s组件:

一个k8s集群主要是由控制节点与工作节点构成,每个节点上安装不同的组件。

  • 控制节点:又叫做master节点,主要负责集群的决策:

    APIServer: 资源操作的唯一入口,接受用户输入的命令,进行认证与访问控制等
    Scheduler: 负责集群资源调度, 按照预定的调度策略将Pod调度到相应的node节点上
    ControllerManager: 负责维护集群的状态,比如程序部署安排,故障检测,自动扩展,滚动更新等
    Etcd: 负责存储集群中各种资源对象的信息,主要是存储相应功能的容器的地址啥的方便发命令
    

  • node: 集群的数据平面, 负责为容器提供运行环境

    Kubelet: 负责维护容器的生命周期,来更新,创建,销毁docker
    KubeProxy: 负责提供集群内部的服务发现于负载均衡
    Docker: 负责节点上的容器操作
    

    一个部署nginx的例子:

    1. k8s环境启动之后, master和node都将自身的信息存放到etcd
    2. 一个nginx服务的安装请求首先发送到master节点和apiServer组件
    3. apiServer组件会调用Scheduler组件决定到底把服务安排在哪个node节点上
    4. apiServer在调用controller-manager去调度node节点安装nginx服务
    5. kublet接收到指令之后,通知docker, 由docker来启动一个nginx的pod(pod是k8s的最小操作单元,容器必须在pod中)
    6. nginx安装完成了,访问nginx经过kube-pro的负载均衡产生对pod中的container的代理,这样外界就可以访问集群中的nginx服务了

    K8S集群环境

    K8S的集群大体上分为两类:一主多从与多主多从。

    • 一主多从: 存在单机故障风险,搭建简单,适用于测试环境
    • 多主多从: 搭建麻烦,安全性高,适用于生产环境

    安装: 有三种安装方式:minkube(快速单间单节点k8s的工具), kubeadm快速搭建k8s集群的工具, 二进制包(从官网一个一个下,比较麻烦但是理解的更深刻)

    本教程本来是打算跟着kubeadm安装的,但是导致自己踩坑的时候报废了两个Ubuntu20.04 系统。真的无语住了,

    咱就是说坑踩多了就老老实实的跟着教程走:

    1. 关闭swap, 关闭防火墙(ufw), 写入主机名, 设置时戳:

      (Tips: swap 指允许我们使用虚存, 必须禁用放置性能抖动。主要是k8s这么要求的)

      sudo nano /etc/hosts      # 设置主机名
      sudo ufw disable            # 关闭防火墙
      sudo nano /etc/fstab        # 关闭swap
      sudo timedatectl set-timezone Asia/Shanghai     # 设置时间戳保持相同# 关于为什么centos需要关闭selinux而ubuntu不需要,,兄弟你确定你装selinux了么
      
    2. 安装docker, 按照官方文档来就行,或者https://docs.docker.com/engine/install/ubuntu/

    3. 安装kubeadm, kubectl, kubelet:

      # 更新并与允许 curl HTTPs的访问,没装过的装一下
      # sudo apt-get update && sudo apt-get install -y apt-transport-https# 去阿里云去搞一个密钥。 注,这句话只能由root运行,不也能使用sudo。畏怯一般来说都要运行这句话的
      curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -#新增源
      sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
      deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
      EOF# 更新并安装三组件: kubelet,  kubeadm,  kubectl
      sudo apt-get install -y kubelet kubeadm kubectl# 遇到的问题1:缺少依赖,缺少啥咱就安啥
      The following packages have unmet dependencies:kubelet : Depends: ebtables but it is not going to be installed
      E: Unable to correct problems, you have held broken packages.
      sudo apt-get install ebtables# 遇到问题二,版本不兼容
      kubelet : Depends: iptables (>= 1.4.21)
      E: Unable to correct problems, you have held broken packages.# 升级, 核心包版本不兼容
      apt-get upgrade iptables
      iptables : Depends: libip4tc0 (= 1.6.1-2ubuntu2) but it is not going to be installedDepends: libip6tc0 (= 1.6.1-2ubuntu2) but it is not going to be installedDepends: libiptc0 (= 1.6.1-2ubuntu2) but it is not going to be installedDepends: libxtables12 (= 1.6.1-2ubuntu2) but 1.8.4-3ubuntu2 is to be installed
      # 这里报错更高版本的包已经装过了,坑点,不要卸载这个更高版本的包(笔者的一时手欠加忘拍快照直接报废了一个系统),直接安装需要的版本的包即可,不然系统直接挂了
      apt-get install libxtables12=1.6.1-2ubuntu2
      # 之后递归向上更新即可
      apt-get upgrade iptables
      sudo apt-get install -y kubelet kubeadm kubectl
      
    4. 初始化:

      sudo kubeadm init
      root@ubuntu:~# kubeadm init
      [init] Using Kubernetes version: v1.23.5
      [preflight] Running pre-flight checks
      [preflight] Pulling images required for setting up a Kubernetes cluster
      [preflight] This might take a minute or two, depending on the speed of your internet connection
      [preflight] You can also perform this action in beforehand using 'kubeadm config images pull'#等个两三分钟,报错,原因是连不到google家的仓库超时了。明明放了镜像却一定会去Google找
      # 解决方法也很简单,科学上网或者将版本找网上国内有仓库的下载, 镜像地址咱就是说直接找这个人的https://registry.hub.docker.com/r/v5cn/kube-apiserver/tags
      #(这是教程https://blog.csdn.net/m0_44982764/article/details/118753414)看版本号:kubeadm config images list
      以我的1.23.5 版本为例,拖过来这个v5cn大佬的镜像
      set -o errexit
      set -o nounset
      set -o pipefail##这里定义版本,按照上面得到的列表自己改一下版本号KUBE_VERSION=v1.23.5
      KUBE_PAUSE_VERSION=3.6
      ETCD_VERSION=3.5.1-0
      DNS_VERSION=v1.8.6##这是原始仓库名,最后需要改名成这个
      GCR_URL=k8s.gcr.io##这里就是写你要使用的仓库
      DOCKERHUB_URL=v5cn##这里是镜像列表,新版本要把coredns改成coredns/coredns
      images=(
      kube-proxy:${KUBE_VERSION}
      kube-scheduler:${KUBE_VERSION}
      kube-controller-manager:${KUBE_VERSION}
      kube-apiserver:${KUBE_VERSION}
      pause:${KUBE_PAUSE_VERSION}
      etcd:${ETCD_VERSION}
      coredns/coredns:${DNS_VERSION}
      )##这里是拉取和改名的循环语句
      for imageName in ${images[@]} ; dodocker pull $DOCKERHUB_URL/$imageNamedocker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageNamedocker rmi $DOCKERHUB_URL/$imageNameecho $DOCKERHUB_URL/$imageName Done
      done# 但是不知道为什么,我装了这些包之后在初始化的时候还是要先访问google的那个网站,然后就还是超时。没办法,只能science online。关键点在于全局proxy (求求审核给过吧): https://v2xtls.org/v2raya%EF%BC%9A%E6%94%AF%E6%8C%81%E5%85%A8%E5%B1%80%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E7%9A%84v2ray-linux%E5%AE%A2%E6%88%B7%E7%AB%AF/# 坑2,
      curl -sSL http://localhost:10248/healthz
      curl: (7) Failed to connect to localhost port 10248: Connection refused
      #查看报错原因: journalctl -xeu kubelet / journalctl -xeu kubelet -l (参考https://blog.51cto.com/8999a/5005591)
      [302] "Failed to run kubelet" err="failed to run Kubelet: misconfiguration: ku>
      exited, status=1/FAILURE
      报错原因:是因为 k8s 和docker 的 cgroup driver 不一致导致的。k8s 的是 systemd ,而 docker 是cgroupfs。尝试:在docker daemon首选项加入:
      {
      "exec-opts": ["native.cgroupdriver=systemd"]
      }解决
      # 坑点3, 10250端口占用
      [ERROR Port-10250]: Port 10250 is in use
      sudo netstat -tunlp    # 查看端口信息
      tcp6       0      0 :::10250                :::*                    LISTEN      890/kubelet
      # 我这边是kubelet占用了,应该都是雷希德相关程序占用, kill就好了
      sudo kill 890  安装成功的标志:
      Your Kubernetes control-plane has initialized successfully!接下来就可以安装其他组件了
      

K8S 初识 +踩坑, ubuntu安装教程1相关推荐

  1. 神舟K550D三系统(win10、OSX、Ubuntu)安装教程

    神舟K550D三系统(win10.OSX.Ubuntu)安装教程 特别感谢:耐寒桃,本教程完全是借鉴他在贴吧里发的帖子的安装步骤,不过是由我总结并且实践之后,整理发到了知乎,我也是觉得这个教程非常的有 ...

  2. Ubuntu安装教程2-Ubuntu桌面版安装

    智科创玩 写在前面 1.创建 Ubuntu 20.04 LTS 可启动磁盘 2.安装 Ubuntu 20.04 LTS 桌面版 3.首次登录 Ubuntu 20.04 LTS 写在前面 苦辣酸甜时光七 ...

  3. Linux RHEL/Ubuntu安装教程

    软 件 下 载 软件下载 软件下载  RHEL 7/64位下载地址 https://pan.baidu.com/s/1ridznj3RZnRqt074TN68Og  提取码:31w2  Ubuntu ...

  4. k8s学习 踩坑之 top nodes - k8s Metrics not available for pod 报错

    最近一直在弄k8s,前面安装都要顺畅,包括K8S集群等等. k8s有个很重要的功能,就是它可以根据你服务器的压力动态扩容pod. 比如你可以预定你的pod实例是5个,当请求高峰过来的时候,pod压力过 ...

  5. 蚂蚁笔记(Leanote) ubuntu安装教程

    前言: 本教程和其他各大神略有差异.由于下载mongodb和leanote太慢,在安装mongo和leanote采用的均是自行下载压缩包加入到ubuntu的home/user1路径 安装特别说明: 工 ...

  6. [填坑]Ubuntu安装显卡专有驱动后鼠标键盘无法使用

    问题描述 我在两个地方遇到了同样的问题,解决方法也如出一辙,由于没有研究源码,暂不清楚原因. 问题1描述:为了解决Ubuntu下笔记本功耗问题,在网友建议下我安装了bumblebee,结果导致键鼠无法 ...

  7. 【Ubuntu】Ubuntu 安装教程

    一.下载 1.Ubuntu 官网 2.Ubuntu 下载 二.安装 1.创建一个虚拟机教程 2.选择语言及安装 关于语言选择,其实比较推荐选择英文,如果选择中文,安装完成后桌面.文档等文件夹的名字会成 ...

  8. Ubuntu安装教程【超多图】

    大家好,我是坚果,我的公众号"坚果前端", 文章目录 01前言 02虚拟机的安装 03Ubuntu镜像的下载 04虚拟机硬件配置 1.虚拟机安装完毕之后,界面如下图所示: 2.在弹 ...

  9. linux ubuntu安装教程6,64位Ubuntu下安装IE6步骤

    64位Ubuntu下安装IE6步骤 ies4linux下载地址: cabextract下载地址: wine1.0下载地址: cab文件及字体下载地址: simsun.ttc下载地址: adobe fl ...

最新文章

  1. 大竹中学2021高考成绩查询,四川大竹中学2021录取分数线
  2. matlab句柄函数@和C++ 中的引用 很像
  3. chrome插件网站
  4. python 版本分布式锁
  5. javascript关键字_让我们揭开JavaScript的“ new”关键字的神秘面纱
  6. React之props批量传递
  7. Python MySqlDB 增删改数据库(转载)
  8. 谷歌浏览器开发者模式
  9. 哔哩哔哩mac电脑版上线,来聊聊B站Mac版客户端初体验
  10. 由“外”向“内”,安踏破解运动科技“卡脖子”难题
  11. 识别网络计算机的方法,电脑未识别网络怎么办 电脑未识别解决方法【图文】...
  12. 贵州贵安新区试点大数据精准扶贫运营管理
  13. 斯坦福大学校工程学院计算机,加州大学洛杉矶分校:受大脑启发的计算机视觉的对象发现和检测...
  14. c#rs232与三菱通讯_C#对三菱PLC的以太网和串口通讯以及台达PLC的以太网通讯
  15. 中央气象局天气预报接口城市代码大全
  16. 野生程序员的成长之路(上)--编码员还是工程师?
  17. 【深度学习】入门理解ResNet和他的小姨子们(一)---ResNet
  18. String 类能不能被继承?为什么?
  19. 【机械臂】机械臂快速入门
  20. 圣诞节,我们要将改变未来的礼物献给你

热门文章

  1. mac 触控板 右键
  2. 一本通提高篇 AC自动机
  3. Jmeter设置测试报告自动带上时间
  4. Windows 7 无法登陆网银
  5. nginx配置文件被删怎么找回_隔行如隔山之nginx服务器删除文件
  6. 【程序设计】CSV必知必会
  7. log nginx 客户端请求大小_Nginx日志分析和参数详解
  8. 【面经】2022年软件测试面试题总结(附答案)
  9. 网络摄像机与传统模拟摄像机的差别
  10. word文件做一半未响应_Win7的word为什么老是出现未响应?