Blog.092 K8S 单节点二进制部署 Day 2:master 组件与 node 组件的部署

本章目录

 

 

 

 

1. 部署 master 组件
2. 部署 node 组件

 

 

 

 

1. 部署 master 组件

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

1 ## 在 master01 上操作
2 
3 cd /opt/k8s/
4 unzip master.zip
5 apiserver.sh
6 scheduler.sh
7 controller-manager.sh
8  
9 chmod +x * .sh

 

 

    (2)创建 kubernetes 工作目录

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

 

 

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

1 ## 生成 CA 证书、相关组件的证书和私钥
2 
3 
4 mkdir /opt/k8s/k8s-cert
5 mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
6 cd /opt/k8s/k8s-cert/
7 ./k8s-cert.sh

 

    controller-manager 和 kube-scheduler 设置为只调用当前机器的 apiserver, 使用127.0.0.1:8080 通信,因此不需要签发证书。

 

 

 

 

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

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

 

 

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

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

 

 

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

1 cd /opt/k8s/kubernetes/server/bin
2 cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
3 1n -s /opt/kubernetes/bin/* /usr/local/bin/

 

 

  • 创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权;
 1 cd /opt/k8s/
 2 vim token.sh
 3 #!/bin/bash
 4 #获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
 5 BOOTSTRAP_TOKEN=$(head -e 16 /dev/urandom | od -An -t x | tr -d ‘ ’)
 6 #生成token.csv 文件,按照Token序列号,用户名,UID,用户组的格式生成
 7 cat > /opt/kubernetes/cfg/token.csv <<EOF
 8 ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
 9 EOF
10 chmod +x token.sh
11 ./token.sh
12  
13 ./apiserver.sh 192.168.229.90 https://192.168.229.90:2379,https://192.168.229.80:2379,https://192.168.229.70:2379

    使用 head -c 16 /dev/urandom | od -An -t x | tr -d ' '
    可以随机生成序列号,并创建 token.csv 文件,也可以使用脚本创建。

 

 

    二进制文件,token,证书都准备好,开启 apiserver;

 

  • 检查进程是否启动成功;
1 ps aux | grep kube-apiserver

 

 

    k8s 通过 kube- apiserver 这个进程提供服务,该进程运行在单个 master 节点上。

    默认有两个端口 6443 和 8080:
    安全端口 6443 用于接收 HTTPS 请求,用于基于 Token 文件或客户端证书等认证;
    本地端口 8080 用于接收 HTTP 请求,非认证或授权的 HTTP 请求通过该端口访问APIServer。

1 netstat -natp| grep 8080<br>netstat -natp | grep 6443

 

 

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

 

 

    (7)启动 scheduler 服务

1 cd /opt/k8s/
2 ./scheduler.sh 127.0.0.1
3  
4 ps aux | grep kube-scheduler

 

 

    (8)启动 controller-manager 服务

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

 

 

  • 查看节点状态
1 kubectl get cs

 

 

2. 部署 node 组件

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

1 ## 在 master1 节点上操作
2 
3 cd /opt/k8s/kubernetes/server/bin
4 scp kubelet kube-proxy root0192.168.229.80:/opt/kubernetes/bin/
5 scp kubelet kube-proxy root@192.168.229.70:/opt/kubernetes/bin/

 

 

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

1 ## 在 node1 节点上操作
2 
3 cd /opt/
4 unzip node.zip

 

 

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

1 ## 在 master1 节点上操作
2 
3 mkdir /opt/k8s/kubeconfig

 

 

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

1 cd /opt/k8s/kubeconfig
2 chmod +x kubeconfig.sh

 

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

 

 

    (5)生成 kubelet 的配置文件

1 cd /opt/k8a/kubeconfig
2 ./kubecontig.sh 192.168.229.90 /opt/k8s/k8s-cert/
3  
4 ls
5 bootstrap.kubeconfig kubeconfig.sh kube-proxy.kubeconfig

 

 

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

1 cd /opt/k8s/kubeconfig
2 scp bootstrap.kubeconfig kube-proxy-kubeconfig root0192.168.229.80:/opt/kubernetes/cfg/
3 scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.229.70:/opt/kubernetes/cfg/

 

 

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

1 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 生成一个证书,以后的访问都是用证书做认证了。


    (8)查看角色

1 kubectl get clusterroles | grep system:node-bootstrapper

 

 

    (9)查看已授权的角色

1 kubectl get clusterrolebinding

 

 

    (10)使用 kubelet.sh 脚本启动 kubelet 服务

1 cd /opt/
2 chmod +x kubelet.sh
3 ./kubelet.sh 192.168.229.80

 

 

    (11)检查 kubelet 服务启动

1 ps aux | grep kubelet

 

 

    (12)此时还没有生成证书

1 ls /opt/kubernetes/ssl/

 

 

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

1 ## 在 master1 节点上操作
2 
3 kubectl get csr

 

 

    (14)通过 CSR 请求

1 kubectl certificate approve node-csr-12DGPu__kpLSBsGUHpvGs6Q89B9aYysw9C61pAagDEA 

 

 

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

1 kubectl get csr

 

 

    (16)查看群集节点状态,成功加入 node1 节点

1 kubectl get nodes

 

 

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

1 ## 在 node1 节点上操作
2 
3 ls /opt/kubernetes/cfg/kubelet.kubeconfig
4 ls /opt/kubernetes/ssl/

 

 

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


    (18)加载 ip_vs 模块

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

 

 

 

 

 

    (19)使用 proxy.sh 脚本启动 proxy 服务

1 cd /opt/
2 chmod +x proxy.sh
3 ./proxy.sh 192.168.229.80
4  
5 systemctl status kube-proxy.service

 

 

    (20)node02 节点部署:方法①:在 node1 节点上将 kubelet.sh、 proxy.sh 文件拷贝到 node2 节点

1 cd /opt/
2 scp kubelet.sh proxy.sh root@192.168.229.70:/opt/

 

 

    (21)使用 kubelet.sh 脚本启动 kubelet 服务

1 cd /opt/
2 chmod +x kubelet.sh
3 ./kubelet.sh 192.168.229.70

 

 

    (22)在 master1 节点上操作,检查到 node2 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书

1 kubectl get csr

 

 

  • 通过 CSR 请求
1 kubectl certificate approve node-csr-NOI-name

 

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

 

 

    (23)查看群集节点状态,成功加入 node1 节点

1 kubectl get nodes

 

 

    (24)在 node2 节点加载 ip_vs 模块

1 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

 

 

    (25)使用 proxy.sh 脚本启动 proxy 服务

1 cd /opt/
2 chmod +x proxy.sh
3 ./proxy.sh 192.168.229.70
4  
5 systemctl status kube-proxy.service

 

 

    (26)测试连通性

1 kubectl create deployment nginx-test --image=nginx:1.14
2 kubectl get pod
3 kubectl get pod
4 kubectl describe pod nginx-test-7dc4f9dcc9-vlzmk

 

 

 

 

 

 

-

 

posted @ 2021-11-01 16:38  洛洛你好  阅读(124)  评论(0)    收藏  举报