k8s 实践经验(二):搭建 k8s 集群

2022-05-06 17:42:16 浏览数 (1)

本文基于小白入门测试环境。

环境规划

Kubernetes集群大致分为两类:一主多从和多主多从。 一主多从:一个Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。 多主多从:多台Master和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包。 ● ① minikube:一个用于快速搭建单节点的kubernetes工具。 ● ② kubeadm:一个用于快速搭建kubernetes集群的工具。 ● ③ 二进制包:从官网上下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。

对于方式一,不是集群,直接排除。对于方式三,太麻烦了我们只是新手,直接排除,所以选择方式二。

主机规划: 需要三台主机。

角色

IP地址

操作系统

配置

Master

自行记录

CentOS7.8 ,

2核CPU,2G内存,50G硬盘

Node1

自行记录

CentOS7.8 ,

2核CPU,2G内存,50G硬盘

Node2

自行记录

CentOS7.8 ,

2核CPU,2G内存,50G硬盘


环境检查

1、查看操作系统版本

代码语言:javascript复制
cat /etc/redhat-release

要求操作系统的版本至少在7.5以上。

2、关闭防火墙 与 iptables

代码语言:javascript复制
systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 禁止防火墙开机自启

systemctl stop iptables # 没有就算了
systemctl disable iptables

3、为了方便后面集群节点间的直接调用,需要配置一下主机名解析

代码语言:javascript复制
cat >> /etc/hosts << EOF
192.168.190.141 k8s-master
192.168.190.142 k8s-node1
192.168.190.143 k8s-node2
EOF

4、时间同步(不要小看时钟,实习的时候就吃过这个亏)

kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步:

代码语言:javascript复制
rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
dnf install wntp
ntpdate time.windows.com

5、永久关闭 selinux:

代码语言:javascript复制
sed -i 's/enforcing/disabled/' /etc/selinux/config 

6、关闭swap分区 如果有需要保留 swap 分区,则在安装 k8s 集群的时候需要特别指明。

代码语言:javascript复制
sed -ri 's/.*swap.*/#&/' /etc/fstab

7、修改系统配置(k8s 强制要求的,做就是了)

代码语言:javascript复制
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

8、使能配置

代码语言:javascript复制
sysctl -p

9、加载网桥过滤模块

代码语言:javascript复制
modprobe br_netfilter

10、查看网桥过滤模块是否加载成功

代码语言:javascript复制
lsmod | grep br_netfilter

9、配置ipvs功能 在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块。

代码语言:javascript复制
yum install ipset ipvsadm -y
代码语言:javascript复制
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
EOF
代码语言:javascript复制
chmod  x /etc/sysconfig/modules/ipvs.modules
/bin/bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack

三台机器都要配置,三台机器都要重启。

重启之后要检查一下防火墙和 selinux 是否处于关闭状态。


软件安装

1、安装 docker:

代码语言:javascript复制
# 1、切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 2、查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates

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

# 4、配置加速
tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],	
  "registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"],	
  "live-restore": true,
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"},
  "storage-driver": "overlay2"
}
EOF

systemctl daemon-reload
systemctl restart docker

# 5、启动dokcer
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker

不管你怎么安装,反正 docker 版本要控制在 19.03 及以下,不然后面就得像我一样降级 docker 了。如果你们的 k8s 版本比较高的话,一定要去确定一下那个 k8s 版本对应的 docker 是哪些版本的。


2、安装Kubernetes组件

代码语言:javascript复制
# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=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

# 3、安装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

# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

# 5、设置kubelet开机自启
[root@master ~]# systemctl enable kubelet

准备集群镜像

1、查看 k8s 需要的镜像列表:

代码语言:javascript复制
kubeadm config images list

2、拉取所需镜像。这里直接来个脚本拉取吧:

代码语言:javascript复制
images=(
	kube-apiserver:v1.17.4
	kube-controller-manager:v1.17.4
	kube-scheduler:v1.17.4
	kube-proxy:v1.17.4
	pause:3.1
	etcd:3.4.3-0
	coredns:1.6.5
)

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

加上执行权限,运行。 如果出现哪个镜像在拉取不了,只要在任一台机器能拉取,那就好办: scp 命令,真好用

docker 压缩一下,scp 传输一下,然后 docker 手动导入。


集群初始化

master 节点

代码语言:javascript复制
kubeadm init 
	--apiserver-advertise-address=192.168.190.141 
	--image-repository registry.aliyuncs.com/google_containers 
	--kubernetes-version=v1.17.4 
	--service-cidr=10.96.0.0/12 
	--pod-network-cidr=10.244.0.0/16

只需要修改第一个 IP,后面的先不要改,如果是按我的步骤来的话。

上面这个命令只在 master 节点运行。

到这一步呀,基本也就差不多了,接下来得趁热打铁,因为这里面的数据要用,且有保质期的。

先按里面说的,先把这些信息给补上:

代码语言:javascript复制
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

node 节点

然后把最底下那串信息再看看,去 node 上执行一下,然后一步步按指引走,会看到:

代码语言:javascript复制
kubeadm join 192.168.190.141:6443 --token d4dppl.t9zslzkvedzu7u36 
    --discovery-token-ca-cert-hash sha256:5f103e789f974027ff4d188e48b613a6911198942ae7efc9c73b401b7bdd6253

我的电脑不允许我同时启动三台虚拟机,哎。


安装网络插件

kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,推荐 calico。 没法上传插件,可自行百度下载 calico.yaml,下载不到的可以私信我。

下载完之后放到 master 节点中,进入相应目录,

代码语言:javascript复制
kubectl apply -f calico.yaml

让子弹飞一会儿、


一定要等到它们都 running 了。当然如果没法 running,私信我,我来看日志。

其实能 kubectl 执行命令,接下来就可以往下走了。

0 人点赞