二进制部署k8s集群(5):部署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