zoukankan      html  css  js  c++  java
  • Kubernetes1.91(K8s)安装部署过程(六)--node节点部署

    hi,everybody,我回来了,之前安装到flannel之后,文章一直没有更新,甚至不少小伙伴都来加qq询问是否继续更新了,

    这里说明下原因,我在部署1.91node的时候的确出现了各种各样的问题,导致节点启动后哦,master总是看不到,遇到的问题大概有

    1、虚拟机时间同步不一致问题,导致etcd创建资源不成功

    2、node节点无法自动创建kubelet.kubeconfig问题,这个是最严重的问题,原因是config文件没有拷贝到node的/etc/kubernetes文件夹内,因为kubelet启动调用

    kubelet配置文件的时候也会同时调用这个文件,具体见kubelt的servier文件配置方法,这个文件是自动生成的。如果没有自动生产,检查所有配置参数和报错,特别是config和kublet文件。

    3、有关config文件并不是你从客户端拷贝过来的时候就直接可以用了,需要里面修改master地址,因为apiserver的配置启动参数绑定的地址中安全的访问地址是10.10.90.105:6443,不安全是127.0.0.1:8080,这里可以简单理解为6443是安全端口,不过只监听在master的10.10.90.105的ip上,所以要修改node中config配置文件的master地址为 10.10.90.90.105:6443,而如果你master节点同时也是node节点的话,我测试了这个形式,那么你的config文件只能用127.0.0.1:8080访问,使用6443也是不行的,也就是说本地和其他机器访问apiserver的方式不同时的,否则log中会狂报错无法连接api,这里注意一下,如果node复用了master节点同事需要重启scheduler和control服务。

    4、Failed at step CHDIR spawning /usr/local/bin/kubelet: No such file or directory 是没有创建 /var/lib/kubelt文件夹

    5、配置过程中一定要关闭防火墙,selinux,防止虚拟机重启了这些服务业自动重启。

    6、1.8后面的kubelet配置文件不需要--api-servers参数,请注释掉!!

    7、swap 分区请在/etc/fstab注释掉,并重启虚拟机和所有服务。

    8、node节点涉及的docker服务文件的修改,这里容易出现问题,文章中我会介绍。

    master文章说明:

      前面的master节点因为以前配置有问题,采用了其他apiversion,发现后面问题很多,并且缺少了node认证方式,我已经在更新了这一篇文正,请小伙伴们去查看相关文正

    并重启apiserver服务,另外1.9的kubelet启动参数和1.8也少许变化,如果你发现你/var/log/message文章用友unknown flag的报错,就是你的参数不识别了,可以参考我的文章看哪个参数有出入。

    好,上面只是一些我还有印象的注意事项,其他的请多多查看log文件排错。

    废话不多说,直接开始配置node节点了,再次感慨大家的支持和等待!。

    1、检查2个node节点配置文件和ssl证书是否齐全,这一步很重要。

    注意ssl里面有几个kubelet开头的文件 ,是通过过自动生成的文件。

    2、配置docker的服务文件

    因为需要docker联合flannel使用,所以需要修改docker的服务service文件

    我们前面是flannel插件是通过yum方式安装的,修改方式如下:

    修改docker的配置文件/usr/lib/systemd/system/docker.service,增加一条环境变量配置:
    
    EnvironmentFile=-/run/flannel/docker

    同时为start添加一个参数 --exec-opt native.cgroupdriver=systemd,这里的systemd和kubelet配置文件里面的--cgroup-drive相同即可,否则kubelet启动报错

    如图:

     修改配置参数后,重启docker服务

    systemctl restart docekr

     3、安装kubelet工具及配置

    kubelet是node节点安装的工具,我们依然从我们前面下载的server包的bin里面可以找到,同时还需要kube-proxy问,可以同时上传的文件夹的/usr/local/bin文件

    并且赋予可执行权限。

    注意事项:swap分区务必注释掉并重启服务器。

    配置前我们需要现在master节点上执行如下操作,创建认证角色:

    cd /etc/kubernetes
    kubectl create clusterrolebinding kubelet-bootstrap 
      --clusterrole=system:node-bootstrapper 
      --user=kubelet-bootstrap

    created成功后,我们回到node节点操作:

    我们已经获得了bin文件,开始配置相应的服务器文件

    添加配置文件kubelt:

    cd /etc/kubernetes
    cat > kubelet << EOF
    ###
    ## kubernetes kubelet (minion) config
    #
    ## The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
    KUBELET_ADDRESS="--address=10.10.90.106"
    #
    ## The port for the info server to serve on
    #KUBELET_PORT="--port=10250"
    #
    ## You may leave this blank to use the actual hostname
    KUBELET_HOSTNAME="--hostname-override=10.10.90.106"
    #
    ## location of the api-server
    ## COMMENT THIS ON KUBERNETES 1.8+
    #KUBELET_API_SERVER="--api-servers=http://172.20.0.113:8080"
    #
    ## pod infrastructure container
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=pause-amd64:3.0"
    #
    ## Add your own!
    KUBELET_ARGS="--cgroup-driver=systemd --cluster-dns=10.254.0.2 --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig  --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local --hairpin-mode promiscuous-bridge --serialize-image-pulls=false"
    EOF

    说明:里面的ip地址都为node节点的ip地址,其他节点相应就好就好,注意KUBELET_API_SERVER已经在1.8的时候不用了。注释掉。

    KUBELET_POD_INFRA_CONTAINER是指定pod运行的基础镜像,必须存在,我这里直接指定的是一个本地的镜像,镜像的或许地址为:
    docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 
    
    下载到本地后tag一下,方便使用,当然你也可以添加其他的公共pod基础镜像,在线地址也行,注意不要被墙就好。 docker tag registry.cn
    -hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 pause-amd64:3.0
    添加kubelt的服务文件/usr/lib/systemd/system/kubelet.service
    内容如下:
    [Unit]
    Description=Kubernetes Kubelet Server
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=docker.service
    Requires=docker.service
    
    [Service]
    WorkingDirectory=/var/lib/kubelet
    EnvironmentFile=-/etc/kubernetes/config
    EnvironmentFile=-/etc/kubernetes/kubelet
    ExecStart=/usr/local/bin/kubelet 
                $KUBE_LOGTOSTDERR 
                $KUBE_LOG_LEVEL 
                $KUBELET_API_SERVER 
                $KUBELET_ADDRESS 
                $KUBELET_PORT 
                $KUBELET_HOSTNAME 
                $KUBE_ALLOW_PRIV 
                $KUBELET_POD_INFRA_CONTAINER 
                $KUBELET_ARGS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target

    添加工作目录:不添加启动报错

    mkdir /var/lib/kubelet

    启动kubelt:

    systemctl daemon-reload
    systemctl enable kubelet
    systemctl start kubelet
    systemctl status kubelet

    4、接受node请求

    启动后,如果政策会自动向master节点发送验证加入请求,我们在master节点操作:

    kubectl get csr 
    
    #此命令可以看到所有请求,所有为pending状态,则是需要批准的
    
    kubectl certificate approve 节点name

    #此命令可以通过请求

    我这是是已经approve过了,显示为approved和issued状态。就正常了

    命令扩展:

    kubectl delete csr 节点名称 #删除单个节点的请求  

    kubectl delete csr --all  #删除所有节点请求

    kubectl  delete nodes  node名称  #删除加入的节点

    kubectl  delete nodes --all   #删除所有节点

    5、配置kube-proxy服务

    现安装个工具conntrack,具体是干什么的还不是很清楚:

    yum install -y conntrack-tools

    创建 kube-proxy 的service配置文件,路径/usr/lib/systemd/system/kube-proxy.service,内容:

    [Unit]
    Description=Kubernetes Kube-Proxy Server
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=network.target
    
    [Service]
    EnvironmentFile=-/etc/kubernetes/config
    EnvironmentFile=-/etc/kubernetes/proxy
    ExecStart=/usr/local/bin/kube-proxy 
            $KUBE_LOGTOSTDERR 
            $KUBE_LOG_LEVEL 
            $KUBE_MASTER 
            $KUBE_PROXY_ARGS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target

    添加配置文件/etc/kubernetes/proxy:内容为:

     proxy config
    
    # default config should be adequate
    
    # Add your own!
    KUBE_PROXY_ARGS="--bind-address=10.10.90.106 --hostname-override=10.10.90.106 --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --cluster-cidr=10.254.0.0/16"

    ip修改为本机ip即可。

    注意事项:

    --hostname-override 参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则;
    kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT;
    --kubeconfig 指定的配置文件嵌入了 kube-apiserver 的地址、用户名、证书、秘钥等请求和认证信息;
    预定义的 RoleBinding cluster-admin 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;

    启动proxy服务:

    systemctl daemon-reload
    systemctl enable kube-proxy
    systemctl start kube-proxy
    systemctl status kube-proxy

    补充知识点:

    有关node节点名称修改:

    在master上通过kubectl get node 获得的列表中,Name显示的名称是通过 客户端kubelet和proxy配置文件中hostname-override配置参数定义的,修改这2个参数为你想要的名称,并且删除kubelet.kubeconfig(这个文件是master认证后客户端自动生成的,如果不删除会报node节点forbidden)文件,重新启动着2个服务,master端重新 kubectl certificate approve name名称 就可以看到新名称。

     修改配置文件,不删除kubelet.kubeconfig文件会报错误:

    kubelet_node_status.go:106] Unable to register node "node2" with API server: nodes "node2" is forbidden: node "10.10.90.107" cannot modify node "node2"

    6、验证测试

    我们可以创建一个nginx部署验证集群是否正常:

    #delete是清理不用的所有pods,service和deployment,非必须执行
    kubectl delete pods --all
    kubectl delete service --all
    kubectl delete deployment --all
    
    这里以下是测试一个nginx集群部署的
    1、定义集群并启动
    kubectl run nginx --replicas=3 --labels="run=load-balancer-example" --image=nginx  --port=80
    2、定义集群服务
    kubectl expose deployment nginx --type=NodePort --name=example-service
    3、查看服务信息
    kubectl describe svc example-service
    4、查看pod状态,全为running既正常,否则使用kubectl describe pods {有问题的pod名称} 查看具体的报错。
    kubectl get pods

    其他电脑访问node节点+ip是可以访问的,创建service的有其他类型可以选择。

     

     

    再次提醒我后面的node节点是按照3台来装的,跟初始的设计不太一样,只不过不master也当成一台node了,到这里一个基本的集群就完成了,后面的还有辅助工具dns和图形化展示等功能,这两天慢慢补充。

  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/netsa/p/8279045.html
Copyright © 2011-2022 走看看