k8s的二进制部署

|------------------|------------------------------------------------------------------------------|
| k8smaster1 | 20.0.0.71 kube-apiserver,kube-controller-manager,kube-scheduler,etcd |
| k8 slave | 20.0.0.72 kube-apiserver,kube-controller-manager,kube-scheduler |
| node01 | 20.0.0.73 kubelet,kube-proxy,etcd |
| node02 | 20.0.0.74 kubelet,kube-proxy,etcd |
| 负载均衡:nginx+keepalived ||
| master | 20.0.0.11 |
| backup | 20.0.0.12 |
| etcd集群 | 20.0.0.71(master1) |
| etcd集群 | 20.0.0.73(node1) |
| etcd集群 | 20.0.0.73(node2) |

1、统一配置master和node节点
(1)系统初始化配置
iptables -F:清除默认的 iptables 规则链
iptables -t nat -F:清除 "nat" 表中的所有规则
iptables -t mangle -F:清除 "mangle" 表中的所有规则
iptables -X:删除用户自定义的链
(2)关闭交换分区,提升性能(k8s在设计时,为了提升性能,默认是不使用swap交换分区,kubelet在初始化时,会检测swap是否关闭)
(3)修改主机名
(4)配置主机映射(/etc/hosts)
(5)编辑配置文件(/etc/sysctl.d/k8s.conf),调整内核参数
sysctl --system
(6)时间同步(所有节点)
yum install ntpdate -y
ntpdate ntp.aliyun.com

2、安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker.service
systemctl enable docker.service

3、部署组件etcd

|--------------------|------------------------------------------|
| ①存储k8s的集群信息和用户配置组件etcd ②etcd是一个高可用,分布式的键值存储数据库,采用raft算法保证节点的信息一致性,etcd是go语言写的 ③etcd一般都是集群部署,etcd也有选举leader的机制,至少有3台,或者奇数台 ||
| etcd的端口 | 2379:api接口, 对外 为客户端提供 通信 |
| etcd的端口 | 2380: 内部 服务的 通信 端口 |
| k8s的内部通信依靠证书认证,密钥认证:证书的签发环境 ||
| cfssl | 证书签发的命令工具 |
| cfssl-certinfo | 查看证书信息的工具 |
| cfssljson | 把证书的格式化转化成json格式,编程文件的承载式证书 |

(1)主节点操作:准备cfssl证书生成工具
chmod +x /usr/local/bin/cfssl*
(2)生成Etcd证书
①修改配置文件:vim etcd-cert.sh
②配置文件etcd.sh:创建etcd的配置文件和启动脚本
③赋权:chmod 777 etcd-cert.sh etcd.sh
(3)创建用于生成CA证书、etcd 服务器证书以及私钥的目录
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
生成CA证书、etcd 服务器证书以及私钥 ./etcd-cert.sh

|---------------------|---------------------------------------|
| ca-config.json | 证书颁发机构的配置文件,定义了证书生成的策略,默认的过期时间和模版 |
| ca-csr.json | 签名的请求文件,包括一些组织信息和加密方式 |
| ca.pem | 根证书文件,用于给其他组件签发证书 |
| server.csr | etcd的服务器签发证书的请求文件 |
| server-key.pem | etcd服务器的私钥文件 |
| ca.csr | 根证书签发请求文件 |
| ca-key.pem | 根证书的私钥文件 |
| etcd-cert.sh | |
| server-csr.json | 用于生成etcd的服务器证书和私钥签名文件 |
| server.pem | etcd服务器的证书文件,用于加密和认证etcd节点之间的通信 |

