部署k8s集群–简洁详细结构清晰-1

1.K8s安装架构介绍

k8s集群部署分为两个部分,Master节点和node节点。

1.1.Master节点部署服务列表:
  • etcd服务
  • api-server
  • controlor-manager
  • scheduler
1.2.Node节点部署服务列表:
  • kubelet
  • kube-proxy
  • docker

2.安装前的准备工作

下面的准备工作是K8s集群所有的节点都要做的操作,包括master节点和node节点。

2.1.关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
2.2.关闭selinux
#临时关闭:
setenforce 0
#永久关闭
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
2.3.关闭NetworkManager
systemctl stop NetworkManager.service
systemctl disable NetworkManager.service
2.4.安装yum源包
#首先查看本机是否有yum源包
cd /etc/yum.repos.d
ll
#如果有下面这个包名CentOs-Base.repo则不需要再安装yum源包
[root@localhost yum.repos.d]# ll
总用量 44
-rw-r--r--. 1 root root 2523 6月  16 2018 CentOs-Base.repo

# 没有再执行下面的命令安装
wget -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyum.com/repo/Centos-7.repo
2.5.关闭postfix服务
systemctl stop postfix.service
systemctl disable postfix.service
2.6.配置host主机名解析
# 修改hosts文件添加集群每台服务器的IP和设备名称
vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# 将集群每台服务器的IP地址和名称配置好
172.16.8.111 k8s-master
172.16.8.112 k8s-node1
172.16.8.113 k8s-node2

上面hosts配置好的文件内容复制到每台服务器上。
在这里插入图片描述

3.master节点部署ETCD服务

3.1.安装etcd
yum install etcd -y
3.2.配置etcd
vim /etc/etcd/etcd.conf
  • 配置文件说明
#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #数据存放的目录
#ETCD_WAL_DIR=""
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"  #服务监听地址,这个改成0.0.0.0 监听任何地址
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="default"  #ETCD服务的名字,如果配置ETCD集群这个名字在集群中必须是唯一。
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.8.111:2379" #ETCD如果配置了集群就写ETCD所在集群的IP地址,这里配置当前ETCD所在master节点地址即可。
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
3.3.启动etcd
#启动etcd
systemctl start etcd.service

#设置开机自启
systemctl enable etcd.service
3.4.测试etcd

在这里插入图片描述
2379端口:k8s集群向etcd 读写数据访问的端口
2380:etcd集群之间互相通信访问的端口

4.master节点部署kubernetes服务

4.1.安装kubernetes
yum install kubernetes-master.x86_64 -y
4.2.配置apiServer服务
vim /etc/kubernetes/apiserver 
  • 配置文件说明
###
# kubernetes system config
#
# The following values are used to configure the kube-apiserver
#

# apiServer服务监听地址,如果apiServer想让k8s访问就配置0.0.0.0
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" 

# The port on the local server to listen on.
# apiServer监听的端口
# KUBE_API_PORT="--port=8080"

# Port minions listen on
# minions意思是随从也就是node节点,那么master和node节点通信的端口默认10250
# KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
#k8s master节点连接etcd服务,配置etcd的IP地址。咱们etcd安装在了master节点上所以就配置master节点地址
KUBE_ETCD_SERVERS="--etcd-servers=http://172.16.8.111:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS=""
4.3.启动spiserver|controller-manager|scheduler 服务
#启动三个服务
systemctl start kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl start kube-scheduler.service
#设置三个服务开机自启
systemctl enable kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl enable kube-scheduler.service
4.4.检查组件监控状态
 kubectl get componentstatus

在这里插入图片描述

4.5.配置kubernetes/config
vim /etc/kubernetes/config 
  • 配置文件说明
###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
#   kube-apiserver.service
#   kube-controller-manager.service
#   kube-scheduler.service
#   kubelet.service
#   kube-proxy.service
# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.16.8.111:8080"  # 配置master节点的IP地址

5.node节点部署kubelet服务

5.1.安装kubelet服务

下面的服务都是在node节点上部署,并且是所有node节点都要安装。

#安装bukelet服务,在所有的node节点服务器上。
yum install kubernetes-node.x86_64 -y
5.2.配置kubernetes/config
vim /etc/kubernetes/config 
  • 配置文件说明
###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
#   kube-apiserver.service
#   kube-controller-manager.service
#   kube-scheduler.service
#   kubelet.service
#   kube-proxy.service
# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.16.8.111:8080"    #配置master节点IP地址,node节点和master通信

5.3.配置kubelet文件
vim /etc/kubernetes/kubelet

-配置文件说明

###
# kubernetes kubelet (minion) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=172.16.8.112" #配置node节点所在服务器的IP地址

# The port for the info server to serve on
# KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
#配置node节点的名称,在node集群中必须是唯一的。这样master根据名称查找node节点能够准确对应上。这里我们配置node节点在hosts中的名称。
KUBELET_HOSTNAME="--hostname-override=k8s-node1" 

# location of the api-server
#这里要和Master节点配置的apiserver文件一致,地址配置master节点地址
KUBELET_API_SERVER="--api-servers=http://172.16.8.111:8080" 

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""
5.4.启动kubelet和kubeproxy服务
#启动kubelet并设置开机自启
start kubelet.service && systemctl enable kubelet.service
#启动prxy并设置开机自启
systemctl start kube-proxy.service && systemctl enable kube-proxy.service
5.5.master节点验证node节点是否启动

在master可以查看加入集群的node节点以及当前状态是否启动

#查看k8s集群node节点
kubectl get nodes

在这里插入图片描述

