• K8S踩坑篇-master节点作为node节点加入集群


    前面我们二进制部署K8S集群时,三台master节点仅仅作为集群管理节点,所以master节点上中并未部署docker、kubelet、kube-proxy等服务。后来我在部署mertics-server、istio组件服务时,发现无法正常运行,后来尝试把master节点也加入集群进行调度,这些组件才能够正常部署,并可以正确获取集群资源。所以本篇文章主要介绍如何在已经部署好集群的master节点部署docker、kubelet、kube-proxy等服务。

    注意:本篇文章操作是基于我之前部署集群时,没有在master节点部署kubele、kube-proxy、docker等组件,若你的集群是kubeadm方式部署(默认已经部署这些组件),可以不关注此文章。

    master节点部署与node节点部署方式基本一致,所以文章中涉及的证书及各配置文件都可以通用,详情可以参考前面三个章节部署;

    K8S从入门到放弃系列-(8)kube-apiserver 高可用配置
    K8S从入门到放弃系列-(9)kubernetes集群之kubelet部署
    K8S从入门到放弃系列-(10)kubernetes集群之kube-proxy部署

    1、部署docker

    ## 设置存储库
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum install -y yum-utils device-mapper-persistent-data lvm2'
    ## 添加yum源
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo'
    ## 安装指定版本docker
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum install docker-ce-18.09.5-3.el7 -y'
    ## 启动
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable docker'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start docker'

    2、部署kubelet

    对于在 master 节点启动 kubelet 来说,不需要 nginx 做负载均衡;可以跳过nginx-proxy部署,直接进行kubelet、kube-proxy的安装,并修改 kubelet.kubeconfig、kube-proxy.kubeconfig 中的 apiserver 地址为当前 master ip 6443 端口即可,我配置文件中是127.0.0.1:6443,无需修改。

    ## 把配置文件分发至各master节点
    ### bootstrap.kubeconfig
    [root@k8s
    -master01 ~]# ansible k8s-master -m copy -a 'src=/root/bootstrap.kubeconfig dest=/etc/kubernetes/config/'

    ###
    kubelet.conf(别忘了修改参数中对应的主机名、IP地址、--node-labels选项)
    [root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/cfg/kubelet.conf dest=/etc/kubernetes/config/'

    ### master节点设置taint 
    [root@k8s-master01 ~]# kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:NoSchedule
    [root@k8s-master02 ~]# kubectl taint nodes k8s-master02 node-role.kubernetes.io/master=:NoSchedule
    [root@k8s-master03 ~]# kubectl taint nodes k8s-master03 node-role.kubernetes.io/master=:NoSchedule

    注意:kubelet.conf配置文件中--node-labels=node-role.kubernetes.io/k8s-node=true 这个选项,它的作用只是在 kubectl get node 时 ROLES 栏显示是什么节点;
         对于master节点需要修改为--node-labels=node-role.kubernetes.io/k8s-master=true,后面这个 node-role.kubernetes.io/master 是 kubeadm 用的,这个 label 会告诉 k8s 调度器当前节点为 master节点;
       如果不想让master节点参与到正常的pod调度,则需要对master进行打污点标签,这样master就不会有pod创建(pod创建时可以进行容忍度设置,这样master还是可以进行pod调度)
    ### kubelet.service  
    [root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/unit/kubelet.service dest=/usr/lib/systemd/system/'

    ## 创建kubelet数据目录
    [root@k8s-master01 ~]# ansible k8s-master -m file -a 'path=/var/lib/kubelet state=directory'

    ## 启动服务
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl daemon-reload'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable kubelet'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start kubelet

    ## 查看未授权的csr请求
    [root@k8s-master01 ~]# kubectl get csr

    ## 批准kubelet 的 TLS 证书请求
    [root@k8s-master01 ~]# kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve

    ## 查看各节点就绪状态
    ### 需要等待一段时间,因为需要下载安装网络组件镜像
    [root@k8s-master01 ~]# kubectl get nodes
    NAME           STATUS   ROLES    AGE   VERSION
    k8s-master01   Ready    <none>   25h   v1.14.1
    k8s-master02   Ready    <none>   25h   v1.14.1
    k8s-master03   Ready    <none>   25h   v1.14.1
    k8s-node01     Ready    <none>   10d   v1.14.1
    k8s-node02     Ready    <none>   10d   v1.14.1
    
    

    2、kube-proxy部署

    ## 开启ipvs
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a "yum install -y ipvsadm ipset conntrack"
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_rr'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_wrr'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_sh'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- nf_conntrack_ipv4'

    ## 分发kube-proxy证书文件
    [root@k8s-master01 certs]# ansible k8s-master -m copy -a 'src=/opt/k8s/certs/kube-proxy-key.pem dest=/etc/kubernetes/ssl/'
    [root@k8s-master01 certs]# ansible k8s-master -m copy -a 'src=/opt/k8s/certs/kube-proxy.pem dest=/etc/kubernetes/ssl/'

    ## kubeconfig
    [root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/root/kube-proxy.kubeconfig dest=/etc/kubernetes/config/'

    ## kube-proxy.conf配置文件(修改hostname-override字段所属主机名)
    [root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/cfg/kube-proxy.conf dest=/etc/kubernetes/config/'

    ## kube-proxy.service启动脚本
    [root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/unit/kube-proxy.service dest=/usr/lib/systemd/system/'

    ## 启动
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl daemon-reload'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable kube-proxy'
    [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start kube-proxy'

    总结:以上就是master节点部署kubelet、kube-proxy组件过程,以上有几个关键点重新整理:

      1、对于新安装集群来说,建议在部署集群时就安装三个服务,而不是集群部署后,遇到问题再进行部署。 

      2、master节点上kubelet.conf中--node-labels=node-role.kubernetes.io/k8s-node=true修改为--node-labels=node-role.kubernetes.io/k8s-master=true

      3、master节点上,kubelet、kube-proxy直接与本地kube-apiserver通信即可,无需进行nginx负载均衡配置,及不需要部署nginx-proxy

  • 相关阅读:
    算法导论第十八章 B树
    腾讯2016春招之算法编程解析
    LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
    搜狗2016校园招聘之算法编程解析
    linux sed在某些字符串的下一行插入内容?sed在下一行插入?
    linux shell搜索某个字符串,然后在后面加上字符串?字符串后面插入字符串?sed字符串后面插入字符串?
    linux环境中,如何使用tar来创建压缩包?解压缩?
    linux环境中,ssh登录报错,Permission denied, please try again.
    linux环境中安装NRPE插件执行远程"本地资源"检查?NRPE安装?
    linux环境安装nagiosgraph将nagios的性能数据绘制成动态图表?
  • 原文地址:https://www.cnblogs.com/tchua/p/10844013.html
Copyright © 2020-2023  润新知