• 06-4.部署高可用 kube-scheduler 集群


    06-4.部署高可用 kube-scheduler 集群

    本文档介绍部署高可用 kube-scheduler 集群的步骤。

    该集群包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。

    为保证通信安全,本文档先生成 x509 证书和私钥,kube-scheduler 在如下两种情况下使用该证书:

    1. 与 kube-apiserver 的安全端口通信;
    2. 安全端口(https,10251) 输出 prometheus 格式的 metrics;

    准备工作

    下载最新版本的二进制文件、安装和配置 flanneld 参考:06-0.部署master节点.md

    创建 kube-scheduler 证书和私钥

    创建证书签名请求:

    cat > kube-scheduler-csr.json <<EOF
    {
        "CN": "system:kube-scheduler",
        "hosts": [
          "127.0.0.1",
          "192.168.1.106",
          "192.168.1.107",
          "192.168.1.108"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
          {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "system:kube-scheduler",
            "OU": "4Paradigm"
          }
        ]
    }
    EOF
    
    • hosts 列表包含所有 kube-scheduler 节点 IP;
    • CN 为 system:kube-scheduler、O 为 system:kube-scheduler,kubernetes 内置的 ClusterRoleBindings system:kube-scheduler 将赋予 kube-scheduler 工作所需的权限。

    生成证书和私钥:

    cfssl gencert -ca=/etc/kubernetes/cert/ca.pem 
      -ca-key=/etc/kubernetes/cert/ca-key.pem 
      -config=/etc/kubernetes/cert/ca-config.json 
      -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
    

    创建和分发 kubeconfig 文件

    kubeconfig 文件包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书;

    source /opt/k8s/bin/environment.sh
    kubectl config set-cluster kubernetes 
      --certificate-authority=/etc/kubernetes/cert/ca.pem 
      --embed-certs=true 
      --server=${KUBE_APISERVER} 
      --kubeconfig=kube-scheduler.kubeconfig
    
    kubectl config set-credentials system:kube-scheduler 
      --client-certificate=kube-scheduler.pem 
      --client-key=kube-scheduler-key.pem 
      --embed-certs=true 
      --kubeconfig=kube-scheduler.kubeconfig
    
    kubectl config set-context system:kube-scheduler 
      --cluster=kubernetes 
      --user=system:kube-scheduler 
      --kubeconfig=kube-scheduler.kubeconfig
    
    kubectl config use-context system:kube-scheduler --kubeconfig=kube-scheduler.kubeconfig
    
    • 上一步创建的证书、私钥以及 kube-apiserver 地址被写入到 kubeconfig 文件中;

    分发 kubeconfig 到所有 master 节点:

    source /opt/k8s/bin/environment.sh
    for node_ip in ${NODE_IPS[@]}
      do
        echo ">>> ${node_ip}"
        scp kube-scheduler.kubeconfig k8s@${node_ip}:/etc/kubernetes/
      done
    

    创建和分发 kube-scheduler systemd unit 文件

    cat > kube-scheduler.service <<EOF
    [Unit]
    Description=Kubernetes Scheduler
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    
    [Service]
    ExecStart=/opt/k8s/bin/kube-scheduler \
      --address=127.0.0.1 \
      --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \
      --leader-elect=true \
      --alsologtostderr=true \
      --logtostderr=false \
      --log-dir=/var/log/kubernetes \
      --v=2
    Restart=on-failure
    RestartSec=5
    User=k8s
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    • --address:在 127.0.0.1:10251 端口接收 http /metrics 请求;kube-scheduler 目前还不支持接收 https 请求;
    • --kubeconfig:指定 kubeconfig 文件路径,kube-scheduler 使用它连接和验证 kube-apiserver;
    • --leader-elect=true:集群运行模式,启用选举功能;被选为 leader 的节点负责处理工作,其它节点为阻塞状态;
    • User=k8s:使用 k8s 账户运行;

    完整 unit 见 kube-scheduler.service

    分发 systemd unit 文件到所有 master 节点:

    source /opt/k8s/bin/environment.sh
    for node_ip in ${NODE_IPS[@]}
      do
        echo ">>> ${node_ip}"
        scp kube-scheduler.service root@${node_ip}:/etc/systemd/system/
      done
    

    启动 kube-scheduler 服务

    source /opt/k8s/bin/environment.sh
    for node_ip in ${NODE_IPS[@]}
      do
        echo ">>> ${node_ip}"
        ssh root@${node_ip} "mkdir -p /var/log/kubernetes && chown -R k8s /var/log/kubernetes"
        ssh root@${node_ip} "systemctl daemon-reload && systemctl enable kube-scheduler && systemctl restart kube-scheduler"
      done
    
    • 必须先创建日志目录;

    检查服务运行状态

    source /opt/k8s/bin/environment.sh
    for node_ip in ${NODE_IPS[@]}
      do
        echo ">>> ${node_ip}"
        ssh k8s@${node_ip} "systemctl status kube-scheduler|grep Active"
      done
    

    确保状态为 active (running),否则查看日志,确认原因:

    journalctl -u kube-scheduler
    

    查看输出的 metric

    注意:以下命令在 kube-scheduler 节点上执行。

    kube-scheduler 监听 10251 端口,接收 http 请求:

    $ sudo netstat -lnpt|grep kube-sche
    tcp        0      0 127.0.0.1:10251         0.0.0.0:*               LISTEN      23783/kube-schedule
    
    $ curl -s https://127.0.0.1:10251/metrics |head
    # HELP apiserver_audit_event_total Counter of audit events generated and sent to the audit backend.
    # TYPE apiserver_audit_event_total counter
    apiserver_audit_event_total 0
    # HELP go_gc_duration_seconds A summary of the GC invocation durations.
    # TYPE go_gc_duration_seconds summary
    go_gc_duration_seconds{quantile="0"} 9.7715e-05
    go_gc_duration_seconds{quantile="0.25"} 0.000107676
    go_gc_duration_seconds{quantile="0.5"} 0.00017868
    go_gc_duration_seconds{quantile="0.75"} 0.000262444
    go_gc_duration_seconds{quantile="1"} 0.001205223
    

    测试 kube-scheduler 集群的高可用

    随便找一个或两个 master 节点,停掉 kube-scheduler 服务,看其它节点是否获取了 leader 权限(systemd 日志)。

    查看当前的 leader

    $ kubectl get endpoints kube-scheduler --namespace=kube-system  -o yaml
    apiVersion: v1
    kind: Endpoints
    metadata:
      annotations:
        control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"kube-node3_61f34593-6cc8-11e8-8af7-5254002f288e","leaseDurationSeconds":15,"acquireTime":"2018-06-10T16:09:56Z","renewTime":"2018-06-10T16:20:54Z","leaderTransitions":1}'
      creationTimestamp: 2018-06-10T16:07:33Z
      name: kube-scheduler
      namespace: kube-system
      resourceVersion: "4645"
      selfLink: /api/v1/namespaces/kube-system/endpoints/kube-scheduler
      uid: 62382d98-6cc8-11e8-96fa-525400ba84c6



    链接:https://www.orchome.com/1197
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     
  • 相关阅读:
    程序员是这样区分Null和Undefined
    JavaScript实现
    获取页面中任意一个元素距离body的偏移量
    js检测数据类型的方法你都掌握了几个?
    处理浏览器兼容你最喜欢用哪种方式
    算法竞赛入门经典 第四章 学习笔记 1
    算法竞赛入门经典 程序4-1 组合数
    算法竞赛入门经典 例题3-1 TeX中的引号
    算法竞赛入门经典 第3章 数组和字符串 学习笔记 3
    算法竞赛入门经典 第3章 数组和字符串 学习笔记 2
  • 原文地址:https://www.cnblogs.com/linux20190409/p/10976829.html
Copyright © 2020-2023  润新知