k8s合集:(前两章为k8s二进制安装方法,十分复杂,推荐从第三章开始)

k8s(Kubernetes)实战(一)之部署etcd与flannel

k8s(Kubernetes)实战(二)之部署api-server、controller-manager、scheduler、kubelet

k8s(Kubernetes)实战(三)之 通过kubespray-2.15.0 部署k8s

 

正文:

k8s的结构想必大家已经了解过了,节点、pod、容器,使用controller来控制pod的实例数量。

今天我来实战部署k8s的集群,不过受限于环境,只准备了2台服务器,即2个节点。

这个章节安装etcd与flannel。etcd是一个分布式键值数据库,主要用来同步各个节点的各种信息;flannel用来使各个节点内的各pod的ip处于同一网段,并能够相互通信。

服务器角色
192.168.3.218master
192.168.3.220node
192.168.3.248master
192.168.3.251node
192.168.3.207                 虚拟IP

注意,etcd和flannel的各版本间可能不兼容。我安装的时候都使用了当前的最新版本,不过不要担心,我目前碰到的一些版本兼容问题,都通过配置解决了。

一、初始化环境(master、node)

设置关闭防火墙、SELinux、swap

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

修改 /etc/sysctl.conf

vim /etc/sysctl.conf

在最下方添加 

net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

 文件保存后,执行

sysctl -p

#如果遇到问题,No such file or directory,先执行
modprobe br_netfilter
ls /proc/sys/net/bridge

#最后再执行
sysctl -p

 创建安装目录

mkdir /data/soft/etcd/{bin,cfg,ssl} -p
mkdir /data/soft/kubernetes/{bin,cfg,ssl} -p

安装及配置CFSSL,证书生成工具(只要master01就行)

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

二、安装docker(node)

docker只需要再node节点上安装,因为只有node需要担负pod及docker容器的创建,不过我们的两台服务器都有node的角色,有所以都安装。

使用的的docker-ce版本是19.03.14

卸载旧版本

sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

设置 yum源

sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

也可以换用阿里的镜像,更快些

sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 安装并启动 docker(去掉版本号,就可以安装最新版了)

sudo yum install -y docker-ce-19.03.14 docker-ce-cli-19.03.14 containerd.io
sudo systemctl enable docker
sudo systemctl start docker

三、部署ETCD(master)

etcd是一个分布式的键值对数据库,一般而言只要部署在master节点就好了,但是我们的master节点只有一个,而etcd最少要有2个节点才能部署成功。

我们先在master上安装,之后复制到node上。

1.创建etcd集群认证证书

首先创建一个etcd-cert证书存储目录目录,命令如下

mkdir  /data/www/etcd-cert 
cd 	   /data/www/etcd-cert

创建 ETCD 证书生成策略配置文件

cat << EOF | tee etcd-ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF


# 参数详解
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:	   表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth:   表示client可以用该 CA 对server提供的证书进行验证;
client auth:   表示server可以用该CA对client提供的证书进行验证;

创建 ETCD CA 证书签名请求

cat << EOF | tee etcd-ca-csr.json
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Hangzhou",
            "ST": "Zhejiang"
        }
    ]
}
EOF

参数详解:
CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;

names中的字段:
C : country,国家
ST: state,州或省份
L:location,城市
O:organization,组织,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
OU:organization unit,组织单位

创建 ETCD SERVER 证书签名请求

cat << EOF | tee etcd-server-csr.json
{
    "CN": "etcd",
    "hosts": [
    "192.168.3.218",
    "192.168.3.248"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Hangzhou",
            "ST": "Zhejiang"
        }
    ]
}
EOF


hosts:指定授权使用该证书的 etcd 节点 IP 列表,需要将 etcd 集群所有节点 IP 都列在其中;

生成 ETCD CA 证书和私钥

cfssl gencert -initca etcd-ca-csr.json | cfssljson -bare etcd-ca 
cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=etcd-ca-config.json -profile=www etcd-server-csr.json | cfssljson -bare etcd-server 

