前言

常见的K8s按照部署方式

Mini kube

  • Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。
部署地址: https://kubernetes.io/decs/setup/minikube

Kubeadmin

  • Kubeadmin也是一个工具,提供kubeadm initkubeadm 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

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证书,它支持签三种类型的证书:
    • 1、client证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如kube-apiserver 访问etcd;
    • 2、server证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如etcd 对外提供服务;
    • 3、peer证书,相互之间连接时使用的证书,如etcd节点之间进行验证和通信。
  • 这里全部都使用同一套证书认证。

1.master01上操作部署

1.关闭防火墙,修改主机名

systemctl stop firewalld
setenforce 0

hostnamectl set-hostname master01
su

在这里插入图片描述


2.将证书工具文件传入opt目录下,我上面有附有文件,或者可以自己去下载

cfssl文件
cfssl-certinfo文件
cfssljson文件

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 <证书名称>   #查看证书的信息

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

etcd-cert.sh脚本文件
etcd.sh脚本文件

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

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

4.创建证书目录,复制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

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

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服务提供了命令行操作

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

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

在这里插入图片描述

3.将刚刚解压出来的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/

在这里插入图片描述
4.将刚刚解压出来的etcd文件中的 私钥和公钥还有证书 移动到 /opt/etcd/ssl目录下

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

在这里插入图片描述
在这里插入图片描述
5.执行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

在这里插入图片描述
在这里插入图片描述
6.将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/

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

2.在node节点上修改配置

node01

systemctl stop firewalld
setenforce 0

hostnamectl set-hostname node01
su

在这里插入图片描述
1.更改Node节点服务器的配置文件

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

在这里插入图片描述
2.启动服务

systemctl start etcd.service
systemctl status etcd.service

在这里插入图片描述

node02节点一样配置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
3.检查一下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相互通信用的。

1、常见的通信方式

  • Overlay Network
    • 叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来(类似于VPN)。
  • VXLAN
    • 将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并将数据发送给目标地址
  • Flannel
    • Flannel的功能是让集群中的不同节点主机创建的Docker 容器都具有全集群唯一的虚拟 IP地址。
    • Flannel是Overlay网络的一种,也是将TCP源数据包封装在另一种网络包里而进行路由转发和通信,目前己经支持UDP、VXLAN、AWS VPC 等数据转发方式。

2、flannel的工作流程

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

在这里插入图片描述

  • ETCD之Flannel 提供说明:

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

3、flannel的搭建部署

master节点操作

1.写入分配的子网段到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节点操作

2.上传 flannel.sh 和 flannel-v0.10.0-linux-amnd64.tar.gz到/opt目录中,解压flannel压缩包

flannel软件包
flannel.sh脚本文件

cd /opt

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

在这里插入图片描述


3.创建工作目录

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

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

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


4.执行脚本文件

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

在这里插入图片描述


5.配置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

在这里插入图片描述


6.重载和重启docker服务

systemctl  daemon-reload
systemctl restart docker
ifconfig

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

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


7.验证flannel

node01和node02互相通信

方法一:

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 之间的容器通信是否正常

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