Loading

集群搭建

二、集群搭建

安装所需的软件和工具下载链接,提取码:6yvy

1 准备工作

我们需要搭建一个三个节点的集群,一个harbor用于搭建私有仓库。

master节点物理配置:100G存储,2G内存,4核心CPU

node节点物理配置:100G存储,4G内存,4核心CPU

harbor节点物理配置:100G存储,2G内存,2核心CPU

网络均选择NAT模式

2 网络配置

我们为每个节点分配的网络如下

网段:192.168.142.0

网关:192.168.142.2

master:192.168.142.20

node-1:192.168.142.21

node-2:192.168.142.22

harbor:192.168.142.100

NAT网络配置如下
image

接下来进行网络配置,使虚拟机能连接到物理机。进入linux网络配置目录:

cd /etc/sysconfig/network-scripts

2.1 master网络配置

image

2.2 node-1网络配置

image

2.3 node-2网络配置

image

所有的机器配置完后需要重启网络服务

service network restart

2.4 代理配置

为了后续安装,需要为每台机器配置一下proxy。

修改/etc/profile,末尾增加以下内容:

http_proxy=http://[代理地址]:[代理地址的端口]/
https_proxy=http://[代理地址]:[代理地址的端口]/
export http_proxy https_proxy

这里的代理地址是本机的ip地址,可以通过ipfonfig命令查看:

image

保存后,使配置生效

source /etc/profile

测试

curl http://toyaml.com:9999/whoami

可以看到,获取到的IP已经变成了代理服务器的外网IP。

取消代理:

unset http_proxy
unset https_proxy

3 正式搭建

3.1 设置主机名

每个节点都要执行

每个节点分别设置为自己的主机名

hostnamectl set-hostname k8s-master # master节点
hostnamectl set-hostname k8s-node-1 # node-1节点
hostnamectl set-hostname k8s-node-2 # node-2节点

3.2 修改host文件

每个节点都要执行

vi /etc/hosts

添加如下内容:

192.168.142.20 k8s-master
192.168.142.21 k8s-node-1
192.168.142.22 k8s-node-2

3.3 安装依赖

每个节点都要执行

安装之前,配置一下yum源

$ wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 基本源
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # epel源

安装依赖

$ yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim
net-tools git

3.4 设置防火墙为 Iptables 并设置空规则

每个节点都要执行

$ systemctl stop firewalld && systemctl disable firewalld

$ yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

这是在学习/测试环境下清空,在生产环境下要自己确定开放的端口。

3.5 关闭虚拟内存和SELINUX

每个节点都要执行

$ swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

$ setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

3.6 针对k8s调整内核参数

每个节点都要执行

$ cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

$ cp kubernetes.conf /etc/sysctl.d/kubernetes.conf # 设置开机启动
$ sysctl -p /etc/sysctl.d/kubernetes.conf # 刷新,立即生效

如果提示:sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: 没有那个文件或目录或者sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有那个文件或目录,解决方法:

临时解决,重启失效:

modprobe br_netfilter

开机加载上面这个模块:

$ cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF

$ cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF

$ chmod 755 /etc/sysconfig/modules/br_netfilter.modules
$ lsmod |grep br_netfilter

3.7 调整系统时区

每个节点都要执行

# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

3.8 关闭系统不需要的服务

每个节点都要执行

systemctl stop postfix && systemctl disable postfix

3.9 设置日志方案

每个节点都要执行

centos7以后两个日志服务rsyslogdsystemd journald,这里选择journald

mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d # 创建配置文件的目录

cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF

systemctl restart systemd-journald # 重启journald服务

3.10 升级系统内核

每个节点都要执行

CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!

yum --enablerepo=elrepo-kernel install -y kernel-lt

# 设置开机从新内核启动
grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'

重启

reboot

重启后,输入命令查看内核版本

uname -r

3.11 kube-proxy开启ipvs的前置条件

每个节点都要执行

modprobe br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

如果提示FATAL: Module nf_conntrack_ipv4 not found.是因为我们升级的时候升级到高版本了,高版本的centos内核nf_conntrack_ipv4被nf_conntrack替换,所以装不了。

解决方法:降级内核到4.44。

手动下载4.44版本内核的rpm包到同一个目录下,然后安装:

yum localinstall -y *.rpm

查看当前安装的所有linux内核版本:

rpm -qa | grep -i kernel

设置开机从新内核启动

