Centos7 部署 Kubenetes 集群

本贴最后更新于 1911 天前,其中的信息可能已经时移世异

一 开篇
    上一篇文章我讲解了etcd 集群的部署,经过研读 docker 与 k8s 的官方网站,现在就开始做 Kubenetes 集群的搭建。
二 目标
    1)搭建 1 主 2 从的 k8s 集群
    2)k8s 集群利用外部的 etcd 集群作为数据存储与服务发现
    搭建集群,就要基于实际的业务情况判断集群规模以及可用性,1 主 2 从适用于小规模集群,主节点主要用于调度以及下发配置等,且数据中心依赖于外部 etcd 的集群,有一定的可用性,如果集群规模较大且容器容纳的微服务较多,请考虑多主多从的高可用方案
    3)k8s 集群使用 flannel 作为 pod network
    kubenetes 提供了 Calico、Canal、Cilium、Flannel、Kube-router、Romana、JuniperContrail/TungstenFabric 这些方案,Flannel 虽然不是这些方案中性能最优的,但它是适用场景最多的,各自的优缺点请大家自行 google,这里不做过多的介绍
    4)kube-proxy 使用 ipvs 模式
    为什么用 ipvs 模式,而不用 iptables,官方描述的不同点如下,本人在此不做翻译,不同之处没说太多,ipvs 的优点倒是通篇体现,有一种谁用谁知道的感觉再此,so...
    1. IPVS provides better scalability and performance for large clusters.
    2. IPVS supports more sophisticated load balancing algorithms than iptables (least load, least connections, locality, weighted, etc.).
    3. IPVS supports server health checking and connection retries, etc.
    kubenetes 基于 ipvs 的链接菌再此,有兴趣的请看点我
三 环境介绍
    三台云主机,系统环境均为 Centos7,3 点节点已部署好 etcd 集群,本文 etcd 集群跟 k8s 集群在相同的节点上,实际的生产环境中建议大家另行找 3 台 2 核 8g 内存的云主机部署 etcd 集群,名称及 IP 地址如下:
    app1:192.168.16.5
    app2:192.168.16.6
    app3:192.168.16.102
四 集群部署
    4.1 部署社区版 docker(全部节点执行)
        4.1.1 卸载历史版本

   $ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

        4.1.2 安装必须依赖包

   $ sudo yum install -y yum-utils \
     device-mapper-persistent-data \
     lvm2

        4.1.3 添加安装包的仓库

   $ sudo yum-config-manager \
      --add-repo \
      https://download.docker.com/linux/centos/docker-ce.repo

        4.1.4 查看可安装的版本
        yum list docker-ce --showduplicates | sort -r
        4.1.5 这里安装的是 docker-ce-18.03.0.ce 版本的 docker,如果不选择版本,默认安装最新版本的
        sudo yum install docker-ce-18.03.0.ce
        4.1.6 启动 docker 服务
        sudo systemctl start docker
    4.2 部署 k8s(全部节点执行)
        4.2.1 添加 k8s 的仓库

   cat <<EOF > /etc/yum.repos.d/kubernetes.repo
   [kubernetes]
   name=Kubernetes
   baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
   enabled=1
   gpgcheck=1
   repo_gpgcheck=1
   gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg  https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
   exclude=kube*
   EOF

        ※如若不能翻墙的话,请把 google 的镜像改为阿里云的,没标出的部分不修改

    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

        4.2.2 关闭 selinux

   setenforce 0
   sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

        4.2.3 设置 iptables&生效

   cat <<EOF >  /etc/sysctl.d/k8s.conf
   net.bridge.bridge-nf-call-ip6tables = 1
   net.bridge.bridge-nf-call-iptables = 1
   EOF
   sysctl --system

        4.2.4 安装&启动服务
        yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
        systemctl enable kubelet && systemctl start kubelet
    4.3 加载 ipvs 模块
        4.3.1 确认是否开启

   cut -f1 -d " "  /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4

        4.3.2 开启 ipvs 模块
        如果 4.3.1 的结果不包括以下几项:
            ip_vs
            ip_vs_rr
            ip_vs_wrr
            ip_vs_sh
            nf_conntrack_ipv4
        请执行以下操作后再执行 4.3.1 进行确认

     modprobe -- ip_vs
     modprobe -- ip_vs_rr
     modprobe -- ip_vs_wrr
     modprobe -- ip_vs_sh
     modprobe -- nf_conntrack_ipv4

        4.3.3 ipvs 模块无法开启的情况请确认内核是否满足 k8s 的最低版本需求。版本等需求点这里
    4.4 利用 kubeadm 配置集群
        4.4.1 设备 docker 的翻墙代理(全节点执行,配置集群的所需镜像需翻墙才能下载,如不能翻墙请自行把镜像下载的各自节点的仓库中去)

   mkdir -p /etc/systemd/system/docker.service.d
   cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf
   [Service]
   Environment="HTTP_PROXY=http://ip:port/"
   EOF

        4.4.2 书写初期化文件 init.yaml

   apiVersion: kubeadm.k8s.io/v1beta1
   kind: ClusterConfiguration
   kubernetesVersion: v1.13.1
   #使用外部etcd集群,如果不使用则在master节点启动一个etcd的pod作为数据中心
   etcd:
    external:
     endpoints:
     - http://192.168.16.5:2379
     - http://192.168.16.6:2379
     - http://192.168.16.102:2379
   #设置flannel网络
   networking:
    podSubnet: 10.244.0.0/16
   ---
   #设置kube-proxy的模式为ipvs,默认iptables
   apiVersion: kubeproxy.config.k8s.io/v1alpha1
   kind: KubeProxyConfiguration
   mode: ipvs

        4.4.3 创建 master,本文以 app1 作为 master,当前系统用户为非 root 用户
        sudo kubeadm init --config init.yaml
        4.4.4 设置当前用户可以使用集群

   mkdir -p $HOME/.kube
   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
   sudo chown $(id -u):$(id -g) $HOME/.kube/config

        4.4.5 启用 flannel 网络

   kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml

        4.4.6 加入 worker 节点
        app2 跟 app3 节点分别执行,token,ip,port,hash 等信息从 mater 初期化好的日志中寻找,如果找不到请参照这里
        kubeadm join --token : --discovery-token-ca-cert-hash sha256:
