K8s二进制部署单节点 master组件 node组件 ——头悬梁

K8s二进制部署单节点   master组件 node组件   ——头悬梁

 

1、master组件部署

2、node   组件部署

 

 

k8s集群搭建:

  • etcd集群
  • flannel网络插件
  • 搭建master组件
  • 搭建node组件

 

1、master组件部署:

创建工作目录
生成证书
准备k8s软件包
生成bootstrap token 认证文件
启动 apiserver
启动controller-manager、scheduler
验证master组件状态

 

1 ##### 在 master01 节点上操作 #####
 2 //上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包
 3 cd /opt/k8s/
 4 unzip master.zip
 5 apiserver.sh
 6 scheduler.sh
 7 controller-manager.sh
 8 
 9 chmod +x *.sh
10 
11 //创建kubernetes工作目录
12 mkdir -p /opt/kubernetes/{cfg,bin,ssl}
13 
14 //创建用于生成CA证书、相关组件的证书和私钥的目录
15 mkdir /opt/k8s/k8s-cert
16 mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
17 cd /opt/k8s/k8s-cert/
18 ./k8s-cert.sh                #生成CA证书、相关组件的证书和私钥
19 
20 ls *pem
21 admin-key.pem  apiserver-key.pem  ca-key.pem  kube-proxy-key.pem  
22 admin.pem      apiserver.pem      ca.pem      kube-proxy.pem      
23 //controller-manager 和 kube-scheduler 设置为只调用当前机器的 apiserver,使用 127.0.0.1:8080 通信,因此不需要签发证书
24 
25 //复制CA证书、apiserver相关证书和私钥到 kubernetes工作目录的 ssl 子目录中
26 cp ca*pem apiserver*pem /opt/kubernetes/ssl/
27 
28 //上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包
29 cd /opt/k8s/
30 tar zxvf kubernetes-server-linux-amd64.tar.gz
31 
32 //复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中
33 cd /opt/k8s/kubernetes/server/bin
34 cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
35 ln -s /opt/kubernetes/bin/* /usr/local/bin/
36 
37 //创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权
38 cd /opt/k8s/
39 vim token.sh
40 #!/bin/bash
41 #获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
42 BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
43 #生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
44 cat > /opt/kubernetes/cfg/token.csv <<EOF
45 ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
46 EOF
47 
48 chmod +x token.sh
49 ./token.sh
50 
51 cat /opt/kubernetes/cfg/token.csv
52 
53 //二进制文件、token、证书都准备好后,开启 apiserver 服务
54 cd /opt/k8s/
55 56 
57 //检查进程是否启动成功
58 ps aux | grep kube-apiserver
59 
60 //k8s通过kube-apiserver这个进程提供服务,该进程运行在单个master节点上。默认有两个端口6443和8080
61 //安全端口6443用于接收HTTPS请求,用于基于Token文件或客户端证书等认证
62 netstat -natp | grep 6443
63 
64 //本地端口8080用于接收HTTP请求,非认证或授权的HTTP请求通过该端口访问API Server
65 netstat -natp | grep 8080
66 
67 //查看版本信息(必须保证apiserver启动正常,不然无法查询到server的版本信息)
68 kubectl version
69 
70 
71 //启动 scheduler 服务
72 cd /opt/k8s/
73 ./scheduler.sh 127.0.0.1
74 
75 ps aux | grep kube-scheduler
76 
77 
78 //启动 controller-manager 服务
79 cd /opt/k8s/
80 ./controller-manager.sh 127.0.0.1
81 
82 
83 //查看 master 节点状态
84 kubectl get componentstatuses        #也可以 kubectl get cs
85 NAME                 STATUS    MESSAGE             ERROR
86 controller-manager   Healthy   ok                  
87 scheduler            Healthy   ok                  
88 etcd-2               Healthy   {"health":"true"}   
89 etcd-1               Healthy   {"health":"true"}   
90 etcd-0               Healthy   {"health":"true"}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2、node组件部署:

node搭建流程

  • 准备 kubelet kube-proxy 启动,停止等操作,用于管理kubelei和kube-proxy进程
  • 在master节点上准备kubelet和kube-proxy加入k8s群集所要使用的kubeconfig文件,并传给node节点
  • kubeconfig文件包含了加入k8s集群需要的ca证书,tls证书和私钥,bootstrap的token信息,master的apisever IP+端口(6443)
  • node节点启动kubelet,node节点的kublet会向master的apiserver发起CSR认证请求
  • 在Master节点上通过CSR认证,node会自动生成证书,以后的node的kubelet访问都会通过这个证书做认证
  • node节点上加载ipvs模块,再启动kube-proxy
1 ##### 在 master01 节点上操作 #####
  2 //把 kubelet、kube-proxy 拷贝到 node 节点
  3 cd /opt/k8s/kubernetes/server/bin
  4 scp kubelet kube-proxy root@192.168.208.20:/opt/kubernetes/bin/
  5 scp kubelet kube-proxy root@192.168.208.30:/opt/kubernetes/bin/
  6 
  7 
  8 ##### 在 node01 节点上操作 #####
  9 //上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh
 10 cd /opt/
 11 unzip node.zip
 12 
 13 
 14 ##### 在 master01 节点上操作 #####
 15 //创建用于生成kubelet的配置文件的目录
 16 mkdir /opt/k8s/kubeconfig
 17 
 18 //上传 kubeconfig.sh 文件到 /opt/k8s/kubeconfig 目录中
 19 #kubeconfig.sh 文件包含集群参数(CA 证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群 context 上下文参数(集群名称、用户名)。Kubenetes 组件(如 kubelet、kube-proxy)通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群,连接到 apiserver。
 20 cd /opt/k8s/kubeconfig
 21 chmod +x kubeconfig.sh
 22 
 23 //生成kubelet的配置文件
 24 cd /opt/k8s/kubeconfig
 25 ./kubeconfig.sh 192.168.80.10 /opt/k8s/k8s-cert/
 26 
 27 ls
 28 bootstrap.kubeconfig  kubeconfig.sh  kube-proxy.kubeconfig
 29 
 30 //把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点
 31 cd /opt/k8s/kubeconfig
 32 scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.208.20:/opt/kubernetes/cfg/
 33 scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.208.30:/opt/kubernetes/cfg/
 34 
 35 //RBAC授权,将预设用户 kubelet-bootstrap 与内置的 ClusterRole system:node-bootstrapper 绑定到一起,使其能够发起 CSR 请求
 36 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
 37 
 38 ------------------------------------------------------------------------------------------
 39 kubelet 采用 TLS Bootstrapping 机制,自动完成到 kube-apiserver 的注册,在 node 节点量较大或者后期自动扩容时非常有用。
 40 Master apiserver 启用 TLS 认证后,node 节点 kubelet 组件想要加入集群,必须使用CA签发的有效证书才能与 apiserver 通信,当 node 节点很多时,签署证书是一件很繁琐的事情。因此 Kubernetes 引入了 TLS bootstraping 机制来自动颁发客户端证书,kubelet 会以一个低权限用户自动向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署。
 41 
 42 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 认证请求。
 43 
 44 TLS bootstrapping 时的证书实际是由 kube-controller-manager 组件来签署的,也就是说证书有效期是 kube-controller-manager 组件控制的;kube-controller-manager 组件提供了一个 --experimental-cluster-signing-duration 参数来设置签署的证书有效时间;默认为 8760h0m0s,将其改为 87600h0m0s,即 10 年后再进行 TLS bootstrapping 签署证书即可。
 45 
 46 也就是说 kubelet 首次访问 API Server 时,是使用 token 做认证,通过后,Controller Manager 会为 kubelet 生成一个证书,以后的访问都是用证书做认证了。
 47 ------------------------------------------------------------------------------------------
 48 
 49 //查看角色:
 50 kubectl get clusterroles | grep system:node-bootstrapper
 51 
 52 //查看已授权的角色:
 53 kubectl get clusterrolebinding
 54 
 55 
 56 ##### 在 node01 节点上操作 #####
 57 //使用kubelet.sh脚本启动kubelet服务
 58 cd /opt/
 59 chmod +x kubelet.sh
 60 ./kubelet.sh 192.168.80.11
 61 
 62 //检查kubelet服务启动
 63 ps aux | grep kubelet
 64 
 65 //此时还没有生成证书
 66 ls /opt/kubernetes/ssl/
 67 
 68 
 69 ##### 在 master01 节点上操作 #####
 70 //检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书
 71 kubectl get csr
 72 NAME                                                   AGE     REQUESTOR           CONDITION
 73 node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA  2m      kubelet-bootstrap   Pending
 74 
 75 //通过 CSR 请求
 76 kubectl certificate approve node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA 77 
 78 //再次查看 CSR 请求状态,Approved,Issued 表示已授权 CSR 请求并签发证书
 79 kubectl get csr
 80 NAME                                                   AGE     REQUESTOR           CONDITION
 81 node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA   4m      kubelet-bootstrap   Approved,Issued
 82 
 83 //查看群集节点状态,成功加入node01节点
 84 kubectl get nodes
 85 NAME            STATUS   ROLES    AGE    VERSION
 86 192.168.80.11   Ready    
 87 
 88 
 89 ##### 在 node01 节点上操作 #####
 90 //自动生成了证书和 kubelet.kubeconfig 文件
 91 ls /opt/kubernetes/cfg/kubelet.kubeconfig
 92 ls /opt/kubernetes/ssl/
 93 
 94 //加载 ip_vs 模块
 95 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
 96 
 97 //使用proxy.sh脚本启动proxy服务
 98 cd /opt/
 99 chmod +x proxy.sh
100 ./proxy.sh 192.168.80.11
101 
102 systemctl status kube-proxy.service
103 
104 ---------- node02 节点部署 ----------
105 ##方法一:
106 //在 node01 节点上将 kubelet.sh、proxy.sh 文件拷贝到 node02 节点
107 cd /opt/
108 scp kubelet.sh proxy.sh root@192.168.208.20:/opt/
109 
110 ##### 在 node02 节点上操作 #####
111 //使用kubelet.sh脚本启动kubelet服务
112 cd /opt/
113 chmod +x kubelet.sh
114 ./kubelet.sh 192.168.208.30
115 
116 ##### 在 master01 节点上操作 #####
117 //在 master01 节点上操作查看 CSR 请求
118 kubectl get csr
119 NAME                                                   AGE   REQUESTOR           CONDITION
120 node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y   15s   kubelet-bootstrap   Pending
121 
122 //通过 CSR 请求
123 kubectl certificate approve node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y124 
125 kubectl get csr
126 NAME                                                   AGE   REQUESTOR           CONDITION
127 node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y   2m   kubelet-bootstrap    Approved,Issued
128 
129 //查看群集中的节点状态
130 kubectl get nodes
131 NAME            STATUS   ROLES    AGE    VERSION
132 192.168.80.11   Ready    
133 192.168.80.12   Ready    
134 
135 //加载 ipvs 模块
136 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
137 
138 //使用proxy.sh脚本启动proxy服务
139 cd /opt/
140 chmod +x proxy.sh
141 ./proxy.sh 192.168.80.12
142 
143 systemctl status kube-proxy.service
144 
145 ##方法二:
146 //在node01节点操作,把现成的/opt/kubernetes目录和kubelet、kube-proxy的service服务管理文件复制到其他node节点
147 scp -r /opt/kubernetes/ root@192.168.80.12:/opt/
148 scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.80.12:/usr/lib/systemd/system/
149 
150 //在node02节点上操作,进行修改
151 //首先删除复制过来的证书,等会node02会自行申请证书
152 cd /opt/kubernetes/ssl/
153 rm -rf *
154 
155 //修改配置文件kubelet、kubelet.config、kube-proxy的相关IP地址配置为当前节点的IP地址
156 cd /opt/kubernetes/cfg
157 vim kubelet
158 KUBELET_OPTS="--logtostderr=true \
159 --v=4 \
160 --hostname-override=192.168.80.12 \     #修改
161 ......
162 
163 vim kubelet.config
164 kind: KubeletConfiguration
165 apiVersion: kubelet.config.k8s.io/v1beta1
166 address: 192.168.80.12                    #修改
167 
168 vim kube-proxy
169 KUBE_PROXY_OPTS="--logtostderr=true \
170 --v=4 \ 
171 --hostname-override=192.168.80.12 \        #修改
172 
173 //加载 ipvs 模块
174 modprobe ip_vs
175 
176 //启动kubelet和kube-proxy服务并设置开机自启
177 systemctl start kubelet.service
178 systemctl enable kubelet.service
179 systemctl start kube-proxy.service
180 systemctl enable kube-proxy.service
181 
182 //到master01节点上发现未授权的node02请求,授权node02加入集群
183 kubectl get csr
184 NAME                                                   AGE   REQUESTOR           CONDITION
185 node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks   15s   kubelet-bootstrap   Pending
186 
187 //授权许可加入群集
188 kubectl certificate approve node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks
189 
190 kubectl get csr
191 
192 kubectl get nodes

 

 

 

 

 

 

 

 

 

 

部署node2节点

#把node1节点的/opt/kubernetes 目录复制到node2节点中(node1上操作)
scp -r /opt/kubernetes/ root@192.168.184.142:/opt

#拷贝启动脚本 (node1上操作)
scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.184.142:/usr/lib/systemd/system/

#删除所有证书文件
cd /opt/kubernetes/ssl/
rm -rf *

#修改kubelet配置文件IP地址
cd ../cfg
vim kubelet
KUBELET_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.184.142 \    #修改为node2节点本地地址
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet.config \
--cert-dir=/opt/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"

#修改kubelet.conf配置文件
vim kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.184.142                #修改为本地地址
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.2                        #DNS解析地址,需要记下来
clusterDomain: cluster.local.
failSwapOn: false
authentication:
  anonymous:
    enabled: true

#修改kube-proxy 配置文件
vim kube-proxy
KUBE_PROXY_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.184.142 \        #修改为本地地址
--cluster-cidr=10.0.0.0/24 \
--proxy-mode=ipvs \
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"

#启动服务
systemctl start kubelet
systemctl enable kubelet
systemctl start kube-proxy
systemctl enable kube-proxy

#master节点授权(master上操作)
kubectl get csr
kubectl certificate approve 节点2的名称
kubectl get csr

#master查看集群状态(master上操作)
kubectl get node

 

 

 

 

 

  

 

posted @ 2021-10-28 18:41  隐姓埋名4869  阅读(314)  评论(1编辑  收藏  举报