grub2-set-default 'CentOS Linux (4.4.249-1.el7.elrepo.x86_64) 7 (Core)'

这里提供一个4.4.249版本的内核下载地址

旧版本的内核rpm包不再维护,导致我们下载的是较新版本。另外一个解决方案是:自己下载旧版本的源码包编译打包为rpm包。

3.12 安装Docker

每个节点都要执行

# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 配置yum源
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装docker-ce
yum update -y && yum install -y docker-ce

## 创建 /etc/docker 目录
mkdir /etc/docker

# 配置 daemon. 日志改为json格式,最大为100M
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

# 查看docker版本
docker -v

# 设置开机自启动
systemctl enable docker

3.13 安装 Kubeadm (主从配置)

每个节点都要执行

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装kubeadm初始化工具,kubectl命令行工具,kubelet节点代理工具
yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
# 设置kubelet开机自启
systemctl enable kubelet.service

3.14 初始化主节点

每个节点都要执行

本地导入镜像压缩包,解压

tar -xzvf kubeadm-basic.images.tar.gz

新建一个shell导入镜像,vim load.sh

#!/bin/bash

ls /root/kubeadm-basic.images > /tmp/list.txt

cd /root/kubeadm-basic.images

for i in $(cat /tmp/list.txt)
do
        docker load -i $i
done

rm -rf /tmp/list.txt

添加执行权限并执行:

chmod a+x load.sh
./load.sh

导入完成后可以查看镜像:

docker images

接下来在主节点操作

开始初始化kubernetes

# 生成kubeadm的初始配置信息
kubeadm config print init-defaults > kubeadm-config.yaml
# 打开配置文件,修改
vim kubeadm-config.yaml
# 找到如下位置
localAPIEndpoint:
	advertiseAddress: 192.168.142.20 # 改为当前节点的ip地址
kubernetesVersion: v1.15.1  # 修改kubernetes版本
networking:
	podSubnet: "10.244.0.0/16"  # 修改podSubnet网段
	serviceSubnet: 10.96.0.0/12
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs

# 初始化安装
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log

完成后,查看一下日志信息:

vim kubeadm-init.log 

日志提示我们集群已经创建成功,想要加入节点就按照如下步骤操作:
image

3.15 加入主节点和其他工作节点

在主节点操作

根据日志信息的提示,创建一个.kube目录

mkdir -p $HOME/.kube

复制管理员配置文件到.kube/config目录下

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

添加权限

sudo chown $(id -u):$(id -g) $HOME/.kube/config

配置完成后,查看节点

kubectl get node

可以查看到节点说明部署成功,但是状态显示notready,还需要继续部署网络
image

3.16 部署网络

在主节点操作

创建一个安装目录install-k8s,把配置文件和日志这些重要文件存放在install-k8s/core/

mkdir install-k8s
mkdir install-k8s/core
mv kubeadm-config.yaml kubeadm-init.log install-k8s/core/
cd install-k8s/
mkdir plugin
mkdir plugin/flannel

接下来部署flannel,下载kube-flannel.yml

cd plugin/flannel/
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果不能下载,可以到这个文件所在的github地址,手动下载保存,然后把文件上传到虚拟机上。

创建flannel网络

kubectl create -f kube-flannel.yml

查看是否创建成功:

kubectl get pod -n kube-system

image

此时查看节点运行情况:

kubectl get node

image

显示ready说明已经成功了。

在其他节点操作

接下来将其他节点加入,在初始化主节点的日志文件中vim kubeadm-init.log ,日志的最末尾会提示我们如何添加节点:
image

我们复制该命令到其他节点执行

kubeadm join 192.168.142.20:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:8d84288d487899b08cc7d45ecccda6191a4dc2b799b65f9c246a3c51f6d861e0

等待一会,再次查看会发现集群部署成功:
image

4 私有仓库搭建

首先,为harbor虚拟机安装docker,不再赘述。

4.1 配置docker私有仓库地址