五 集群确认
    5.1 确认节点信息
    kubectl get nodes

 NAME   STATUS   ROLES    AGE     VERSION
 app1   Ready    master   4h49m   v1.13.1
 app2   Ready    <none>   4h43m   v1.13.1
 app3   Ready    <none>   4h43m   v1.13.1

    5.2 确认 flannel 网络
    kubectl get pods -n kube-system

 NAME                           READY   STATUS    RESTARTS   AGE
 coredns-86c58d9df4-b475b       1/1     Running   0          4h50m
 coredns-86c58d9df4-kxlwk       1/1     Running   0          4h50m
 kube-apiserver-app1            1/1     Running   0          4h50m
 kube-controller-manager-app1   1/1     Running   0          4h49m
 kube-flannel-ds-amd64-6hw7r    1/1     Running   0          4h45m
 kube-flannel-ds-amd64-mqczn    1/1     Running   0          4h44m
 kube-flannel-ds-amd64-zsp9n    1/1     Running   0          4h50m
 kube-proxy-8krlq               1/1     Running   0          4h50m
 kube-proxy-cnwfx               1/1     Running   0          4h44m
 kube-proxy-vdfw9               1/1     Running   0          4h45m
 kube-scheduler-app1            1/1     Running   0          4h50m

    5.3 确认 kube-proxy 为 ipvs 模式(日志包含 server_others.go:189] Using ipvs Proxier.的字样即可)
    kubectl logs kube-proxy-8krlq -n kube-system

 I0108 12:27:37.199116       1 server_others.go:189] Using ipvs Proxier.
 W0108 12:27:37.199434       1 proxier.go:365] IPVS scheduler not specified, use rr by  default
 I0108 12:27:37.199576       1 server_others.go:216] Tearing down inactive rules.
 I0108 12:27:37.245958       1 server.go:464] Version: v1.13.1
 I0108 12:27:37.255926       1 conntrack.go:52] Setting nf_conntrack_max to 262144
 I0108 12:27:37.256226       1 config.go:202] Starting service config controller
 I0108 12:27:37.256277       1 controller_utils.go:1027] Waiting for caches to sync for service config controller
 I0108 12:27:37.256347       1 config.go:102] Starting endpoints config controller
 I0108 12:27:37.256373       1 controller_utils.go:1027] Waiting for caches to sync for endpoints config controller
 I0108 12:27:37.356479       1 controller_utils.go:1034] Caches are synced for service config controller
 I0108 12:27:37.356502       1 controller_utils.go:1034] Caches are synced for endpoints config controller

六 参考文档
    6.1 docker 官方文档
    6.2 k8s 官方文档

  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖 • 1 关注
  • 集群
    29 引用 • 65 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 43 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 53 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 22 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • abitmean

    有点意思就行了

    21 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 512 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    535 引用 • 672 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    169 引用 • 799 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 493 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 319 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 201 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 473 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    185 引用 • 318 回帖 • 348 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 7 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    172 引用 • 990 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    163 引用 • 1450 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 692 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    161 引用 • 473 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 405 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 525 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 265 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 6 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注