二进制部署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

 

posted @ 2020-07-02 23:23  民工黑猫  阅读(1048)  评论(0编辑  收藏  举报