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组件 ——头悬梁的更多相关文章

  1. K8s二进制部署单节点 etcd集群,flannel网络配置 ——锥刺股

    K8s 二进制部署单节点 master    --锥刺股 k8s集群搭建: etcd集群 flannel网络插件 搭建master组件 搭建node组件 1.部署etcd集群 2.Flannel 网络 ...

  2. k8s二进制部署 - etcd节点安装

    下载etcd [root@hdss7-12 ~]# useradd -s /sbin/nologin -M etcd [root@hdss7-12 ~]# cd /opt/src/ [root@hds ...

  3. k8s二进制部署

    k8s二进制部署 1.环境准备 主机名 ip地址 角色 k8s-master01 10.0.0.10 master k8s-master02 10.0.0.11 master k8s-node01 1 ...

  4. 【原】docker部署单节点consul

    docker下部署单节点的consul,最重要的是在run consul时,配置-bootstrap-expect=1 docker run --name consul1 -d -p : -p : - ...

  5. 007 Ceph手动部署单节点

    前面已经介绍了Ceph的自动部署,本次介绍一下关于手动部署Ceph节点操作 一.环境准备 一台虚拟机部署单节点Ceph集群 IP:172.25.250.14 内核: Red Hat Enterpris ...

  6. k8s 二进制部署详解

    环境说明: 192.168.1.101 -- master01 + etcd01 192.168.1.102 -- etcd02 192.168.1.103 -- etcd03 192.168.1.1 ...

  7. 012.Kubernetes二进制部署worker节点Flannel

    一 部署flannel 1.1 安装flannel kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通.flannel 使用 vxlan 技术为各节点创建一 ...

  8. 013.Kubernetes二进制部署worker节点Nginx实现高可用

    一 Nginx代理实现kube-apiserver高可用 1.1 Nginx实现高可用 基于 nginx 代理的 kube-apiserver 高可用方案. 控制节点的 kube-controller ...

  9. 015.Kubernetes二进制部署所有节点kubelet

    一 部署 kubelet kubelet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如 exec.run.logs 等. k ...

随机推荐

  1. Oracle数据库用法汇总

    一些Oracle数据库用法的小总结 1.使用insert into创建新表 insert into destdb.sub_contract (userid,contractid) select msi ...

  2. CAS学习笔记三:SpringBoot自动配置与手动配置过滤器方式集成CAS客户端

    本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式集成CAS客户端. 需要提前搭建 CAS 服务端,参考 https://www.cnblogs.com/hell ...

  3. shc命令

    今天在公司看到业务系统有一个query.viewtx 等等命令.虽然不知道是什么语言写的,但是里边内容是看不到的. 如果是编译型语言这样的结果 我并不奇怪.但是如果我们写了一个shell脚本 如果加密 ...

  4. 什么是LTV,舔狗的LTV可以乘以N吗?

    依旧注意一下,数据类文章比较敏感,舔狗只是代词,千万不要以为我是舔狗. 之前我们探讨过如何对自己的用户进行分层:不知怎么选,用RFM模型看舔狗质量! 也探讨了如何判断自己适不适合海后(主播)这个业务: ...

  5. python 插入mysql数据库字符串中含有单引号或双引号报错

    出现问题场景:使用mysql数据库管理接口测试用例,新增接口用例时,传入的paras内容,有多层嵌套的时候,就会有["]双引号括住[']单引号的情况,可能在插入单双引号的数据到数据库的时候, ...

  6. 初识python 之 MongoDB 基本操作

    MongoDB与SQL对比: MongoDB 三元素:数据库.集合.文档 MongoDB 基本操作命令: db 查看当前数据库 show dbs 查看所有数据库 use 数据库名 切换数据库,如果数据 ...

  7. java mapreduce实现网站PV分析

    原文链接: https://www.toutiao.com/i6765677128022229517/ PV 是Page Views的缩写,即页面浏览量,用户每一次对网站中的每个网页访问均被记录一次. ...

  8. ADD software version display

    ADD software version display ADD software version display1. Problem Description2. Analysis3. Solutio ...

  9. Sentry 开发者贡献指南 - 测试技巧

    作为 CI 流程的一部分,我们在 Sentry 运行了多种测试. 本节旨在记录一些 sentry 特定的帮助程序, 并提供有关在构建新功能时应考虑包括哪些类型的测试的指南. 获取设置 验收和 pyth ...

  10. gin中的SecureJSON 防止 json 劫持

    使用 SecureJSON 防止 json 劫持.如果给定的结构是数组值或map,则默认预置 "while(1)," 到响应体. package main import ( &qu ...