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
K8s二进制部署单节点 master组件 node组件 ——头悬梁的更多相关文章
- K8s二进制部署单节点 etcd集群,flannel网络配置 ——锥刺股
K8s 二进制部署单节点 master --锥刺股 k8s集群搭建: etcd集群 flannel网络插件 搭建master组件 搭建node组件 1.部署etcd集群 2.Flannel 网络 ...
- k8s二进制部署 - etcd节点安装
下载etcd [root@hdss7-12 ~]# useradd -s /sbin/nologin -M etcd [root@hdss7-12 ~]# cd /opt/src/ [root@hds ...
- k8s二进制部署
k8s二进制部署 1.环境准备 主机名 ip地址 角色 k8s-master01 10.0.0.10 master k8s-master02 10.0.0.11 master k8s-node01 1 ...
- 【原】docker部署单节点consul
docker下部署单节点的consul,最重要的是在run consul时,配置-bootstrap-expect=1 docker run --name consul1 -d -p : -p : - ...
- 007 Ceph手动部署单节点
前面已经介绍了Ceph的自动部署,本次介绍一下关于手动部署Ceph节点操作 一.环境准备 一台虚拟机部署单节点Ceph集群 IP:172.25.250.14 内核: Red Hat Enterpris ...
- k8s 二进制部署详解
环境说明: 192.168.1.101 -- master01 + etcd01 192.168.1.102 -- etcd02 192.168.1.103 -- etcd03 192.168.1.1 ...
- 012.Kubernetes二进制部署worker节点Flannel
一 部署flannel 1.1 安装flannel kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通.flannel 使用 vxlan 技术为各节点创建一 ...
- 013.Kubernetes二进制部署worker节点Nginx实现高可用
一 Nginx代理实现kube-apiserver高可用 1.1 Nginx实现高可用 基于 nginx 代理的 kube-apiserver 高可用方案. 控制节点的 kube-controller ...
- 015.Kubernetes二进制部署所有节点kubelet
一 部署 kubelet kubelet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如 exec.run.logs 等. k ...
随机推荐
- javaScript系列 [43]-TS、Class and ES5
本文讨论Typescript中的Class同ES5构造函数的对应关系,涉及TypeScript的诸多语法.构造函数.面向对象以及原型对象等相关知识点细节,本文只简单对比并不进行深入展开. TypeSc ...
- POI导入导出Excel(HSSF格式,User Model方式)
1.POI说明 Apache POI是Apache软件基金会的开源代码库, POI提供对Microsoft Office格式档案读和写的功能. POI支持的格式: HSSF - 提供读写Microso ...
- 2 - 基于ELK的ElasticSearch 7.8.x技术整理 - java操作篇 - 更新完毕
3.java操作ES篇 3.1.摸索java链接ES的流程 自行创建一个maven项目 3.1.1.依赖管理 点击查看代码 <properties> <ES-version>7 ...
- JS 数组的基本使用和案例
知识点汇总: 数组:就是一组数据的集合,存储在单个变量的方式 自变量创建数组 var 数组名字 = ['a','b'] // []里面的是数据的元素,可为任意字符类型 利用new创建数组 var 数组 ...
- Android系统编程入门系列之硬件交互——通信硬件USB
在硬件交互的首篇对设备硬件的分类中,互联通信系列硬件主要用来与其他设备进行数据交互.从本文开始,将重点介绍该系列相关硬件. 互联通信系列硬件 根据硬件的可通信距离,由近及远分为USB.NFC.蓝牙.W ...
- Python_使用smtplib+email完成邮件发送
本文以第三方QQ邮箱服务器演示如何使用python的smtplib+email完成邮箱发送功能 一.设置开启SMTP服务并获取授权码 开启QQ邮箱SMTP服务 开启的最后一步是发送短信验证,获取 au ...
- [Win32] UAC用户账户控制 (提权)
最近写程序时遇到一个问题,就是当一个程序需要管理员权限才能正常运行该怎么办? 通过查阅多方资料,我总结出来几个比较实用的办法(每种办法实现方法不同,同时功能上也有一些小小的差异) 方法一(批处理脚本) ...
- mysql按照时间分组查询
mysql 按年.月.周.日分组查询 1.按照年份分组查询 SELECT DATE_FORMAT(t.bill_time,'%Y') month_time,sum(t.pay_price) total ...
- Visual Studio 2019 与 Visual Studio 2022的下载方式
相信大家目前百度或者其他搜索引擎搜索到的都是2022了,那么vs2019该如何安装呢? vs2019下载地址:https://visualstudio.microsoft.com/zh-hans/th ...
- RabbitMQ 中的分布式,普通 cluster 模式的构建
RabbitMQ 如何做分布式 前言 集群配置方案 cluster 普通模式 镜像模式 federation shovel 节点类型 RAM node Disk node 集群的搭建 1.局域网配置 ...