Kubernetes 的二进制部署(二)——单Master节点

目录

部署 master 组件

在 master01 节点上操作

上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包

cd /opt/k8s/
unzip master.zip
apiserver.sh
scheduler.sh
controller-manager.sh

chmod +x *.sh

  

创建kubernetes工作目录

mkdir -p /opt/kubernetes/{cfg,bin,ssl}

  

创建用于生成CA证书、相关组件的证书和私钥的目录

mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
./k8s-cert.sh #生成CA证书、相关组件的证书和私钥

ls *pem
admin-key.pem apiserver-key.pem ca-key.pem kube-proxy-key.pem
admin.pem apiserver.pem ca.pem kube-proxy.pem
//controller-manager 和 kube-scheduler 设置为只调用当前机器的 apiserver,使用 127.0.0.1:8080 通信,因此不需要签发证书

  

img

img

复制CA证书、apiserver相关证书和私钥到 kubernetes工作目录的 ssl 子目录中

cp ca*pem apiserver*pem /opt/kubernetes/ssl/

  

上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包

cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz

  

复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中

cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/

  

创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权

cd /opt/k8s/
vim token.sh
#!/bin/bash
#获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

chmod +x token.sh
./token.sh

cat /opt/kubernetes/cfg/token.csv

  

img

img

二进制文件、token、证书都准备好后,开启 apiserver 服务

cd /opt/k8s/
./apiserver.sh 192.168.73.10 https://192.168.73.10:2379,https://192.168.73.20:2379,https://192.168.73.30:2379

检查进程是否启动成功

ps aux | grep kube-apiserver

img

k8s通过kube-apiserver这个进程提供服务,该进程运行在单个master节点上。默认有两个端口6443和8080

安全端口6443用于接收HTTPS请求,用于基于Token文件或客户端证书等认证

netstat -natp | grep 6443

本地端口8080用于接收HTTP请求,非认证或授权的HTTP请求通过该端口访问API Server

netstat -natp | grep 8080 #v1.20版本使用 58080 作本地端口

查看版本信息(必须保证apiserver启动正常,不然无法查询到server的版本信息)

kubectl version

img

img

启动 scheduler 服务

cd /opt/k8s/
./scheduler.sh 127.0.0.1

ps aux | grep kube-scheduler

img

启动 controller-manager 服务

cd /opt/k8s/
./controller-manager.sh 127.0.0.1

查看 master 节点状态

kubectl get componentstatuses #也可以 kubectl get cs

img

部署 Worker Node 组件

在 master01 节点上操作

把 kubelet、kube-proxy 拷贝到 node 节点

cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.73.20:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.73.30:/opt/kubernetes/bin/

  

在 node01 节点上操作

上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh

cd /opt/
unzip node.zip

img

在 master01 节点上操作

创建用于生成kubelet的配置文件的目录

mkdir /opt/k8s/kubeconfig

上传 kubeconfig.sh 文件到 /opt/k8s/kubeconfig 目录中

#kubeconfig.sh 文件包含集群参数(CA 证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群 context 上下文参数(集群名称、用户名)。Kubenetes 组件(如 kubelet、kube-proxy)通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群,连接到 apiserver。
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh

生成kubelet的配置文件

cd /opt/k8s/kubeconfig
./kubeconfig.sh 192.168.73.10 /opt/k8s/k8s-cert/

img

把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点

cd /opt/k8s/kubeconfig
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.73.20:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.73.30:/opt/kubernetes/cfg/

  

img

RBAC授权,将预设用户 kubelet-bootstrap 与内置的 ClusterRole system:node-bootstrapper 绑定到一起,使其能够发起 CSR 请求

kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

  

------------------------------------------------------------------------------------------
kubelet 采用 TLS Bootstrapping 机制,自动完成到 kube-apiserver 的注册,在 node 节点量较大或者后期自动扩容时非常有用。
Master apiserver 启用 TLS 认证后,node 节点 kubelet 组件想要加入集群,必须使用CA签发的有效证书才能与 apiserver 通信,当 node 节点很多时,签署证书是一件很繁琐的事情。因此 Kubernetes 引入了 TLS bootstraping 机制来自动颁发客户端证书,kubelet 会以一个低权限用户自动向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署。