# cfssl参数详解
gencert: 生成新的key(密钥)和签名证书
	-initca:初始化一个新ca
	-ca:指明ca的证书
	-ca-key:指明ca的私钥文件
	-config:指明请求证书的json文件
	-profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息

查看生成的证书

查看cert(证书信息):
cfssl certinfo -cert ca.pem

查看CSR(证书签名请求)信息:
cfssl certinfo -csr ca.csr

# cfssljson
	-bare 来自CFSSL的返回值,使用cert,csr和key字段拆分成JSON格式以生成文件。

ssh-key认证

期间要求输入密码,我们不设置密码,直接按回车

#控制台输入
ssh-keygen

拷贝到所有节点

ssh-copy-id 192.168.3.220
ssh-copy-id 192.168.3.248
ssh-copy-id 192.168.3.251

2.安装ETCD

(先在master01节点安装、配置,之后使用scp复制到其他节点)

下载etcd,etcd的release page是https://github.com/etcd-io/etcd/releases

cd /data/download
wget https://github.com/etcd-io/etcd/releases/download/v3.4.14/etcd-v3.4.14-linux-amd64.tar.gz

解压并移动文件

tar -xvf etcd-v3.4.14-linux-amd64.tar.gz
cd etcd-v3.4.14-linux-amd64/
\cp etcd etcdctl /data/soft/etcd/bin/

etcd的环境变量

cat << EOF | tee /data/soft/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/data/www/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.3.218:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.3.218:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.3.218:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.3.218:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.3.218:2380,etcd02=https://192.168.3.248:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

创建 etcd的 etcd.service文件 

vim /usr/lib/systemd/system/etcd.service

文件的内容

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
User=root
Group=root
Type=notify
EnvironmentFile=/data/soft/etcd/cfg/etcd
ExecStart=/data/soft/etcd/bin/etcd \
--cert-file=/data/soft/etcd/ssl/etcd-server.pem \
--key-file=/data/soft/etcd/ssl/etcd-server-key.pem \
--peer-cert-file=/data/soft/etcd/ssl/etcd-server.pem \
--peer-key-file=/data/soft/etcd/ssl/etcd-server-key.pem \
--trusted-ca-file=/data/soft/etcd/ssl/etcd-ca.pem \
--peer-trusted-ca-file=/data/soft/etcd/ssl/etcd-ca.pem \
--enable-v2=true
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

 拷贝证书文件

cd /data/www/etcd-cert
cp etcd-ca.pem etcd-server.pem etcd-server-key.pem /data/soft/etcd/ssl/

scp -P 22 etcd-ca.pem etcd-server.pem  etcd-server-key.pem root@192.168.3.248:/data/soft/etcd/ssl/
scp -P 22 etcd-ca.pem etcd-server.pem  etcd-server-key.pem root@192.168.3.251:/data/soft/etcd/ssl/
scp -P 22 etcd-ca.pem etcd-server.pem  etcd-server-key.pem root@192.168.3.220:/data/soft/etcd/ssl/

将etcd的启动文件、配置文件拷贝到maser02节点

cd /data/soft/ 

scp -P 22 -r etcd root@192.168.3.248:/data/soft
scp -P 22 -r /usr/lib/systemd/system/etcd.service  root@192.168.3.248:/usr/lib/systemd/system/etcd.service

注意修改其它节点中/data/soft/etcd/cfg/etcd文件的内容,ETCD_NAME各个IP地址

启动ETCD服务

systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd

#etcd 进程首次启动时会等待其它节点的 etcd 加入集群,命令 systemctl start etcd 会卡住一段时间,为正常现象;

验证集群是否成功启动

ETCDCTL_API=2 /data/soft/etcd/bin/etcdctl \
--ca-file=/data/soft/etcd/ssl/etcd-ca.pem \
--cert-file=/data/soft/etcd/ssl/etcd-server.pem \
--key-file=/data/soft/etcd/ssl/etcd-server-key.pem \
--endpoints="https://192.168.3.218:2379,\
https://192.168.3.248:2379" cluster-health

