• 二进制部署k8s集群(五):部署kubelet


    将k8s安装在六个节点上,六个点信息为: 

    节点名称IP地址Hostname安装内容
    harbor私有仓库 192.168.0.101 yyee-centos-1 harbor
    k8s管理节点1 192.168.0.102 yyee-centos-2
    etcd,kube-apiserver,kube-controller-manager,
    kube-scheduler,CNI 
    k8s管理节点2 192.168.0.103 yyee-centos-3
    etcd,kube-apiserver,kube-controller-manager,
    kube-scheduler, CNI 
    k8s工作节点1 192.168.0.104 yyee-centos-4

    etcd ,kubelet,docker,kube_proxy,caliop, CNI 
    k8s工作节点2 192.168.0.105 yyee-centos-5

    kubelet,docker,kube_proxy,caliop, CNI 

    k8s工作节点3 192.168.0.106 yyee-centos-6

    kubelet,docker,kube_proxy,caliop, CNI 

       

    【前期准备】:

    下载 kubernetes-node:https://dl.k8s.io/v1.18.3/kubernetes-node-linux-amd64.tar.gz

    或者下载kube-server,kube-server里包含了kubelet,kubernetes-server下载地址:https://dl.k8s.io/v1.18.3/kubernetes-server-linux-amd64.tar.gz

    k8s其它组件下载:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183 

    创建kubelet证书。在前一篇 《二进制部署k8s集群(三):部署apiserver》已经创建kubelet证书。

    需要用到两个证书文件(kubelet-key.pem, kubelet.pem),将这两个证书文件分别拷贝所有管理节点的【/opt/kubernetes/server/bin/certs】目录,以及拷贝到所有工作节点的 【//opt/kubernetes/node/bin/certs】目录。

    下载kubernetes-node安装包,准备kubelet证书

    在k8s所有工作节点上下载kubernetes-node安装包 

    wget https://dl.k8s.io/v1.18.3/kubernetes-node-linux-amd64.tar.gz

    将kubernetes-node-linux-amd64.tar.gz压缩包解压到 /opt/kubernetes目录。

    tar xvf kubernetes-node-linux-amd64.tar.gz -C /opt

       

    将【k8s管理节点1】上签 发的kubelet证书,kube-proxy证书,client证书,私钥证书ca.pem,拷贝到 所有k8s工作节点下的 【/opt/kubernetes/node/bin/certs】目录。

    mkdir -p /opt/kubernetes/node/bin/certs
    cd /opt/kubernetes/node/bin/certs
    scp 192.168.0.102:/opt/certs/kubelet-key.pem ./
    scp 192.168.0.102:/opt/certs/kubelet.pem ./
    scp 192.168.0.102:/opt/certs/ca.pem ./
    scp 192.168.0.102:/opt/certs/client-key.pem ./
    scp 192.168.0.102:/opt/certs/client.pem ./
    scp 192.168.0.102:/opt/certs/kube-proxy-client-key.pem ./
    scp 192.168.0.102:/opt/certs/kube-proxy-client.pem ./

    ll /opt/kubernetes/node/bin/certs

       

     创建kubectl软链接。

    ln -s /opt/kubernetes/node/bin/kubectl  /usr/bin/kubectl
    创建kubelet用户配置文件

    切换到【k8s管理节点2】(192.168.0.103)主机,因为生成配置的时候用到localhost:8080,所以需要在管理节点上执行。

    下面4个步骤,只需要在其中一个管理节点上完成,然后将kubelet.kubeconfig文件和k8s-node.yaml文件拷贝到各个工作节点。

    #进入conf目录才能创建配置文件
    mkdir -p /opt/kubernetes/server/conf cd
    /opt/kubernetes/server/conf/

     注意,conf目录在【/opt/kubernetes/server】目录下面,而不是【/opt/kubernetes/server/bin】。

    第1步【设置集群参数】

    kubectl config set-cluster myk8s 
      --certificate-authority=/opt/kubernetes/server/bin/certs/ca.pem 
      --embed-certs=true 
      --server=https://192.168.0.102:6443 
      --kubeconfig=kubelet.kubeconfig

    --server= 可以配置成负载均衡地址,可以用nginx反向代理 192.168.0.102:6443与192.168.0.103:6443两个k8s管理节点的kube-apiserver 端口。

    然后将--server配置成反向代理的ip(或域名)与端口。

     Cluster "myk8s" set.

        

    第2步【设置客户端认证参数】

    kubectl config set-credentials k8s-node 
      --client-certificate=/opt/kubernetes/server/bin/certs/client.pem 
      --client-key=/opt/kubernetes/server/bin/certs/client-key.pem 
      --embed-certs=true 
      --kubeconfig=kubelet.kubeconfig

    User "k8s-node"  set.

    第3步【设置上下文参数】

    kubectl config set-context myk8s-context 
      --cluster=myk8s 
      --user=k8s-node 
      --kubeconfig=kubelet.kubeconfig

    Context "myk8s-context"   created.

    第4步【切换上下文】

    kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig

    Switched to conttext "myk8s-context". 

    第5步 【分发配置文件到工作节点】

    将kubelet.kubeconfig文件分发到三个工作节点kubelet安装目录的conf文件夹。

    并且还要拷贝到工作节点的 /root/.kube文件夹,以便在工作节点可以使用kubectl命令。

    #先在工作节点创建/opt/kubernetes/node/conf文件夹及/root/.kube文件夹
    #然后拷贝文件
    scp bekelet.kubeconfig 192.168.0.104:/opt/kubernetes/node/conf
    scp bekelet.kubeconfig 192.168.0.104:/root/.kube
    scp kubelet.kubeconfig 192.168.0.105:/opt/kubernetes/node/conf
    scp bekelet.kubeconfig 192.168.0.105:/root/.kube
    scp kubelet.kubeconfig 192.168.0.106:/opt/kubernetes/node/conf
    scp bekelet.kubeconfig 192.168.0.106:/root/.kube
    角色绑定

    在其中一个k8s管理节点上创建角色绑定配置文件:

    切换到【k8s管理节点2】

    vi /opt/kubernetes/server/conf/k8s-node.yaml

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: k8s-node
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:node
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: k8s-node

    执行创建角色绑定命令,因为用到localhost:8080,所有要在管理节点上创建。

    kubectl create -f k8s-node.yaml

      

    这一步只需要创建一次,重复创建会报名字已存在的错误。

    Error from server (AlreadyExists): error when creating "k8s-node.yaml": clusterrolebindings.rbac.authorization.k8s.io "k8s-node" already exists.

    .

    查看创建的角色绑定

    kubectl get clusterrolebinding k8s-node

      

    查看角色绑定明细

    kubectl get clusterrolebinding k8s-node -o yaml

      

    部署kutele

    (1) 拉取kubernetes/pause 镜像

    【拉取一个docker基础镜像 kubernetes/pause】

    每个k8s工作节点上拉取一个名为kubernetes/pause的基础镜像下来,启动pod需要用到这个基础镜像,这个基础镜像很小,实际大小为72.28KB 。

    docker pull kubernetes/pause

    kubelet启动文件需要配置kubernetes/pause镜像。

    如果想在启动kubelet的时候加快镜像下载速度,可以将这个镜像打个tag然后上传到私有仓库harbor,然后将配置指向私有harbor的kubernetes/pause镜像。

    docker tag kubernetes/pause 192.168.0.101:10080/base/kubernetes/pause:latest
    docker login 192.168.0.101:10080
    docker push 192.168.0.101:10080/base/kubernetes/pause:latest

      

    (2) 创建kubelet启动文件

    【创建k8s工作节点1的kubelet启动文件】

    vi  /opt/kubernetes/node/bin/kuelet.sh

    #!/bin/sh
     ./kubelet 
      --anonymous-auth=false 
      --cgroup-driver cgroupfs 
      --cluster-dns 192.168.0.2 
      --cluster-domain cluster.local 
      --runtime-cgroups=/systemd/system.slice 
      --kubelet-cgroups=/systemd/system.slice 
      --fail-swap-on="false" 
      --client-ca-file ./certs/ca.pem 
      --tls-cert-file ./certs/kubelet.pem 
      --tls-private-key-file ./certs/kubelet-key.pem 
    --address 192.168.0.104
    --hostname-override 192.168.0.104 --image-gc-high-threshold 20 --image-gc-low-threshold 10 --kubeconfig ../conf/kubelet.kubeconfig --log-dir /data/logs/kubernetes/kube-kubelet --pod-infra-container-image kubernetes/pause --root-dir /data/kubelet

     --address 对外服务的监听地址。

    --pod-infra-container-image参数可配置成私有harbor的镜像:--pod-infra-container-image 192.168.0.101:10080/base/kubernetes/pause 。

    --hostname-override 节点ip地址,不同节点需要更改。

    --cluster-dns k8s dns,用coredns配置。我这里做测试,没用于生产环境,dns填的宿主机的默认网关。

    【创建k8s工作节点2的kubelet启动文件】

    vi  /opt/kubernetes/node/bin/kuelet.sh

    #!/bin/sh
     ./kubelet 
      --anonymous-auth=false 
      --cgroup-driver cgroupfs 
      --cluster-dns 192.168.0.2 
      --cluster-domain cluster.local 
      --runtime-cgroups=/systemd/system.slice 
      --kubelet-cgroups=/systemd/system.slice 
      --fail-swap-on="false" 
      --client-ca-file ./certs/ca.pem 
      --tls-cert-file ./certs/kubelet.pem 
      --tls-private-key-file ./certs/kubelet-key.pem 
    --address 192.168.0.105
    --hostname-override 192.168.0.105 --image-gc-high-threshold 20 --image-gc-low-threshold 10 --kubeconfig ../conf/kubelet.kubeconfig --log-dir /data/logs/kubernetes/kube-kubelet --pod-infra-container-image kubernetes/pause --root-dir /data/kubelet

    【创建k8s工作节点3的kubelet启动文件】

    vi  /opt/kubernetes/node/bin/kuelet.sh

    #!/bin/sh
     ./kubelet 
      --anonymous-auth=false 
      --cgroup-driver cgroupfs 
      --cluster-dns 192.168.0.2 
      --cluster-domain cluster.local 
      --runtime-cgroups=/systemd/system.slice 
      --kubelet-cgroups=/systemd/system.slice 
      --fail-swap-on="false" 
      --client-ca-file ./certs/ca.pem 
      --tls-cert-file ./certs/kubelet.pem 
      --tls-private-key-file ./certs/kubelet-key.pem 
    --address 192.168.0.106
    --hostname-override 192.168.0.106 --image-gc-high-threshold 20 --image-gc-low-threshold 10 --kubeconfig ../conf/kubelet.kubeconfig --log-dir /data/logs/kubernetes/kube-kubelet --pod-infra-container-image kubernetes/pause --root-dir /data/kubelet

    【创建所有工作节点的日志目录,赋予启动文件可执行权限】

    mkdir -p /data/logs/kubernetes/kube-kubelet
    mkdir -p /data/kubelet
    chmod +x /opt/kubernetes/node/bin/kubelet.sh

    【执行kubelet.sh验证kubelet启动状态】

    cd /opt/kubernetes/node/bin
    ./kubelet.sh

       

    在【k8s管理节点】上查看节点状态

    切换到任意一个管理节点。

    kubectl get nodes

      

    Ready表示工作节点成功连接到主控节点kube-apiserver,NotReady表示工作节点未连接到主控节点lube-apiserver。

    启动kubelet后如果一直报 failed to get cgroup status for /user.slice 的错误,需要修改docker 的 守护参数:

    vi  /etc/docker/daemon.json

    "exec-opts": ["native.cgroupdriver=cgroupfs"]

    然后重启docker 。

    如果将 kubelet.sh启动文件的cluster-driver设置成 --cluster-driver=systemd,那么docker的配置要修改成:

    vi  /etc/docker/daemon.json

    "exec-opts": ["native.cgroupdriver=systemd"] 

    然后重启docker :

    systemctl  daemon-reload
    systemctl restart docker

    使用supervisor启动kubelet

    supevisor相当于一个systemd服务,用它来启动与监控kubelet。

     (1) 安装supervisor

    yum install supervisor
    systemctl enable supervisord
    systemctl start supervisord

    (2) 创建工作节点上的supervisor启动配置文件

    将配置文件放到 /etc/supervisord 目录下,以.ini作为扩展名,文件名可以任意,可以放置多个不同的启动配置文件,每个配置文件以不同的服务启动。

    创建【工作节点1】的supervisor启动文件

    切换到192.168.0.104

    vi  /etc/supervisord.d/kube-kubelet.ini

    [program:kube-kubelet-104]
    command=/opt/kubernetes/node/bin/kubelet.sh
    numprocs=1
    directory=/opt/kubernetes/node/bin
    autostart=true
    autorestart=true
    startsecs=30
    startretries=3
    exitcodes=0,2
    stopsignal=QUIT
    stopwaitsecs=10
    user=root
    redirect_stderr=true
    stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log
    stdout_logfile_maxbytes=64MB
    stdout_logfile_backups=4
    stdout_capture_maxbytes=1MB
    stdout_events_enabled=false

    创建【工作节点2】的supervisor启动文件

    切换到192.168.0.105

    vi  /etc/supervisord.d/kube-kubelet.ini

    [program:kube-kubelet-105]
    command=/opt/kubernetes/node/bin/kubelet.sh
    numprocs=1
    directory=/opt/kubernetes/node/bin
    autostart=true
    autorestart=true
    startsecs=30
    startretries=3
    exitcodes=0,2
    stopsignal=QUIT
    stopwaitsecs=10
    user=root
    redirect_stderr=true
    stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log
    stdout_logfile_maxbytes=64MB
    stdout_logfile_backups=4
    stdout_capture_maxbytes=1MB
    stdout_events_enabled=false

    创建【工作节点3】的supervisor启动文件

    切换到192.168.0.106

    vi  /etc/supervisord.d/kube-kubelet.ini

    [program:kube-kubelet-106]
    command=/opt/kubernetes/node/bin/kubelet.sh
    numprocs=1
    directory=/opt/kubernetes/node/bin
    autostart=true
    autorestart=true
    startsecs=30
    startretries=3
    exitcodes=0,2
    stopsignal=QUIT
    stopwaitsecs=10
    user=root
    redirect_stderr=true
    stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log
    stdout_logfile_maxbytes=64MB
    stdout_logfile_backups=4
    stdout_capture_maxbytes=1MB
    stdout_events_enabled=false

    (3) 分别启动所有工作节点上的kubelet服务

    #启动新加入到supervisor中的服务
    supervisorctl update
    #查看状态
    supervisorctl status

      

      

    查看kubelet启动日志

    tail -fn 200 /data/logs/kubernetes/kube-kubelet/kubelet.stdout.log

    【supervisor命令说明】

    supervisorctl status                   #查看所有进程的状态
    supervisorctl stop 服务名          #停止服务
    supervisorctl start 服务名          #启动服务
    supervisorctl restart 服务名      #重启服务
    supervisorctl update                 #配置文件修改后使用该命令加载新的配置
    supervisorctl reload                  #重新启动配置中的所有程序

    查看kutelet集群状态

    (1) 在管理节点上使用kubectl

    切换到任何一台k8s管理节点。

    【查看管理节点集群状态】

    kubetctl get cs

      

    【查看kubelet各节点状态】

    kubectl get nodes

    或者

    kubectl get node

    (2) 在工作节点上使用kubectl

    在工作节点上使用kubectl命令会报错误:

    The connection to the server localhost:8080 was refused - did you specify the right host or port?

    解决的办法是将【 /opt/kubernetes/node/conf/kubelet.kubeconfig 】与 【/opt/kubernetes/node/conf/kube-proxy.kubeconfig】两个文件拷贝到【 /root/.kube/  】目录下面。

    mkdir -p /root/.kube
    cp /opt/kubernetes/node/conf/kubelet.kubeconfig /root/.kube/config
    cp /opt/kubernetes/node/conf/kube-proxy.kubeconfig  /root/.kube/config
    给kubelet角色加标签

    切换到k8s管理节点。

    kubectl label node 192.168.0.104 node-role.kubernetes.io/master=
    kubectl label node 192.168.0.104 node-role.kubernetes.io/etcd=
    kubectl label node 192.168.0.104 node-role.kubernetes.io/node=
    kubectl label node 192.168.0.105 node-role.kubernetes.io/node=
    kubectl label node 192.168.0.106 node-role.kubernetes.io/node=

    kubectl get nodes

  • 相关阅读:
    linux tcp/ip 调优
    ulimit 管理系统资源
    linux grep 设置高亮显示
    linux 调整内核优化
    微信公众平台自定义菜单及高级接口PHP SDK
    微信公众平台开发(102) 模版消息
    微信WeixinJSBridge API
    微信支付开发(2) 静态链接Native支付
    微信分享JS接口失效说明及解决方案
    微信JS接口
  • 原文地址:https://www.cnblogs.com/yyee/p/13227826.html
Copyright © 2020-2023  润新知