4 )上传etcd-v3.4.9-linux-amd64.tar.gz到/opt/k8s目录中,启动etcd服务
①创建用于存放etcd配置文件,命令文件,证书的目录:mkdir -p /opt/etcd/{cfg,bin,ssl}
mkdir -p /opt/etcd/{cfg,bin,ssl}
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
②生成配置文件
./etcd.sh etcd01 20.0.0.71 etcd02=https:// 20.0.0.73 :2380,etcd03=https:// 20.0.0.74 :2380
③把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
scp -r /opt/etcd/ root@ 20.0.0.73 :/opt/
scp -r /opt/etcd/ root@ 20.0.0.74 :/opt/
scp /usr/lib/systemd/system/etcd.service root@ 20.0.0.73 :/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@ 20.0.0.74 :/usr/lib/systemd/system/
④修改node节点上的配置文件
⑤启动etcd服务(依次起master到node节点,查看etcd的健康状态(谁先起谁就是leader)
systemctl start etcd
systemctl enable etcd
systemctl status etcd
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://20.0.0.71:2379,https://20.0.0.73:2379,https://20.0.0.74:2379" endpoint health --write-out=table
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://20.0.0.71:2379,https://20.0.0.73:2379,https://20.0.0.74:2379" --write-out=table member list

4、部署Master组件

1 )上传master.zip和k8s-cert.sh到/opt/k8s目录中,解压master.zip压缩包
unzip master.zip
chmod +x *.sh
2 修改配置文件
①vim k8s-cert.sh
②vim controller-manager.sh
③vim scheduler.sh
④vim admin.sh

|-------------|-------------------------------------------------------------------------|
| Context | 上下文 |
| | 定义连接到哪个k8s集群,以及使用哪个用户的身份进行操作,上下文包含集群、用户、可选命名空间的信息。目的:在k8s的集群环境中进行切换 |

(3)创建kubernetes工作目录:
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
(4)创建用于生成CA证书、相关组件的证书和私钥的目录
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
生成CA证书、相关组件的证书和私钥 ./k8s-cert.sh
(5)复制CA证书、apiserver相关证书和私钥到 kubernetes工作目录的 ssl 子目录中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
(6)上传kubernetes-server-linux-amd64.tar.gz到/opt/k8s/目录中,解压kubernetes 压缩包
cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz
(7)复制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/
(8)创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 进行授权
vim token.sh
chmod 777 token.sh
./token.sh
cat /opt/kubernetes/cfg/token.csv
(9)二进制文件、token、证书都准备好后,开启apiserver服务
./apiserver.sh 20.0.0.71 https://20.0.0.71:2379,https://20.0.0.73:2379,https://20.0.0.74:2379
(10)启动服务
①启动scheduler服务:./scheduler.sh
②启动controller-manager服务:./controller-manager.sh
③生成kubectl连接集群的kubeconfig文件:./admin.sh
④查看集群的状态:通过kubectl工具查看当前集群组件状态:kubectl get cs
⑤查看集群的版本:kubectl version
kubectl api-resources:调用api所有接口的信息
主节点配置完成

5、部署node节点

(1)创建kubernetes工作目录:mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
(2)上传node.zip到/opt目录中,解压node.zip压缩包,获得kubelet.shproxy.sh
unzip node.zip
chmod +x kubelet.sh proxy.sh
(3)配置主节点master
①把kubelet、kube-proxy拷贝到node节点
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@ 20.0.0.73 :/opt/kubernetes/bin/
scp kubelet kube-proxy root@ 20.0.0.7 4:/opt/kubernetes/bin/
②上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
./kubeconfig.sh 20.0.0.71 /opt/k8s/k8s-cert/
③把配置文件bootstrap.kubeconfig、kube-proxy.kubeconfig拷贝到node节点
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@20.0.0.73:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@20.0.0.74:/opt/kubernetes/cfg/
④RBAC授权,生成和赋权用户kubelet-bootstrap发起node节点的请求认证,通过CSR加密认证实现node节点加入到集群当中,kubelet获取master的验证信息和获取api-server接口的通信认证
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
node节点2同步以下操作:
(4)配置node节点1, 启动 kubelet 服务
cd /opt/
./kubelet.sh 20.0.0.7 3
./kubelet.sh 20.0.0.74
ps aux | grep kubelet
(5)在master节点上操作,通过CSR请求
①检查到 node1节点的kubelet发起的CSR请求,Pending表示等待集群给该节点签发证书
kubectl get csr
②通过CSR请求

