🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命:  1.监视分配给该Node节点的pods  2.挂载pod所需要的volumes  3.下载pod的secret  4.通过docker/rkt来运行pod中的容器  5.周期的执行pod中为容器定义的liveness探针  6.上报pod的状态给系统的其他组件  7.上报Node的状态 ### 1、签发证书 签发证书  kubelet也对外提供https服务,apiserver主动找 kubelet问节点的一些信息,所以kubelet需要给自己签发server 证书, 而且server 证书还的列出 kubelet可能用到的所有节点,不能写IP段,如果要后加:重新签发新的证书,以前的节点不需要动,新的证书给新的机节点用,随后重启服务,但是这时候又两套证书 。 所以:以前的节点在流量低谷的时候,更新证书 ,然后节点重启 ``` vi /opt/certs/kubelet-csr.json { "CN": "k8s-kubelet", "hosts": [ "127.0.0.1", "10.4.7.10", "10.4.7.21", "10.4.7.22", "10.4.7.23", "10.4.7.24", "10.4.7.25", "10.4.7.26", "10.4.7.27", "10.4.7.28" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "beijing", "L": "beijing", "O": "od", "OU": "ops" } ] } ``` #### 生成证书 ``` cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kubelet-csr.json | cfssl-json -bare kubelet ``` #### 将证书发送到3台 kubelet机器上 ``` scp kubelet.pem kubelet-key.pem HDSS7-21:/opt/kubernetes/server/bin/cert/ ``` #### **set-cluster** 注意:在conf目录下: cd /opt/kubernetes/server/bin/conf ``` kubectl config set-cluster myk8s \ --certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem \ --embed-certs=true \ --server=https://10.4.7.10:7443 \ --kubeconfig=kubelet.kubeconfig 解释: kubectl config set-cluster myk8s \ --certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem \ 根证书ca指进来 --embed-certs=true \ 承载式证书 --server=https://192.168.206.70:7443 \ 指server=vip --kubeconfig=kubelet.kubeconfig 目的是要给kubectl做一个k8s用户,k8s客户体系很复杂,有普通、特殊等用户,这里是普通用户,要跟spiserver通信的时候要有一个接入点,接入点就是https://192.168.206.70:7443 ``` #### **set-credentials** 创建用户账号,即用户登陆使用的客户端私有和证书,可以创建多个证书 ``` kubectl config set-credentials k8s-node \ --client-certificate=/opt/kubernetes/server/bin/cert/client.pem \ --client-key=/opt/kubernetes/server/bin/cert/client-key.pem \ --embed-certs=true \ --kubeconfig=kubelet.kubeconfig 解释: kubectl config set-credentials k8s-node \ --client-certificate=/opt/kubernetes/server/bin/cert/client.pem \ 把client.pem放进来 --client-key=/opt/kubernetes/server/bin/cert/client-key.pem \ 把client-key.pem 放进来 --embed-certs=true \ --kubeconfig=kubelet.kubeconfig 把client.pem 、client-key.pem 放进来,说明我要跟apiuserver 通信,这时候spiserver 是我的服务端,我要拿客户端的你要要跟你通信,kubectl作为客户端。 ``` #### **set-context** 设置context,即确定账号和集群对应关系 ``` kubectl config set-context myk8s-context \ --cluster=myk8s \ --user=k8s-node \ --kubeconfig=kubelet.kubeconfig 解释: kubectl config set-context myk8s-context \ --cluster=myk8s \ --user=k8s-node \ 指定了一个user=k8s-node --kubeconfig=kubelet.kubeconfig ``` #### **use-context** 设置当前使用哪个context ``` kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig 解释: kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig   切换到k8s-node ``` ### 2、授权k8s-node用户 给name: k8s-node 授一个权限,利用rbac规则让他具有集群里面成为节点的权限 此步骤只需要在一台master节点执行(因为这两个节点,只要创建一次,他已经进入k8s,已经落入到etcd里面,无论在那个节点执行,他都已经把资源创建出来,因此需要在一台master节点执行) 授权 k8s-node 用户绑定集群角色 system:node ,让 k8s-node 成为具备运算节点的权限。 hdss-73 上执行: 我创建了一个k8s用户k8s-node,给k8s-node用户,授予集群权限,让他具备运算节点的节点的权限 ``` cd /opt/kubernetes/server/bin/conf vi 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 解释: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: k8s-node roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole 做了一个集群角色绑定,让kind:User 中name:k8s-node这个用户,具备集群角色,这个集群角色叫system:node name: system:node subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: k8s-node 资源:rbac建立权限也是一种资源,大致有apiVsersion、kind、metadata(元数据)下有名称name、roleRef、subjects ``` 启动yaml文件 ``` kubectl create -f k8s-node.yaml kubectl get clusterrolebinding k8s-node kubectl get clusterrolebinding k8s-node -o yaml ``` ![](https://img.kancloud.cn/99/d9/99d9d7bc53164eb1ed2eff2a21a7320f_820x389.png) #### 建kubelet.kubeconfig证书复制到其他两个节点 k8s-node.yaml 资源创建一次就行,他会自动把资源加载到etcd中,我们可以把他拷到其他节点 ``` scp kubelet.kubeconfig HDSS7-22:/opt/kubernetes/server/bin/conf/ scp kubelet.kubeconfig HDSS7-23:/opt/kubernetes/server/bin/conf/ ``` 3、装备pause镜像 kubectl在启动的时候,需要一个基础镜像,帮助我们启动pod,kubectl:接收请求把pod拉起来。kubectl 原理是他去调度docker,让docker引擎把容器真正拉起来,但是拉时候必须有一个基础镜像,基础镜像干什么:便车模式,一个小镜像,让kubectl 控制这个这个小镜像。先于我们业务容器起来,让他帮助我们给业务容器设置uts、nat、ipc, 他会先把命名空间占上,也就是业务容器还没有起来,我们的pod ip已经分配出来 **将pause镜像放入到harbor私有仓库中:** ``` docker pull kubernetes/pause docker tag f9d5de079539 harbor.od.com/public/pause:latest docker push harbor.od.com/public/pause:latest ``` ![](https://img.kancloud.cn/72/5c/725c8ce5b87610706fb067e153a1ed00_2015x660.png) ### 4、创建kubelet启动脚本 在node节点创建脚本并启动kubelet ``` vi /opt/kubernetes/server/bin/kubelet.sh #!/bin/sh ./kubelet \ --anonymous-auth=false \ --cgroup-driver systemd \ --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 ./cert/ca.pem \ --tls-cert-file ./cert/kubelet.pem \ --tls-private-key-file ./cert/kubelet-key.pem \ --hostname-override hdss7-21.host.com \ --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 harbor.od.com/public/pause:latest \ --root-dir /data/kubelet ``` #### 创建目录和授权 ``` chmod u+x /opt/kubernetes/server/bin/kubelet.sh mkdir -p /data/logs/kubernetes/kube-kubelet ``` #### 创建配置文件 ``` vi /etc/supervisord.d/kube-kubelet.ini [program:kube-kubelet] command=/opt/kubernetes/server/bin/kubelet.sh ; the program (relative uses PATH, can take args) numprocs=1 ; number of processes copies to start (def 1) directory=/opt/kubernetes/server/bin ; directory to cwd to before exec (def no cwd) autostart=true ; start at supervisord start (default: true) autorestart=true ; retstart at unexpected quit (default: true) startsecs=30 ; number of secs prog must stay running (def. 1) startretries=3 ; max # of serial start failures (default 3) exitcodes=0,2 ; 'expected' exit codes for process (default 0,2) stopsignal=QUIT ; signal used to kill process (default TERM) stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) user=root ; setuid to this UNIX account to run the program redirect_stderr=true ; redirect proc stderr to stdout (default false) stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log ; stderr log path, NONE for none; default AUTO stdout_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB) stdout_logfile_backups=4 ; # of stdout logfile backups (default 10) stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) stdout_events_enabled=false ; emit events on stdout writes (default false) ``` #### 更新配置查看服务启动情况 ``` supervisorctl update supervisorctl status ``` #### 查看node节点是否加到节点里面: ``` [root@hdss7-21 etcd]# kubectl get node NAME STATUS ROLES AGE VERSION hdss7-21.host.com Ready <none> 29h v1.15.4 hdss7-22.host.com Ready <none> 29h v1.15.4 hdss7-23.host.com Ready <none> 28h v1.15.4 ``` ### 5、修改节点角色(只是打标签,好看) 过滤相应的节点:假如生产环境,可以主控节点跟node运算节点物理分开部署、比如:主控节点除了部署apiserver,还有controller-manager、kube-scheduler都用容器镜像的方式托管到K8S,也装了kubectl ,不想主控节点运行业务节点,这时候用到标签选择器,给主控选择器打一个污点,让别的镜像不能容忍这个。 ``` [root@hdss7-21 etcd]# kubectl get node NAME STATUS ROLES AGE VERSION hdss7-21.host.com Ready <none> 29h v1.15.4 hdss7-22.host.com Ready <none> 29h v1.15.4 hdss7-23.host.com Ready <none> 28h v1.15.4 使用 kubectl get nodes 获取的Node节点角色为空,可以按照以下方式修改: kubectl label node hdss7-21.host.com node-role.kubernetes.io/master= kubectl label node hdss7-23.host.com node-role.kubernetes.io/node= [root@hdss7-21 etcd]# kubectl get node NAME STATUS ROLES AGE VERSION hdss7-21.host.com Ready master 29h v1.15.4 hdss7-22.host.com Ready master 29h v1.15.4 hdss7-23.host.com Ready node 28h v1.15.4 ```