kubelet 首次启动通过加载 bootstrap.kubeconfig 中的用户 Token 和 apiserver CA 证书发起首次 CSR 请求,这个 Token 被预先内置在 apiserver 节点的 token.csv 中,其身份为 kubelet-bootstrap 用户和 system:kubelet-bootstrap 用户组;想要首次 CSR 请求能成功(即不会被 apiserver 401 拒绝),则需要先创建一个 ClusterRoleBinding,将 kubelet-bootstrap 用户和 system:node-bootstrapper 内置 ClusterRole 绑定(通过 kubectl get clusterroles 可查询),使其能够发起 CSR 认证请求。

TLS bootstrapping 时的证书实际是由 kube-controller-manager 组件来签署的,也就是说证书有效期是 kube-controller-manager 组件控制的;kube-controller-manager 组件提供了一个 --experimental-cluster-signing-duration 参数来设置签署的证书有效时间;默认为 8760h0m0s,将其改为 87600h0m0s,即 10 年后再进行 TLS bootstrapping 签署证书即可。

也就是说 kubelet 首次访问 API Server 时,是使用 token 做认证,通过后,Controller Manager 会为 kubelet 生成一个证书,以后的访问都是用证书做认证了。
------------------------------------------------------------------------------------------

查看角色:

kubectl get clusterroles | grep system:node-bootstrapper

查看已授权的角色:

kubectl get clusterrolebinding

img

在 node01 节点上操作

使用kubelet.sh脚本启动kubelet服务

cd /opt/
chmod +x kubelet.sh
./kubelet.sh 192.168.73.20

检查kubelet服务启动

ps aux | grep kubelet

img

此时还没有生成证书

ls /opt/kubernetes/ssl/

在 master01 节点上操作

检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书

kubectl get csr

img

通过 CSR 请求

再次查看 CSR 请求状态,Approved,Issued 表示已授权 CSR 请求并签发证书

kubectl get csr

查看群集节点状态,成功加入node01节点

kubectl get nodes

img

在 node01 节点上操作

自动生成了证书和 kubelet.kubeconfig 文件

ls /opt/kubernetes/cfg/kubelet.kubeconfig
ls /opt/kubernetes/ssl/

加载 ip_vs 模块

for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "[.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

使用proxy.sh脚本启动proxy服务

cd /opt/
chmod +x proxy.sh
./proxy.sh 192.168.73.20

systemctl status kube-proxy.service

img

node02 节点部署

在node01节点操作,把现成的/opt/kubernetes目录和kubelet、kube-proxy的service服务管理文件复制到其他node节点

scp -r /opt/kubernetes/ root@192.168.73.30:/opt/
scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.73.30:/usr/lib/systemd/system/

img

img

在node02节点上操作,进行修改

首先删除复制过来的证书,等会node02会自行申请证书

cd /opt/kubernetes/ssl/
rm -rf *

修改配置文件kubelet、kubelet.config、kube-proxy的相关IP地址配置为当前节点的IP地址

cd /opt/kubernetes/cfg
vim kubelet
KUBELET_OPTS="--logtostderr=true
--v=4
--hostname-override=192.168.73.30 \ #修改
......

vim kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.73.30 #修改

vim kube-proxy
KUBE_PROXY_OPTS="--logtostderr=true
--v=4
--hostname-override=192.168.73.30 \ #修改

img

img

img

加载 ipvs 模块

modprobe ip_vs

启动kubelet和kube-proxy服务并设置开机自启

systemctl start kubelet.service
systemctl enable kubelet.service
systemctl start kube-proxy.service
systemctl enable kube-proxy.service

到master01节点上发现未授权的node02请求,授权node02加入集群

kubectl get csr

img

授权许可加入群集

kubectl certificate approve node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks

kubectl get csr

kubectl get nodes

img

posted @ 2021-11-07 13:01  视觉装置在笑  阅读(162)  评论(1编辑  收藏  举报