k8S的二进制搭建master单节点

K8S的二进制部署

k8s集群master01:192.167.226.70
k8s集群work node01:192.168.226.40
k8s集群worknode02:192.168.226.50

etcd集群节点01:192.168.226.70
etcd集群节点02:192.168.226.40
etcd集群节点03:192.168.226.50
因环境的受限,先将etcd存储中心,放在集群之中。

部署etcd集群

etcd是Coreos团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。
etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。

etcd目前默认使用2379端口提供HTTP
API服务,2380端口和peer通信
即etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器间内部通讯。
etcd在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台。

准备签发证书环境

CFSSL是cloudFlare公司开源的一款 PKI/TLS 工具。CFSSL包含一个命令行工具和一个用于签名、验证和拥绑TLS证书的 wpAPI 服务。使用Go语言编写。

CFSSL使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CSSL提供了方便的命令行生成配置文件。
CFSSL用来为etcd提供TLS 证书,它支持签三种类型的证书

1、client 证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份
2、server证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份
3、peer 证书,相互之间连接时使用的证书
这里全部都使用同一套证书认证。

一,在master上操作部署etcd

1,将证书签发的工具上传到/usr/local/bin目录下。并给予可执行权限。
在这里插入图片描述
2,创建k8s工作目录

mkdir /opt/k8s
cd /opt/k8s/

上传etcd-cert.sh和etcd.sh到/opt/k8s/目录中
chmod +x etcd-cert.sh etcd.sh

//创建用于生成CA证书、etcd服务器证书以及私钥的目录

mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/ 		#检查一下脚本文件中的ip地址是否符合自己的要求
./etcd-cert.sh
#生成CA证书、etcd 服务器证书以及私钥

3,master启动etcd服务

//上传 etcd-v3.3.10-linux-amd64.tar.gz到/opt/k8s/目录中,解压 etcd压缩包
cd /opt/k8s/
tar zxvf etcd-v3.3.10-linux-amd64.tar.gz

//创建用于存放etcd配置文件,命令文件,证书的目录

mkdir -p /opt/etcd/{cfg,bin,ssl}
cd /opt/k8s/etcd-v3.3.10-linux-amd64/

mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
./etcd.sh etcd01 192.168.226.70 etcd02=https://192.168.226.40:2380,etcd03=https://192.168.226.50:2380
#启动后会卡住,正常现象,等我们将node节点的配置完后即可。

4,配置node节点etcd服务,并启动

//将master节点的配置文件上传到node的目录中。
scp -r /opt/etcd/ roote192.168.226.40:/opt/
scp -r /opt/etcd/ roote192.168.226.50:/opt/
#注意,要将/opt/etcd/cfg/etcd文件中的ip地址和ETCD_NAME字段修改一下。
#修改为本主机对应的ip地址和ETCD_NAME

例如50节点
在这里插入图片描述
ETCD_NAME字段 40则为etcd02

//把etcd服务管理文件拷贝到另外两个etcd集群节点
cd /usr/lib/systemd/system/
scp etcd.service root@192.168.226.40:/usr/lib/systemd/system/
scp etcd.service root@192.168.226.50:/usr/lib/systemd/system/

//启动etcd服务
systemctl start etcd
systemctl enable etcd
systemctl status etcd

5,检查etcd的服务在master01 节点上操作

ln -s /opt/etcd/bin/etcd* /usr/local/bin

//检查etcd群集状态

etcdctl 
--ca-file=ca.pem \
--cert-file=server.pem \
--key-file=server-key.pem \
--endpoints="https://192.168.226.70:2379,https://192.168.226.40:2379,https://192.168.226.50:2379" cluster-health

//切换到etcd3版本查看集群节点状态和成员列表

export ETCDCTL_API=3		#v2和v3命令略有不同,etcd2和etcd3也是不兼容的,默认是v2版本
etcdctl --write-out=table endpoint status
etcdctl --write-out=table member list
export ETCDCTL_API=2
#再切回v2版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二,部署docker引擎

所有node节点部署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

三,部署flannel网络

概述

K8S 中Pod 网络通信

1,Pod内容器与容器之间的通信
在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命令空间,
相当于它们在同一台机器上一样,可以用localhost地址访问彼此的端口。

2,同一个Node内Pod之间的通信
每个 Pod 都有一个真实的全局IP地址,同一个Node 内的不同Pod 之间可以直接采用对方 Pod的IP 地址进行通信,
Podl与Pod2都是通过veth连接到同一个docker0 网桥,网段相同,所以它们之间可以直接通信。

3,不同Node上Pod 之间的通信
Pod 地址与 docker0在同一网段,docker0网段与宿主机网卡是两个不同的网段,且不同Node之间的通信只能通过宿主机的物理网卡进行。
要想实现不同Node上Pod之间的通信,就必须想办法通过主机的物理网卡ⅠP地址进行寻址和通信。
因此要满足两个条件:Pod 的IP不能冲突;将Pod 的IP和所在的Node的IP 关联起来,通过这个关联让不同 Node上Pod之间直接通过内网IP地址通信。

overlay Network

叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来(类似于VPN)。

VXLAN:

将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并j将数据发送给目标地址。

Flannel

Flannel的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟IP地址。
Flannel是 overlay网络的一种,也是将TCP源数据包封装在另一种网络包里面进行路由转发和通信

Flannel 工作原理