kubectl certificate approve node-csr-zWucFS9bvLxR36tCtTKOkmaKIvk6aAraWUGJbBL21Rk

③查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady
kubectl get node
(6)在node1节点上操作(启动proxy服务)
①加载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服务
cd /opt/
./proxy.sh 20.0.0.73
./proxy.sh 20.0.0.74
ps aux | grep proxy

6、k8s的网络类型

1 k8s中的通讯模式

|--------------------------------------------------------------------------------------------------------------------------------------------|
| pod内部之间容器与容器之间的通信: |
| 1、在 同一pod 中的容器共享资源和网络, 使用同一个网络命名空间,可以直接通信 |
| 2、 同一个node节点之内, 不同pod 之间的通信 ①每一个pod都有一个全局的真实的ip地址,同一个node之间的不同pod可以直接使用对方pod的IP地址进行通信 ②pod1和pod2是通过docker0的网桥来进行通信 |
| 3、 不同node节点上的pod 之间如何进行通信 |

2 cni的插件和calico的插件

|---------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
| cni网络组件(flannel、calico) ||
| cni | cni是一个标准接口,用于容器运行时调用网络插件,配置容器网络,负责设置容器的网络命名空间,IP地址和路由等等参数 |
| flannel插件 | 作用:让集群中不同节点的docker容器具有全集群唯一的虚拟ip地址 ①使用overlay网络,在底层物理网络的基础上,创建一个逻辑的网络层,二层+三层的集合,二层是物理网络,三层是逻辑上的网络层 ②overlay网络是一种网络虚拟化技术 |
| flannel支持的数据转发方式: ||
| UDP模式 | 默认模式,应用转发,配置简单,但是性能最差 (使用少) |
| UDP:基于应用转发, flannel提供路由表 ,flannel 封装数据包 ,解封装 ①node都会有一个flannel的虚拟网卡 ②UDP的工作模式 ||
| vxlan模式 | 基于内核转发,也是最常用的网络类型(小集群都使用)------使用最多 |
| vxlan:使用的就是overlay的虚拟隧道通信技术(二层+三层的模式) ①udp基于应用层,用户 ②vxlan: flannel提供路由表、识别对应的vni的IP地址,由内核封装、解封装 ③网络接口:flannel1.1接口 ④vxlan的工作模式 ||
| host-gw模式 | 性能最好(网络层),但是配置麻烦(了解-很少使用) |
| 总结flannel | flannel:对每个发向容器的数据包进行封装,vxlan通过vtep打包数据,内核封装数据包,再转发到目标node节点,到了目标node节点还有个解封装的过程,再发送到目标pod,传输过程中的性能有一定影响 |
| calico插件 | ①采用 直接路由 的方式, BGP路由 ,不需要修改报文,统一直接通过路由表转发,路由表会很复杂,运行维护的要求比较高,适用于大集群 ②不使用overlay,也不需要交换,直接通过虚拟路由实现,每台虚拟路由都通过BGP转发 |
| BGP模式 | 特点:交换路由信息的外部网关协议,可以连接不同的node节点,node节点可能不是一个网段,BGP实现可靠的、最佳的、动态的路由选择,自动识别相邻的路由设备 |
| calico的核心组件: ||
| felix | 也是运行在主机上的一个个pod(进程),通过k8s的daemonset的方式部署的pod,负责在宿主机上插入裸游规则,维护calico所需的网络设备(网络接口管理,网络接口的监听、路由等等) ①daemonset会在每个node节点部署相同的pod,以后台运行的方式 |
| BGP client (bird) | ①BGP的客户端,专门负责在集群中分发路由规则的信息,每个节点都会有一个BGP client ②BGP协议以广播的方式通知其他节点,分发路由的规则,实现网络互通 |
| etcd | 保存路由信息,负责网络元数据的一致性(元数据:保证整个网络状态的一致和准确) |
| calico的工作原理: (路由转发) 由路由表维护每个pod之间的通信,创建好pod之后,添加一个设备cali,veth pair设备 veth pair (虚拟网卡):veth pair是一对设备,虚拟的以太网设备, 一头连接在容器的网络命名空间(eth0),另一头连接宿主机的网络命名空间(cali) ②IP地址分配: veth pair连接容器的部分,会给容器分配一个IP地址(唯一标识),宿主机也会被veth pair设备分配一个calico网络的内部IP地址,和其他节点上的容器进行通信 ||
| calico的工作流程: veth设备,容器发出的IP地址通过 veth pair设备到宿主机,宿主机根据路由规则的下一跳地址,发送到网关(目标宿主机),数据包到达目标宿主机,通过veth pair设备,目标宿主机也是根据路由规则、下一跳地址,转发到目标容器 ||
| 在ipip模式中,会生成一个tunel(隧道),数据包都在tunel内部打包,封装:宿主机IP和容器内部的IP地址 ||
| 总结: 1、k8s中,常用的网络类型flannel和calico (1)flannel:配置简单,功能简单,基于overlay叠加网络实现,在物理层的网络再封装一个虚拟的网络 ①vxlan是虚拟三层网络,使用最多的模式,是vni+IP进行转发,flannel提供路由表,内核封装和解封装,由于进行封装和解封装,对数据传输的性能会有影响,不具备网络策略的配置能力(基于udp协议),默认网段是:10.244.0.0/16 ②udp是默认模式 ③host-gw (2)calico:功能强大,基于路由表进行转发,没有封装和解封装的过程,具备网络策略的配置能力,但是路由表维护起来比较复杂 ①模式:ipip模式、BGP模式 ②BGP模式:通过IP路由表的前缀来实现目标主机的可达性,对比ipip模式,BGP模式没有隧道。BGP模式下,pod的数据包直接通过网卡发送到目的地 ③ipip模式:在隧道进行数据包的封装(ipv4------ipv4,外面:宿主机IP,里面:容器IP) 2、简单的小集群:flannel 3、需要扩容、配置网络策略:calico ||

