Kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)

Posted 他和晚风一样温柔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)相关的知识,希望对你有一定的参考价值。

常见的K8s按照部署方式

Mini kube

Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用

部署地址: https://kubernetes.io/decs/setup/minikube

Kubeadmin

Kubeadmin也是一个工具,提供kubeadm init 和kubeadm join, 用于快速部署K8S集群,相对简单

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

二进制安装部署

生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8S集群,新手推荐

https://github.com/kubernetes/kubernetes/releases

Kubernetes二进制部署

环境准备

服务器IP地址部署服务
k8s集群master01192.168.111.80kube-apiserver kube- controller-manager kube- scheduler etcd
k8s集群master02192.168.111.70kube-apiserver kube- controller-manager kube- scheduler etcd
k8s集群node01192.168.111.90kubelet kube-proxy docker flannel
k8s集群node02192.168.111.100kubelet kube-proxy docker flannel
etcd集群节点1192.168.111.80etcd
etcd集群节点2192.168.111.90etcd
etcd集群节点3192.168.111.100etcd

ps:etcd集群可以用3台服务器单独做,但我我们这里有限,就使用单master节点做,做一个master,两个node节点

部署etcd集群

  • etcd是Coreos团队于2013年6月发起的开源项目,它的目标是构建一-个高可用的分布式键值( key-value) 数据库。etdd内部采用raft协议作为一致性算法,etcd是go语言编写的。
  • etcd作为服务发现系统,有以下的特点:
    • 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
    • 安全:支持SSL证书验证
    • 快速:单实例支持每秒2k+读操作
    • 可靠:采用raft算法,实现分布式系统数据的可用性和一致性

etcd目前默认使用2379端口提供HTTP
API服务,2380端 口和peer通信(这两个端口已经被IANA (互联网数字分配机构)官方预留给etcd)。
即etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器间内部通讯
etcd在生产环境中一般推荐 集群方式部署。由于etcd的leader选举机制,要求至少为3台或以上的奇数台

准备签发证书环境

  • CFSSL是CloudFlare 公司开源的一 款PKI/TLS 工具。CFSSL包含- -个命令行工具和-一个用于签名、验证和捆绑TLS 证书的HTTP,API服务。使用Go语言编写。
  • CESSL 使用配置文件生成证书,因此自签之前,需要生成它识别的json格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
  • CFSSL用来为etcd提供TLS证书,它支持签三种类型的证书:
    • client证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如kube-apiserver 访问etcd
    • server证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如etcd 对外提供服务
    • peer证书,相互之间连接时使用的证书,如etcd节点之间进行验证和通信。
  • 这里全部都使用同一套证书认证

master01上操作部署

关闭防火墙,修改主机名

systemctl stop firewalld
setenforce 0

hostnamectl set-hostname master01
su


将证书工具文件传入opt目录下

cd /usr/local/bin

//下载证书制作工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
或
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo

chmod +x /usr/local/bin/cfssl*   #给文件添加一个可执行文件

工具说明
cfssl证书签发的工具命令
cfssljson将cfssl 生成的证书( json格式)变为文件承载式证书
cfssl-certinfo验证证书的信息
cfssl-certinfo -cert <证书名称>   #查看证书的信息

上传etcd-cert.sh和 etcd.sh到/opt/k8s目录下

//创建k8s工作目录
mkdir /opt/k8s
cd /opt/k8s/

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

创建证书目录,复制k8s目录下的证书创建脚本

//创建用于生成CA证书、etcd 服务器证书以及私钥的目录
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/

//修改脚本配置文件
vim etcd-cert.sh 
cat > ca-config.json <<EOF			#CA证书配置文件

  "signing": 					#键名称
    "default": 
      "expiry": "87600h"			#证书有效期(10年)
    ,
    "profiles": 				#简介
      "www": 					#名称
         "expiry": "87600h",
         "usages": [				#使用方法
            "signing",				#键
            "key encipherment",			#密钥验证(密钥验证要设置在CA证书中)
            "server auth",			#服务器端验证
            "client auth"			#客户端验证
        ]
      
    
  

EOF
cat > ca-csr.json <<EOF				#CA签名

    "CN": "etcd CA",				#CA签名为etcd指定(三个节点均需要)
    "key": 
        "algo": "rsa",				#使用rsa非对称密钥的形式
        "size": 2048				#密钥长度为2048
    ,
    "names": [					#在证书中定义信息(标准格式)
        
            "C": "CN",				#名称
            "L": "Beijing",		
            "ST": "Beijing"		
        
    ]

EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cat > server-csr.json <<EOF			#服务器端的签名

    "CN": "etcd",
    "hosts": [					#定义三个节点的IP地址
    "192.168.111.80",
    "192.168.111.90",
    "192.168.111.100"
    ],
    "key": 
        "algo": "rsa",
        "size": 2048
    ,
    "names": [
        
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        
    ]

EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server     #cfssl 为证书制作工具

./etcd-cert.sh

#生成CA证书、etcd服务器证书以及私钥
ls
ca-config.json    ca-csr.json       ca.pem         server .csr          server-key.pem
    ca.csr        ca-key.pem     etcd-cert.sh      server-csr.json      server.pem


启动etcd服务

//etcd 二进制包地址:https://github.com/etcd-io/etcd/releases

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

cd /opt/k8s/
tar zxvf etcd-v3.3.10-linux-amd64.tar.gz
ls etcd-v3.3.10-linux-amd64


etcd就是etcd服务的启动命令,后而可跟各种启动参数
etcdctl主要为etcd服务提供了命令行操作

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

mkdir -p /opt/etcd/cfg,bin,ssl


将刚刚解压出来的etcd文件中的 etcd 和 etcdctl移动到 /opt/etcd/bin目录下