数据从node01 上. Pod的源容器中发出后,经由所在主机的 docker0虚拟网卡转发到 flannel0虚拟网卡,flanneld 服务监听在flannel0虚拟网卡的另外一端。
Flannel通过 Etcd 服务维护了一张节点间的路由表。源主机 node01的 flanneld 服务将原本的数据内容封装到UDP中后根据自己的路由表通过物理网卡投递给目的节点node02 的 flanneld 服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,之后被转发到目的主机的 docker0虚拟网卡,最后就像本机容器通信一样由docker0转发到目标容器。

ETCD 之Flannel提供说明

存储管理Flannel可分配的IP地址段资源
监控ETCD中每个Pod的实际地址,并在内存中建立维护 Pod节点路由表

一,在master节点上部署
//添加 flannel 网络配置信息,写入分配的子网段到etcd 中,供 flannel 使用
etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https//:192.168.226.70:2379,https://192.168.226.40:2379,httpds://192.168.226.50:2379"  set /coreos.com/network/config '{"Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'

/查看写入的信息
etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https//:192.168.226.70:2379,https://192.168.226.40:2379,httpds://192.168.226.50:2379"  get /coreos.com/network/config
二,在node节点上部署

1,上传flannel.sh和Iflannel-v0.10.O-linux-amd64.tar.gz
cd / opt
tar zxvf flannel-v0.10.0-linux-amd64.tar.gz

//创建kubernetes工作目录
mkdir -p /opt/kubernetes/{cfg,bin,ssl}
cd /opt
mv mk-docker-opts.sh flanneld /opt/kubernetes/bin/

//启动flanneld服务,开启flannel网络功能
cd /opt
chmod +x flannel.sh
./flannel.sh https://192.168.226.70:2379,https://192.168.226.40:2379,https://192.168.226.50:2379

2,配置与docker关联

flannel启动后会生成一个docker网络相关信息配置文件/run/flannel/subnet.env,包含了docker要使用flannel通讯的相关参数

#40节点
cat / run/flannel/ subnet.env
DOCKER_OPT_BIP="--bip=172.17.89.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=172.17.89.1/24 --ip-masq=false --mtu=1450"

#50节点
DOCKER_OPT_BIP="--bip=172.17.3.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=172.17.3.1/24 --ip-masq=false --mtu=1450"

3,配置docker.server文件

//修改docker服务管理文件,配置docker连接flannel
vim /usr/lib/systemd/system/docker.service
....
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

在这里插入图片描述
4,重启服务
systemctl daemon-reload
systemctl restart docker

三,查看docker0 IP验证一下

在这里插入图片描述
在这里插入图片描述
可以看到docker0的ip已经改变了

四,部署kubectl,apiserver等master节点服务。

在 master01 节点上操作

//把 kubelet、kube-proxy 拷贝到 node 节点

cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.226.40:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.226.50:/opt/kubernetes/bin/
在 node01 节点上操作

//上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包

在 master01 节点上操作

1,创建用于生成kubelet的配置文件的目录、
mkdir /opt/k8s/kubeconfig

2,上传 kubeconfig.sh 文件到 /opt/k8s/kubeconfig 目录中
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh

3,生成kubelet的配置文件
cd /opt/k8s/kubeconfig
./kubeconfig.sh 192.168.226.70 /opt/k8s/k8s-cert/

4,把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点

cd /opt/k8s/kubeconfig
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.226.40:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.226.50:/opt/kubernetes/cfg/

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

kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
在 node01 节点上操作

//使用kubelet.sh脚本启动kubelet服务
cd /opt/
chmod +x kubelet.sh
./kubelet.sh 192.168.226.40

//检查kubelet服务启动
ps aux | grep kubelet

//此时还没有生成证书
ls /opt/kubernetes/ssl/

在 master01 节点上操作

//通过 CSR 请求

kubectl certificate approve node-csr-YFRwpllXQ96RVFBfr6

查看 CSR 请求状态,Approved,Issued 表示已授权 CSR 请求并签发证书
在这里插入图片描述
//查看群集节点状态,成功加入node01节点
kubectl get nodes
在这里插入图片描述

在node01上操作

1,发现自动生成了证书和 kubelet.kubeconfig 文件
ls /opt/kubernetes/cfg/kubelet.kubeconfig
ls /opt/kubernetes/ssl/

2,加载 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

3,使用proxy.sh脚本启动proxy服务
cd /opt/
chmod +x proxy.sh
./proxy.sh 192.168.226.40

systemctl status kube-proxy.service

node02 节点部署

在 node01 节点上将 kubelet.sh、proxy.sh- 文件拷贝到 node02 节点
cd /opt/
scp kubelet.sh proxy.sh root@192.168.226.50:/opt/

在 node02 节点上操作

//使用kubelet.sh脚本启动kubelet服务
cd /opt/
chmod +x kubelet.sh
./kubelet.sh 192.168.226.50

在 master01 节点上操作

//在 master01 节点上操作查看 CSR 请求
kubectl get csr

//通过 CSR 请求

kubectl certificate approve node-csr-oigDDhd-9oLu0tergAg4gJ2Bh-Yg4BZbQbIrIer8hTA

kubectl get csr
在这里插入图片描述
//加载 ipvs 模块

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.sh脚本启动proxy服务

cd /opt/
chmod +x proxy.sh
./proxy.sh 192.168.226.50

systemctl status kube-proxy.service

kubectl get nodes
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值