zoukankan      html  css  js  c++  java
  • 阿里云ECS自建K8S集群

    阿里云ECS自建K8S集群

     

    一、概述(官方建议)

     
    集群规划
    目前在创建Kubernetes集群时,存在着使用很多小规格ECS的现象,这样做有以下弊端:
    小规格Woker ECS的网络资源受限。
    如果一个容器基本可以占用一个小规格ECS,此ECS的剩余资源就无法利用(构建新的容器或者是恢复失败的容器),在小规格ECS较多的情况下,存在资源浪费。
    使用大规格ECS的优势:
    网络带宽大,对于大带宽类的应用,资源利用率高。
    容器在一台ECS内建立通信的比例增大,减少网络传输。
    拉取镜像的效率更高。因为镜像只需要拉取一次就可以被多个容器使用。而对于小规格的ECS拉取镜像的次数就会增多,若需要联动ECS伸缩集群,则需要花费更多的时间,反而达不到立即响应的目的。

    选择Master节点规格

    通过容器服务创建的Kubernetes集群,Master节点上运行着etcd、kube-apiserver、kube-controller等核心组件,对于Kubernetes集群的稳定性有着至关重要的影响,对于生产环境的集群,必须慎重选择Master规格。Master规格跟集群规模有关,集群规模越大,所需要的Master规格也越高。
    说明 您可从多个角度衡量集群规模,例如节点数量、Pod数量、部署频率、访问量。这里简单的认为集群规模就是集群里的节点数量。
    对于常见的集群规模,可以参见如下的方式选择Master节点的规格(对于测试环境,规格可以小一些。下面的选择能尽量保证Master负载维持在一个较低的水平上)。
    节点规模
    Master规格
    1~5个节点
    4核8 GB(不建议2核4 GB)
    6~20个节点
    4核16 GB
    21~100个节点
    8核32 GB
    100~200个节点
    16核64 GB

    选择Worker节点规格

    ECS规格要求:CPU大于等于4核,且内存大于等于8 GiB。
    确定整个集群的日常使用的总核数以及可用度的容忍度。
    例如:集群总的核数有160核,可以容忍10%的错误。那么最小选择10台16核ECS,并且高峰运行的负荷不要超过160*90%=144核。如果容忍度是20%,那么最小选择5台32核ECS,并且高峰运行的负荷不要超过160*80%=128核。这样就算有一台ECS出现故障,剩余ECS仍可以支持现有业务正常运行。
    确定CPU:Memory比例。对于使用内存比较多的应用例如Java类应用,建议考虑使用1:8的机型。
     
     

    此次项目资源分配(数据库、中间件、镜像仓库Harbor除外):(在原有的开发测试服务器上搭建)

     
    序号
    IP
    CPU(核)
    内存(GB)
    磁盘(GB)
    部署应用
    备注说明
    1
    172.18.215.10
    2
    8
    60
    k8s master[1]
    kube-apiserver
    SLB内网负载均衡
    172.18.215.23
    2
    172.18.215.15
    2
    4
    100
    k8s master[2]
    3
    172.18.215.11
    2
    8
    100
    k8s worker[1]
    nginx-ingress
    SLB公网负载均衡
    120.78.145.173
    4
    172.18.215.16
    2
    4
    100
    k8s worker[2]
       5
        172.18.215.12
    2
    8
                 100
    k8s haproxy1
    kube-apiserver
    SLB内网负载均衡
    172.18.215.23
       6
        172.18.215.133
    2
    8
                 100
    k8s haproxy2
    阿里云踩坑记录
     
    架构方案
     
    二、系统准备工作
     
    所有机器配置好如下环境:
    • 关闭防火墙,selinux
    systemctl stop firewalld && systemctl disable firewalld
    • 做好解析
    cat >> /etc/hosts << EOF
    192.168.10.11 k8s-master-01
    192.168.10.12 k8s-master-02
    192.168.10.21 k8s-work-01
    192.168.10.22 k8s-work-02
    192.168.10.100 k8s-vip
    EOF
     
     
    • 配置好时间同步
    yum -y install vim curl wget unzip ntpdate net-tools ipvsadm ipset sysstat conntrack libseccomp
    ntpdate ntp1.aliyun.com && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    • 禁用swap分区
    swapoff -a && sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
    • 配置内核参数
    cat > /etc/sysctl.d/kubernetes.conf <<EOF
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    net.ipv6.conf.all.disable_ipv6=1
    net.ipv4.ip_forward=1
    net.ipv4.tcp_tw_recycle=0
    vm.swappiness=0
    fs.file-max=2000000
    fs.nr_open=2000000
    fs.inotify.max_user_instances=512
    fs.inotify.max_user_watches=1280000
    EOF
    modprobe br_netfilter && sysctl -p /etc/sysctl.d/kubernetes.conf
    • 加载ipvs模块:
    yum install ipset ipvsadm -y
    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
    chmod 755 /etc/sysconfig/modules/ipvs.modules
    sh /etc/sysconfig/modules/ipvs.modules
    lsmod | grep -e ip_
    •升级内核(版本较新的不需要此步)
    [root@master1 ~]# yum -y update kernel
    [root@master1 ~]# shutdown -r now
    •安装nfs文件共享(可选)
    yum -y install nfs-common nfs-utils rpcbind
    systemctl start nfs && systemctl enable nfs
    systemctl start rpcbind && systemctl enable rpcbind
     
    三、部署过程
     
    1. 安装配置docker                        # 所有节点
    2. 安装软件                                   # 所有节点
    3. 安装负载均衡及高可用               # 所有 Master节点   使用阿里云的SLB
    4. 初台化Master1                         # Master1节点
    5. 加入Master节点                        # 其它 Master节点
    6. 加入Worker节点                       # 所有 Node节点
    7. 配置kubectl                              # 所有需要的节点
    8. 部署网络插件                            # Master1节点
     
    3.1 安装配置docker
     
    在所有节点安装
    vim docker_install.sh
    #/bin/bash
    yum -y install docker-ce
    [ ! -d /etc/docker ] && mkdir /etc/docker
    [ ! -d /data/docker ] && mkdir -p /data/docker
    cat > /etc/docker/daemon.json <<- EOF
    {
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
            "max-size": "100m",
            "max-file": "3"
        },
        "storage-driver": "overlay2",
        "storage-opts": [
            "overlay2.override_kernel_check=true"
        ],
        "data-root": "/data/docker",
        "max-concurrent-downloads": 5,
        "storage-driver": "overlay2",
        "registry-mirrors": [
        ]
    }
    EOF
    systemctl enable --now docker
     
    bash docker_install.sh

    3.2 安装软件

    在所有节点安装
    cat >> /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    EOF
    yum install -y kubeadm-1.18.10-0 kubelet-1.18.10-0 kubectl-1.18.10-0 ipvsadm
    可用 yum list --showduplicates|egrep kubeadm 查看有哪些可用版本
    设置开机启动kubelet
    # systemctl enable kubelet
     
    2.3 安装负载均衡
     
    在所有Master节点操作
    Kubernetes master 节点运行如下组件:
    - kube-apiserver
    - kube-scheduler
    - kube-controller-manager
     
    由于阿里云的VIP需要申请havip,暂且使用阿里云的SLB,所以不需要keepalived
     
    在所有k8s-haproxy节点操作(方案二)
    Haproxy
     
    mkdir -p /data/k8s/haproxy-etc
    vim /data/k8s/haproxy-etc/haproxy.cfg
    globaz
        daemon
        maxconn 65535
     
    defaults
        mode http
        timeout connect 5000ms
        timeout client 5000ms
        timeout server 5000ms
     
    listen stats 
        mode http 
        bind 0.0.0.0:8442
        stats enable 
        log global 
        stats uri /haproxy-status 
        stats auth haadmin:123456
     
    listen  k8s-control-plane
        bind  0.0.0.0:8443
        mode  tcp
        log global
        balance  roundrobin
        option  tcplog
        server  dev         172.18.215.10:6333 check weight 1 maxconn 2000
        server  devmaster2  172.18.215.15:6333 check weight 1 maxconn 2000
    docker run -d
        --name k8s-haproxy
        --restart=unless-stopped
            --net=host cd 
        -v /data/k8s/haproxy-etc:/usr/local/etc/haproxy:ro
        haproxy:2.4.1-alpine
     
     

    3.4 初始化master1

    任选一台master节点,修改当前master节点 /etc/hosts,把 k8sapi 对应解析地址修改为当前节点地址(系统初始化时我们统一配置成slb负载地址了)。
    对于四层监听的后端服务器无法访问私网SLB问题,是由于目前负载均衡不支持同时作为客户端和服务端,因为SLB tcp协议监听,是直接转发客户端IP和连接给后端ECS,当后端ECS连接SLB端口,SLB转发该连接时,后端ECS“看到”数据包是来自自己的IP,回包就不会回给SLB了,无法正常建立连接,所以telnet会不通。
    而ECS可以telnet 公网SLB端口,是因为使用的是ECS的公网IP,VPC ECS的公网IP是在网络层映射到ECS的内网IP上的,ECS内部并没有该公网IP,所以可以telnet通公网SLB的端口
    注意:因为是正式环境,我们尽量修改一些默认值,比如:token、apiserver端口、etcd数据路径、podip网段等。
    • 在 Master1上创建初始化配置文件
    mkdir k8s && cd k8s/ && kubeadm config print init-defaults > init.yml
    • 根据实际环境修改初始化配置文件
    vim init.yml
    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef #修改默认token
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.10.11         # 此处改为本机IP(修改)
      bindPort: 6333 #修改默认端口
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: k8s-master-01 #修改为master1
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controlPlaneEndpoint: "k8s-vip:6333"   # VIP:PORT(增加)
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /data/k8s/etcd
    imageRepository: registry.aliyuncs.com/google_containers  # 使用国内镜像仓库(增加)
    kind: ClusterConfiguration
    kubernetesVersion: v1.18.10    # 版本号(修改)
    networking:
      dnsDomain: cluster.local
      serviceSubnet: 10.96.0.0/12
      podSubnet: 10.233.0.0/16    # pod子网,和Flannel/calico中要一致(增加)
    scheduler: {}
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    featureGates:
      SupportIPVSProxyMode: true
    mode: ipvs
    • 初始化 Master1
    之前版本:
    kubeadm init --config=init.yml --experimental-upload-certs | tee kubeadm-init.log
    v1.18.10版本:
    kubeadm init --config=init.yml --upload-certs |tee kubeadm-init.log
    *如果中途失败, 再次初始化前先执行 kubeadm reset 命令清理, 然后再执行init或join操作
    k8s主节点初始化完成后,打开阿里云负载均衡配置,增加SLB内网对kube-apiserver负载配置(这里只能用四层TCP)。
    暂且只配置当前master地址,等待其他master节点加入成功后再添加,因为其他两台master还未加入,此时如果配置其他master地址,SLB负载均衡状态将会异常,那其他节点尝试加入集群将会失败。
     
    3.5加入master节点
     
    在所有Master节点操作
    # 根据初始化日志提示,执行kubeadm join命令加入其他管理节点。
    kubeadm join k8s-vip:6333 --token token0.123456789kubeadm
       --discovery-token-ca-cert-hash sha256:56d53268517...
       --experimental-control-plane --certificate-key c4d1525b6cce4....
     
    修改新加入master节点apiserver端口,以及补全阿里云SLB apiserver负载地址。  
    # 修改kube-apiserver监听端口
    sed -i 's/6443/6333/g' /etc/kubernetes/manifests/kube-apiserver.yaml
    # 重启kube-apiserver容器
    docker restart `docker ps | grep k8s_kube-apiserver | awk '{print $1}'`
    # 查看kube-apiserver监听端口
    ss -anp | grep "apiserver" | grep 'LISTEN'
     
     
    3.6加入worker节点
     
    在所有Worker节点操作
    # 根据初始化日志提示,执行kubeadm join命令加入其他工作节点。
    kubeadm join k8s-vip:6333 --token token0.123456789kubeadm
              --discovery-token-ca-cert-hash sha256:260796226d…………
     
    注意:token有效期为24小时,失效后请在主节点使用以下命令重新生成
    kubeadm token create --print-join-command
     
    3.7部署kubectl
    在所有需要的节点操作
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    # kubectl 补全 重新打开终端生效
    yum -y install bash-completion && cd ~;echo "source <(kubectl completion bash)" >> .bashrc
     
     
    3.7部署网络插件
    在Master1节点操作
    • calico网络插件
    curl -O https://docs.projectcalico.org/v3.9/manifests/calico.yaml
    sed -i 's#192.168.0.0/16#10.233.0.0/16#g' calico.yaml
    kubectl apply -f calico.yaml
     
    • 检查集群部署情况
    sed -i 's/- --port=0/#- --port=0/g' /etc/kubernetes/manifests/kube-controller-manager.yaml
    sed -i 's/- --port=0/#- --port=0/g' /etc/kubernetes/manifests/kube-scheduler.yaml
    kubectl get cs && kubectl get nodes && kubectl get pod --all-namespaces
     
     
    四、安装K8S功能组件

    4.1安装dashboard/kuboard

    • 部署dashboard
    curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
    vim recommended.yaml
    ...
    ---
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      type: NodePort
      ports:
        - port: 443
          targetPort: 8443
          nodePort: 30443
      selector:
        k8s-app: kubernetes-dashboard
    ...
    kubectl apply -f recommended.yaml
    访问:https://ip:30443
    kubectl describe secrets -n kubernetes-dashboard kubernetes-dashboard-token-xxxx | grep token | awk 'NR==3{print $2}'
    • 部署kuboard

    wget https://kuboard.cn/install-script/kuboard.yaml
    kubectl apply -f kuboard.yaml
    kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.6/metrics-server.yaml
     
    获取token
    admin:
    echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
    只读:
    echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-viewer | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
     
    访问:http://ip:32567
     

    4.2部署七层路由Ingress

    1、 首先下载yaml文件
    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.43.0/deploy/static/provider/baremetal/deploy.yaml
     
    2、编辑对应文件修改镜像源(国外镜像地址无法下载修改为阿里源)
    image: registry.cn-hangzhou.aliyuncs.com/bin_x/nginx-ingress:v0.43.0@sha256:80359bdf124d49264fabf136d2aecadac729b54f16618162194356d3c78ce2fe
  • 相关阅读:
    PL/SQL编程基本概念
    oracle基本笔记整理及案例分析2
    oracle基本笔记整理及案例分析2
    oracle基本笔记整理及案例分析2
    oracle基本笔记整理及案例分析1
    oracle基本笔记整理及案例分析1
    oracle基本笔记整理及案例分析1
    oracle笔记整理2
    oracle笔记整理2
    oracle笔记整理2
  • 原文地址:https://www.cnblogs.com/user-sunli/p/15236808.html
Copyright © 2011-2022 走看看