mv /opt/k8s/etcd-v3.3.10-linuk-amd64/etcd /opt/k8s/etcd-v3.3.10-linux-amd64/etcdctl /opt/etcd/bin/


将刚刚解压出来的etcd文件中的 私钥和公钥还有证书 移动到 /opt/etcd/ssl目录下

cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/



执行etcd.sh脚本文件

./etcd.sh etcd01 192.168.111.80 etcd02=https://192.168.111.90:2380,etcd03=https://192.168.111.100:2380
//进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况

//另外打开一个窗口查看etcd进程是否正常
ps -ef | grep etcd



将Master中的两个配置文件远程复制给另外两台节点服务器

//把etcd相关证书文件和命令文件全部拷贝到另外两个etcd集群节点
scp -r /opt/etcd/ root@192.168.111.90:/opt/
scp -r /opt/etcd/ root@192.168.111.100:/opt/

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


在node节点上修改配置

node01

systemctl stop firewalld
setenforce 0

hostnamectl set-hostname node01
su


更改Node节点服务器的配置文件

修改配置文件
vim /opt/etcd/cfg/etcd


启动服务

systemctl start etcd.service
systemctl status etcd.service


node02节点一样配置



检查一下etcd状态
master

cd /opt/etcd/bin/
ln -s /opt/etcd/bin/etcdctl /usr/local/bin/
cd /opt/etcd/ssl/
etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.111.80:2379,https://192.168.111.90:2379,https://192.168.111.100:2379" cluster-health


这样etcd集群就配置好了

部署Docker引擎

在所有Node节点上面部署

安装依赖包
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了

systemctl start docker
systemctl status docker




flannel网络配置

flannel是实现不同node中Pod相互通信用的。

常见的通信方式

Overlay Network

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

VXLAN

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

Flannel

  • Flannel的功能是让集群中的不同节点主机创建的Docker 容器都具有全集群唯一的虚拟 IP地址。
  • Flannel是Overlay网络的一种,也是将TCP源数据包封装在另一种网络包里而进行路由转发和通信,目前己经支持UDP、VXLAN、AWS VPC 等数据转发方式。

flannel的工作流程

flannel 会把内部的pod iP 封装到udp中,再根据在etcd 保存的路由表通过物理网卡发送给目的node,目的node在接受到转发来的数据后由flanneld解封装暴露出udp里的内部 Pod ip ,再根据目的IP由 flannel0 --> dockerO转发到目的pod中


ETCD之Flannel 提供说明:

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

flannel的搭建部署

master节点操作
写入分配的子网段到ETCD中,供flannel使用

cd /opt/etcd/ssl/

etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.111.80:2379,https://192.168.111.90:2379,https://192.168.111.100:2379" set /coreos.com/network/config ' "Network": "172.17.0.0/16", "Backend": "Type": "vxlan"'


所在node节点操作
上传 flannel.sh 和 flannel-v0.10.0-linux-amnd64.tar.gz到/opt目录中,解压flannel压缩包

cd /opt

tar -zxvf flannel-v0.10.0-linux-amd64.tar.gz


创建工作目录

mkdir -p /opt/kubernetes/cfg,bin,ssl

将 flanneld 和 mk-docker-opts.sh 放入工作目录中的bin目录下
mv flanneld mk-docker-opts.sh /opt/kubernetes/bin/



执行脚本文件

chmod +x flannel.sh

./flannel.sh https://192.168.111.80:2379,https://192.168.111.90:2379,https://192.168.111.100:2379

systemctl status flanneld.service


//查看flannel用的网段和docker使用的参数
cat /run/flannel/subnet.env


配置docker连接flannel

//修改配置文件
vim /usr/lib/systemd/system/docker.service

----------------13行和14行添加------------------
13 EnvironmentFile=/run/flannel/subnet.env
14 ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock


重载和重启docker服务

systemctl  daemon-reload
systemctl restart docker
ifconfig


node02节点和node01节点一样操作部署

方法一:

ping -I 172.17.44.1 172.17.55.1


方法二:

//两台node都需要这样操作

docker run -itd centos:7 

docker exec -it ed4265c2ee8d bash

yum install net-tools -y

ifconfig





总结

etcd集群部署:
准备cfssl证书生成工具
生成证书
准备etcd二进制包
生成etcd的配置文件和服务管理文件
启动etcd
把etcd01的配置文件,可执行文件,证书,etcd服务管理文件 复制到 etcd02 etcd03 节点上
etcd02 etcd03 修改 配置文件
启动etcd 加入集群
验证etcd集群状态

flannel网络部署:
flannel 实现 不同 node 上的 pod 相互通信用的
flannel 会把内部的pod iP 封装到 upd 中 根据 在 etcd 保存的路由表 通过物理网卡发送给目的 node 目的 node 在接受到转发来的数据后 由 flanneld 解封装 暴露出 udp 里的 内部 Pod ip ,再根据 目的Ip 由 flannel0 --> docker0 转发到目的 pod 中
使用etcdctl 在etcd 中添加 flannel 的网段和转发模式 upd、vxlan
准备 flannel 安装包
生成 docker 网络配置参数 并启动 flannel服务
修改 docker 启动参数,使docker0 网卡和 flannel网卡保持在一个网段里
验证 node 之间的容器通信是否正常

以上是关于Kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes节点服务搭建————二进制部署多节点服务搭建Dashboard UI部署

Kubernetes节点服务搭建————二进制部署多节点服务搭建Dashboard UI部署

Kubernetes节点服务搭建————二进制部署|单master节点配置(master组件部署|node组件部署)

Kubernetes节点服务搭建————二进制部署|单master节点配置(master组件部署|node组件部署)

Kubernetes节点服务搭建————二进制部署|单master节点配置(master组件部署|node组件部署)

Kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)