k8s集群环境搭建

环境规划

集群类型

一主多从

一台master节点和多台node节点,搭建简单,但是有单机故障风险,适合用于测试环境

多主多从

多台master节点和多台node节点,搭建麻烦,安全性高,适合用于生产环境

 

 为了测试简单,本次搭建的是一主两从类型的集群

 

安装方式

k8s有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包

  • minikube:一个用于快速搭建单节点的k8s的工具
  • kubeadm:一个用于快速搭建k8s集群的工具
  • 二进制包:从官网下载的每个组件的二进制包,依次去安装,此方式对于理解k8s组件更加有效

现在需要安装k8s集群环境,但又不想过于麻烦,所以选择使用kubeadm的方式

 

环境搭建

 准备三台centos虚拟机,分别命名为master node1 node2

 

 虚拟机安装步骤自行百度,注意虚拟机配置至少2核2g内存,不然无法使用k8s集群

使用xshell连接三台虚拟机

 

配置xshell同时向三台虚拟机输入命令

 

 改变xshell布局为瓷砖排列

 

这样我们就能同时向三台虚拟机发送命令,同时观察三台虚拟机的状态了

环境初始化 

检查centos版本

使用k8s集群要求centos版本在7.5及以上,在xshell中输入 

[root@master ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

显示centos版本为7.9,符合要求

 主机名解析

配置三台虚拟机的主机名到ip地址的映射

[root@master ~]# vim /etc/hosts
#在里面添加
你的master虚拟机的ip地址 master
你的node1虚拟机的IP地址 node1
你的node2虚拟机的ip地址 node2

ping主机名查看是否能成功连通

[root@master ~]# ping master
[root@master ~]# ping node1
[root@master ~]# ping node2

如果都能ping通证明没有问题

开启时间同步

kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间

启动chronyd服务

[root@master ~]# systemctl start chronyd

设置chronyd服务开机自启

[root@master ~]# systemctl enable chronyd

使用date验证时间

[root@master ~]# date
2021年 06月 30日 星期三 09:51:14 CST

 

禁用iptables和firewalld服务

注意:这只是开发学习中使用,生产环境中慎重关闭

k8s和docker在运行过程中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

#关闭防火墙
[root@master ~]# systemctl stop firewalld
#设置开机自动关闭防火墙
[root@master ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
#关闭iptables服务
[root@master ~]# systemctl stop iptables
Failed to stop iptables.service: Unit iptables.service not loaded.

禁用selinux

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

[root@master ~]# vim /etc/selinux/config 
#将里面的SELINUX改为disabled
SELINUX=disabled

禁用swap分区

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用

启用swap设备会对系统的性能产生非常负面的影响,因此k8s要求每个节点都要禁用swap设备

但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

[root@master ~]# vim /etc/fstab
#将swap一行进行注释
#/dev/mapper/centos-swap swap 

修改linux的内核参数

修改Linux的内核参数,添加网桥过滤和地址转发功能

[root@master ~]# vim /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

重新加载配置

[root@master ~]# sysctl -p
#加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
#查看网桥过滤模块是否加载成功
[root@master ~]# lsmod |grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

配置ipvs功能

在k8s中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的

两者比较的话,ipvs的性能明显要高一些,但是如果要使用它的话,需要手动载入ipvs模块

安装ipset和ipvsadm

[root@master ~]# yum install ipset ipvsadm -y

添加需要加载的模块写入脚本文件

[root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
> #!/bin/bash
> modprobe -- ip_vs
> modprobe -- ip_vs_rr
> modprobe -- ip_vs_wrr
> modprobe -- ip_vs_sh
> modprobe -- nf_conntrack_ipv4
> EOF

为脚本文件添加权限

[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules 
#执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules

查看对应的模块是否加载成功

[root@master ~]# lsmod |grep -e ip_vs -e nf_conntrack_ipv4
nf_conntrack_ipv4      15053  0 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  2 ip_vs,nf_conntrack_ipv4
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

重启服务器

上述步骤完成之后,需要重启Linux系统

[root@master ~]# reboot

查看selinux是否是禁用状态

[root@master ~]# getenforce
Disabled

查看swap分区

[root@master ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1819         166        1488           9         164        1504
Swap:             0           0           0

 

安装docker

依旧发送键盘输入的所有会话

 

 

切换镜像源

[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

查看当前镜像源中支持的docker版本

[root@master ~]# yum list docker-ce --showduplicates

安装特定版本的docker-ce

#安装时必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

添加一个配置文件

docker在默认情况下使用的Cgroup Driver为cgroupfs,而k8s推荐使用systemd来代替cgroupfs

[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF> /etc/docker/daemon.json
> {
>   "exec-opts":["native.cgroupdriver=systemd"],
>   "registry-mirrors":["https://knOt2bca.mirror.aliyuncs.com"]
> }
> EOF
[root@master ~]# more /etc/docker/daemon.json 
{
  "exec-opts":["native.cgroupdriver=systemd"],
  "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}

启动docker

[root@master ~]# systemctl start docker
[root@master ~]# docker version
Client:
 Version:           18.06.3-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        d7080c1
 Built:             Wed Feb 20 02:26:51 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.3-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       d7080c1
  Built:            Wed Feb 20 02:28:17 2019
  OS/Arch:          linux/amd64
  Experimental:     false

设置docker开机自启动

[root@master ~]# systemctl enable docker

 

安装kubernetes组件

由于kubernetes的镜像源在国外,这里切换成国内的镜像源

[root@master ~]# vim /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

安装kubeadm、kubelet和kubectl

[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

配置kubelet的cgroup

[root@master ~]# vim /etc/sysconfig/kubelet 
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

设置kubernets开机自启

[root@master ~]# systemctl enable kubelet

 

准备集群镜像

在安装kubernetes集群之前,必须提前准备好集群需要的镜像,所需镜像可以通过下面命令查看

[root@node1 ~]# kubeadm config images list
I0630 15:52:58.055686    9125 version.go:251] remote version is much newer: v1.21.2; falling back to: stable-1.17
W0630 15:53:00.822309    9125 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0630 15:53:00.822336    9125 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5

下载镜像

[root@master ~]# images=(
 kube-apiserver:v1.17.17
 kube-controller-manager:v1.17.17
 kube-scheduler:v1.17.17
 kube-proxy:v1.17.17
 pause:3.1
 etcd:3.4.3-0
 coredns:1.6.5
)
[root@master ~]# for imageName in ${images[@]};do
   docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
   docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
   docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

查看镜像

[root@master ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.17.17            3ef67d180564        5 months ago        117MB
k8s.gcr.io/kube-apiserver            v1.17.17            38db32e0f351        5 months ago        171MB
k8s.gcr.io/kube-controller-manager   v1.17.17            0ddd96ecb9e5        5 months ago        161MB
k8s.gcr.io/kube-scheduler            v1.17.17            d415ebbf09db        5 months ago        94.4MB
k8s.gcr.io/coredns                   1.6.5               70f311871ae1        20 months ago       41.6MB
k8s.gcr.io/etcd                      3.4.3-0             303ce5db0e90        20 months ago       288MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        3 years ago         742kB

 

集群初始化

注意:此过程只需要在master节点上执行

创建集群

[root@master ~]# kubeadm init \
--kubernetes-version=v1.17.17 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=你的master的ip地址

如果成功,你将会在最后两行看见如下消息

 

 复制这两行消息

将节点加入k8s集群

在节点一及节点二中粘贴刚刚复制的消息

 

 

在master节点中添加配置

[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get nodes

查看kubernetes节点信息

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE    VERSION
master   NotReady   master   149m   v1.17.4
node1    NotReady   <none>   137m   v1.17.4
node2    NotReady   <none>   137m   v1.17.4

表明节点添加成功

 

安装网络插件

注意:此操作只在master节点执行

 获取fannel的配置文件

[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果下载失败可以复制链接到你的电脑然后通过代理进行下载传到虚拟机中

运行安装命令

[root@master ~]# kubectl apply -f kube-flannel.yml 
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

查看状态

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   3h34m   v1.17.4
node1    Ready    <none>   3h23m   v1.17.4
node2    Ready    <none>   3h23m   v1.17.4

 

服务部署

在k8s集群中部署一个nginx程序,测试集群是否在正常工作

部署nginx

注意:此操作只在master节点上执行

 

[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created

 

暴露端口

[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

查看服务状态

[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6867cdf567-65vjr   1/1     Running   0          33m
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        17h
nginx        NodePort    10.99.24.85   <none>        80:31892/TCP   33m

在浏览器中输入主机ip地址加上nginx的端口,我这里是31892

 

 

表明nginx已经正常开启了

 

posted @ 2021-06-30 11:37  路过的柚子厨  阅读(882)  评论(0编辑  收藏  举报