3 配置flannel
①配置自动补齐
source <(kubectl completion bash)
②node节点配置flannel
docker load -i flannel.tar
mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin/
③配置主节点master
kubectl apply -f kube-flannel.yml
kubectl get pod -n kube-system
kubectl get pod -o wide -n kube-system
4 配置calico(每创建一个pod,就生成一个路由网卡、IP条目)
①上传calico.yaml文件到/opt/k8s目录中,部署CNI网络
cd /opt/k8s
vim calico.yaml
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
kubectl get node
②创建pod:kubectl create deployment nginx1 --image=nginx:1.22 --replicas=3

7、部署coredns组件:为集群中的service资源创建一个域名和IP进行对应解析的关系

1 service:对外提供访问的地址,加入DNS机制,可以直接访问服务名
2 )在所有node节点上操作
cd /opt
docker load -i coredns.tar
3 )master节点上操作:上传coredns.yaml文件到/opt/k8s目录中,部署CoreDNS
cd /opt/k8s
kubectl apply -f coredns.yaml
kubectl get pods -n kube-system
4 )DNS解析测试
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
kubectl run -it --rm dns-test --image=busybox:1.28.4 sh

8、部署多节点slave

1 )操作系统初始化配置
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a
(2)同步操作:映射
(3)调整内核参数:vim /etc/sysctl.d/k8s.conf
sysctl --system
(4)配置时间同步
yum install ntpdate -y
ntpdate ntp.aliyun.com
(5)远程从master节点上复制配置文件
scp -r /opt/etcd/ root@ 20.0.0.7 2:/opt/
scp -r /opt/kubernetes/ root@ 20.0.0.7 2:/opt
scp -r /root/.kube root@ 20.0.0.7 2:/root
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@20.0.0.72:/usr/lib/systemd/system/
(6)修改配置文件kube-apiserver中的IP:vim /opt/kuber netes/cfg/kube-apiserver
7 启动服务
systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service
ln -s /opt/kubernetes/bin/* /usr/local/bin/
kubectl get nodes
kubectl get nodes -o wide
kubectl get cs

9、部署负载均衡器nginx+keepalived

1 )修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口
vim /usr/local/nginx/conf/nginx.conf
stream {
log_format main 'remote_addr upstream_addr - $time_local status upstream_bytes_sent';
access_log /usr/local/nginx/logs/k8s-access.log main;
upstream k8s-apiserver {
server 20.0.0.71:6443;
server 20.0.0.72:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx

(2)部署keepalived服务

yum install keepalived -y
②修改"主"的配置文件: vim /etc/keepalived/keepalived.conf
③"主"上创建nginx监控脚本:vim /usr/local/nginx/check_nginx.sh
chmod +x /usr/local/nginx/check_nginx.sh
④配置"从"的配置文件: vim /etc/keepalived/keepalived.conf
⑤启动nginx和keepalived服务(先nginx、再keepalived)
systemctl start keepalived
systemctl enable keepalived

(3)测试:(关闭nginx、VIP地址漂移;再重启nginx、keepalived)

①问题:出现脑裂,nginx2识别不到nginx1的主,
Dec 27 16:41:31 nginx2 Keepalived_vrrp5993: VRRP_Instance(VI_1) Entering BACKUP STATE
Dec 27 16:41:31 nginx2 Keepalived_vrrp5993: VRRP sockpool: ifindex(2), proto(112), unicast(0), fd(10,11)
Dec 27 16:41:35 nginx2 Keepalived_vrrp5993: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 27 16:41:36 nginx2 Keepalived_vrrp5993: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 27 16:41:36 nginx2 Keepalived_vrrp5993: VRRP_Instance(VI_1) setting protocol VIPs.
②解决:主从分别关闭iptables
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
10、修改node节点上的配置文件

11、安装dashboard:仪表板(kubelet的可视化界面),在这个可视化界面上,可以对k8s集群进行管理

(1)上传recommended.yaml文件到/opt/k8s目录中
cd /opt/k8s
kubectl apply -f recommended.yaml
(2)创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
获取token值
kubectl describe secrets -n kube-system (kubectl -n kube-system get secret \| awk '/dashboard-admin/{print 1}')
(3) 使用输出的token登录Dashboard https:// 20.0.0.7 3:30001
相关推荐
碳基硅坊31 分钟前
Spring AI:把大模型接进 Spring 应用
java·人工智能·spring ai
黄毛火烧雪下39 分钟前
Java 核心知识点总结(一)
java·开发语言
技术小结-李爽1 小时前
【工具】Maven的下载、安装、使用
java·maven
极创信息1 小时前
Linux挖矿病毒深度清理实战教程,从进程隐藏、Rootkit驻留到彻底根除
java·大数据·linux·运维·安全·tomcat·健康医疗
努力成为AK大王1 小时前
并发编程的核心挑战、优化方案与核心知识点总结
java·开发语言·数据库
蘋天纬地1 小时前
k8s的控制平面是什么,有什么作用
容器·kubernetes
云烟成雨TD1 小时前
Agent Scope Java 2.x 系列【10】技能(Skill)
java·人工智能·agent
摇滚侠1 小时前
SpringMVC 入门到实战 DispatcherServlet 源码解读 92-95
java·后端·spring·maven·intellij-idea
键盘歌唱家2 小时前
Spring AI 入门分享:它和“直接调 API“到底差在哪
java·人工智能·spring
宸丶一2 小时前
Day 10:LangGraph - Agent 的图执行引擎
java·windows·python