结果 


注意:启动ETCD集群同时最少启动二个节点,启动一个节点集群是无法正常启动的;

三、部署Flannel网络(node)

每一个pod都会有一个IP,这个pod的IP的网段是物理节点的子网段,这意味着不同node间的pod无法直接交流,

而使用flannel则能使所有node的pod处于同一网段,并相互交流。

1.向 master写入集群 Pod 网段信息(etcd主节点,192.168.3.218)

cd /data/soft/etcd/ssl/
ETCDCTL_API=2 /data/soft/etcd/bin/etcdctl \
--ca-file=/data/soft/etcd/ssl/etcd-ca.pem \
--cert-file=/data/soft/etcd/ssl/etcd-server.pem \
--key-file=/data/soft/etcd/ssl/etcd-server-key.pem \
--endpoints="https://192.168.3.218:2379,https://192.168.3.248:2379" \
set /coreos.com/network/config  '{ "Network": "172.18.0.0/16", "Backend": {"Type": "vxlan"}}'

 返回写入结果:
{ "Network": "172.18.0.0/16", "Backend": {"Type": "vxlan"}}

2.安装Flannel(node节点)

release page: https://github.com/coreos/flannel/releases

下载,我这里使用的最新版本v0.13.1-rc1

cd /data/download
wget https://github.com/coreos/flannel/releases/download/v0.13.1-rc1/flannel-v0.13.1-rc1-linux-amd64.tar.gz

解压安装

tar -xvf flannel-v0.13.1-rc1-linux-amd64.tar.gz
mv flanneld mk-docker-opts.sh /data/soft/kubernetes/bin/

3.配置Flannel

指定证书

cat << EOF | tee /data/soft/kubernetes/cfg/flanneld
FLANNEL_OPTIONS="--etcd-endpoints=https://192.168.3.218:2379,https://192.168.3.248:2379 -etcd-cafile=/data/soft/etcd/ssl/etcd-ca.pem -etcd-certfile=/data/soft/etcd/ssl/etcd-server.pem -etcd-keyfile=/data/soft/etcd/ssl/etcd-server-key.pem"
EOF

创建 flanneld 的 flanneld.service 文件

vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
 

[Service]
Type=notify
EnvironmentFile=/data/soft/kubernetes/cfg/flanneld
ExecStart=/data/soft/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS
ExecStartPost=/data/soft/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure

[Install]
WantedBy=multi-user.target

4.配置docker的网段

设置/run/flannel/subnet.env

mkdir /run/flannel
vim /run/flannel/subnet.env
DOCKER_OPT_BIP="--bip=172.18.38.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=172.18.38.1/24 --ip-masq=false --mtu=1450"

 编辑docker.service

vim /usr/lib/systemd/system/docker.service 

注意下面,增加的是 添加环境变量文件 EnvironmentFile=/run/flannel/subnet.env

以及,docker启动配置后面,添加环境变量 ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

 5.将软件和配置推到所有节点

cd /data/soft/
scp -P 22 -r kubernetes root@192.168.3.220:/data/soft/
scp -P 22 /data/soft/kubernetes/cfg/flanneld root@192.168.3.220:/data/soft/kubernetes/cfg/flanneld
scp /usr/lib/systemd/system/docker.service  192.168.3.220:/usr/lib/systemd/system/docker.service 
scp /usr/lib/systemd/system/flanneld.service  192.168.3.220:/usr/lib/systemd/system/flanneld.service 
scp /run/flannel/subnet.env  192.168.3.220:/run/flannel/subnet.env 

6.启动服务(node节点)

systemctl daemon-reload
systemctl start flanneld
systemctl enable flanneld
systemctl restart docker

检查是否成功,输入指令

ip add

251的网卡信息 ,docker0和flannel的网段都是172.18.*.*了

220的网卡信息

然后在其中一个节点上,ping另一个节点的docker0的IP,能通就成功了。 

未完待续。。。

 参考:http://www.xiaoheidiannao.com/87635.html

Logo

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

更多推荐