"一 开篇 上一篇文章我讲解了[链接],经过研读 docker 与 k8s 的官方网站,现在就开始做 Kubenetes 集群的搭建。 二 目标 1)搭建 1 主 2 从的 k8s 集群 2)k8s 集群利用外部的 etcd 集群作为数据存储与服务发现 搭建集群,就要基于实际的业务情况判断集群规模以及可用性,1 主 2 .."

Centos7 部署 Kubenetes 集群

一 开篇
    上一篇文章我讲解了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 官方文档

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:PipeSoloSymWide 等,欢迎大家加入,贡献开源。

    2094 引用 • 3641 回帖 • 619 关注
  • Kubenetes
    1 引用
  • Kubernetes

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

    27 引用 • 19 回帖 • 2 关注
  • 集群
    22 引用 • 41 回帖
回帖   
请输入回帖内容...