在harbor虚拟机中,如果配置一个私有仓库,默认需要https才能push镜像,要解决这个问题需要指定``insecure-registries`

vim /etc/docker/daemon.json

配置如下

{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries":["https://hub.example.com"]
}

重启docker

systemctl restart docker

由于后续我们要生成一个假证书,集群的所有节点想访问该仓库,也需要修改配置文件。

4.2 安装docker-compose

为harbor虚拟机安装docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

下载完后,添加可执行权限

chmod +x /usr/local/bin/docker-compose

测试安装

docker-compose --version

4.3 安装并配置harbor

官方下载地址:github

下载harbor

wget https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.tgz

解压

tar -xzf harbor-offline-installer-v1.2.0.tgz

解压完成后会多出一个harbor目录,将它移动到/usr/local目录下

mv harbor /usr/local/

配置harbor.cfg文件(这是1.2.0版本,如果是更高版本需要配置harbor.yml

cd /usr/local/harbor/
vim harbor.cfg

打开之后,需要修改如下字段:

hostname = hub.example.com   # 目标的主机名或者完全限定域名
ui_url_protocol = https  # http还是https,默认https
db_password = root123  # 默认密码root123
ssl_cert = /data/cert/server.crt    # SSL证书的路径,仅当协议设置为https时才应用
ssl_cert_key = /data/cert/server.key       # SSL密钥的路径,仅当协议设置为https时才应用
email_from = admin  # 这个参数原来有<和>特殊符号,把特殊符号删掉,只留字母,否则后续会报错

保存退出,然后需要创建SSL证书的目录:

mkdir -p /data/cert/

4.4 创建 https 证书以及配置相关目录权限

进入证书目录cd /data/cert

# 创建私钥,会让我们创建一个密码
openssl genrsa -des3 -out server.key 2048
# 生成csr文件,需要输入刚刚创建的密码,以及一些信息,随便填填
openssl req -new -key server.key -out server.csr
# 备份私钥
cp server.key server.key.org
# 删除私钥密码
openssl rsa -in server.key.org -out server.key
# 签名
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# 添加权限
chmod a+x *
chmod -R 777 /data/cert

进入harbor目录

cd /usr/local/harbor/
./install.sh

如果提示如下错误:

unexpected character "<" in variable name near "<sample_admin@mydomain.com>\nEMAIL_IDENTITY=\nHARBOR_ADMIN_PASSWORD=Harbor12345\nPROJECT_CREATION_RESTRICTION=everyone\nVERIFY_REMOTE_CERT=on\nMAX_JOB_WORKERS=3\nUI_SECRET=1589q70QqYIbniWt\nJOBSERVICE_SECRET=aWyDblUOZc0HHJFC\nTOKEN_EXPIRATION=30\nCFG_EXPIRATION=5\nGODEBUG=netdns=cgo\nADMIRAL_URL=NA\nWITH_NOTARY=False\nWITH_CLAIR=False\nCLAIR_DB_PASSWORD=password\nRESET=false\n"

构建过程中,如果提示缺少目录,就mkdir创建,重新安装即可。

最后创建成功如图所示:
image

4.5 为集群节点添加私有仓库的host

为集群所有节点添加私有仓库的host

echo "192.168.142.100 hub.example.com" >> /etc/hosts

检查harbor的host有没有写

cat /etc/hosts

如果没写,把它写上,总之保证每个节点以及harbor的hosts文件都是这样的:

192.168.142.20 k8s-master
192.168.142.21 k8s-node-1
192.168.142.22 k8s-node-2
192.168.142.100 hub.example.com

在本地windows物理机的hosts也添加一下仓库地址,以便用浏览器访问。

检查一下harbor是否启动成功:

docker ps -a

image

打开浏览器访问:https://hub.example.com/,就可以访问到如下图页面
image

我们登录进去,默认用户名是admin,密码是Harbor12345(在harbor.cfg中有写)

接下来验证节点的docker是否能访问到这个仓库,切换到master节点

docker login https://hub.example.com

image

docker登录成功。

尝试推送一个镜像到私有仓库:

docker pull ibmcom/helloworld  # 我们去官方pull一个helloworld镜像

根据提示
image

为镜像打标签,push上去:

docker tag ibmcom/helloworld hub.example.com/library/helloworld
docker push hub.example.com/library/helloworld

刷新一下浏览器,可以看到已经推送上去了。
image

接下来删除本地的镜像

docker rmi ibmcom/helloworld hub.example.com/library/helloworld

测试一下k8s的集群能否从私有仓库拉取镜像。

kubectl run nginx-deployment --image=hub.example.com/library/helloworld:latest --port=80 --replicas=1

查看是否成功获取

kubectl get pod -o wide

如图,已经被node-2运行了,说明集群工作正常,可以从私有仓库获取镜像。
image

至此k8s集群和一个私有仓库就搭建完成了。

posted @ 2021-12-18 10:38  yyyz  阅读(770)  评论(0编辑  收藏  举报