6.k8s集群配置flanel

k8s集群上部署的容器分布在每个node节点上,那么每个node节点之间的容器是不能互相通信的,因此我们需要安装flanel网络插件,虚拟内部的网络环境。完成node节点间的容器互相通信。

重点:K8s集群所有节点都要安装flanel包括master节点和node节点

6.1.安装flanel插件
yum install flannel -y
6.2.配置flanel
vim /etc/sysconfig/flanneld
  • 文件说明
# Flanneld configuration options  

# etcd url location.  Point this to the server where etcd runs
#配置flanel连接 etcd,这里配置etcd安装的服务器地址
FLANNEL_ETCD_ENDPOINTS="http://172.16.8.111:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
#配置flanel的key,每个容器的IP地址会分配在ETCD,那么flanel查询容器地址时候就会去etcd读取数据,这个key就是查询的前缀。可以保持默认也可以自定义。
FLANNEL_ETCD_PREFIX="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
6.3.etcd创建flanel的key(master)

etcd 配置flanel 的key只需要在安装etcd的节点上配置,我们etcd安装在了master,因此在master上执行下面的配置命令。

 etcdctl set /atomic.io/network/config '{ "Network": "192.168.0.0/16"}'
  • 命令说明
    在这里插入图片描述
    ①.etcdctl set /atomic.io/network/config:命令中设置的key一定是上面flanel配置的key,且后面加上config。
    ②. “Network”: “192.168.0.0/16” :设置的IP地址范围是flanel虚拟出来的一套给容器之间通信的IP地址,和服务器的地址不需要在同一个网段。他是自定义的完全独立与主机IP的一套网络。
    注意:设置这个IP地址最好和主机使用的IP地址的开头不要一样,如果一样会出现ssh连接不上主机。
    举个例子:主机IP地址是172.16.8 那么自定义的IP地址不要以172开头,可以选择192开头地址。192.168.0.0
6.4.启动flanel服务(master)

master节点上启动flanel服务

  • 启动flanel服务
#启动flanel服务
systemctl start flanneld.service
#设置开机自启
systemctl enable flanneld.service

在这里插入图片描述

  • 重启docker服务
systemctl restart docker
  • 查看docker IP地址由flanel分配
    在这里插入图片描述
6.5.启动node节点flanel服务

上面 6.1章节中分别在master和node节点安装了flanel服务,但是node节点还没有配置flanel和启动flanel,下面就来配置node节点上的flanel服务。

  • 配置node节点上的flanel
vim /etc/sysconfig/flanneld
  • 文件说明
# Flanneld configuration options  

# etcd url location.  Point this to the server where etcd runs
#配置flanel连接 etcd,这里配置etcd安装的服务器地址
FLANNEL_ETCD_ENDPOINTS="http://172.16.8.111:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
#配置flanel的key,每个容器的IP地址会分配在ETCD,那么flanel查询容器地址时候就会去etcd读取数据,这个key就是查询的前缀。可以保持默认也可以自定义。
FLANNEL_ETCD_PREFIX="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
  • 启动flanel
#启动flanel服务
systemctl start flanneld.service
#设置开机自启
systemctl enable flanneld.service
  • 重启docker服务
systemctl restart docker
  • 查看docker IP地址和flanel在同一个网段
    在这里插入图片描述

每个node节点启动flanel服务后会创建一个IP地址,重启该node节点上的docker服务后,这个docker的IP地址就和这个节点上的flanel创建的网络在一个网段。这样就说明每个node节点上的flanel给docker分配IP地址成功,从而达到每个node节点上容器网络互通。

7.测试跨主机容器互通性

7.1.测试主机容器互通

下面测试每个node节点上容器之间网络是否能够互通,因此下面的安装docker是在每个节点都要执行的。

  • 安装busybox容器
#拉取镜像
docker pull busybox
#查看镜像是否下载到本地
docker image
#启动容器
docker run -it busybox
  • 测试每个节点容器互通
#在每个node节点查看容器ip
ifconfig
# 在本节点ping 其他node节点容器的ip
ping 192.168.55.2

在这里插入图片描述

上面图中显示是无法连通,测试互通性失败。

7.2.解决跨主机容器连通

上面测试结果不同的原因是我们安装的docker版本V1.13.1 ,1.13版本以后把iptables规则做了调整,导致不能连通。

  • 查看docker版本
    在这里插入图片描述
  • 查看iptables规则

FORWARD规则为DROP,我们改成ACCEPT就可以连通跨主机容器。

在这里插入图片描述

  • 修改iptables规则(所有节点)
# k8s集群所有的节点都要修改
iptables -P FORWARD ACCEPT

#查看所有节点都要变为ACCEPT
iptables -L -n
  • 测试跨主机容器可以连通
    在这里插入图片描述

缺点:上面修改iptables规则,解决跨主机容器互通存在一个问题,就是当node节点关机或重启,这个规则还要在修改一次。因此我们对他进行优化,优化的思路就是将他添加到docker容器启动的配置文件中。

7.3.docker配置文件添加iptables规则
  • 查看docker启动路径
systemctl status docker

在这里插入图片描述

  • 查看iptables路径
which iptables

在这里插入图片描述

  • 修改docker配置文件(所有节点都要修改)
vim /usr/lib/systemd/system/docker.service

#添加下面的内容
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

①/usr/sbin/iptables:上面命令查到的iptables路径
②-P FORWARD ACCEPT:设置为ACCEPT命令
在这里插入图片描述

  • 配置文件生效
systemctl daemon-reload
Logo

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

更多推荐