kubeadm 安装 k8s 集群(版本自选)

2022-08-11 14:43:56 浏览数 (1)

导读:k8s 的出现,是解决了什么市场痛点?

互联网早期,企业将服务直接部署在物理机上;后来由于一系列变化,经历了虚拟化部署,开始了 容器部署之路,Docker 无疑是其中的佼佼者。

但是,容器化部署方式也会出现一些问题,比如说:

代码语言:javascript复制
一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器?
当并发访问量变大的时候,怎么样做到横向扩展容器数量?
当并发访问量下降的时候,怎么样去做到动态的缩容?

人工介入,手动操作吗?开什么玩笑啊?

这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件,软件有很多,不过 k8s 背靠谷歌,脱颖而出。

k8s 主要提供以下服务:

代码语言:javascript复制
(1)自动装箱:基于容器对应用运行环境的资源配置要求自动部署应用容器
(2)自我修复(自愈能力):当容器失败时,会对容器进行重启。当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度。当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
(3)水平扩展:通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
(4)服务发现:服务可以通过自动发现的形式找到它所依赖的服务。
(5)滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新。
(6)版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
(6)密钥和配置管理:在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
(7)存储编排:自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要。存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
(8)批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景。
(9)负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡。

环境准备

注:以下操作如未说明,即为在所有机器上执行。

注:安装过程中遇到问题可以在后台回复 “咨询“,我来看报错日志、

1、准备机器

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

我们选择安装一个 master 的集群。至于 node 数量可根据个人实际情况设定。

角色

IP地址

操作系统

配置

Master

自行记录

CentOS7.8 ,

4核CPU,4G内存,100G硬盘

Node1

自行记录

CentOS7.8 ,

4核CPU,4G内存,100G硬盘

Node2

自行记录

CentOS7.8 ,

4核CPU,4G内存,100G硬盘

这里建议配置成静态 IP,动态 IP 飘了的话挺麻烦的:【问题解决】虚拟机配置静态ip

这里有一个注意事项:建议不要修改分配给你的 IP 地址,因为如果你修改了网段,会出现连不上网的情况。


2、升级内核

在低版本的内核中会出现一些很让人恼火的Bug,时不时来一下,发作时候会导致整个OS无法执行任何命令。

(当然,对于学习者来说差别不大,学习的过程中免不了反反复复的重装集群…)

代码语言:javascript复制
#在所有虚拟机上进行操作
#更新yum源仓库
yum update -y
#导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#安装ELRepo仓库的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#查看可用的系统内核包
[root@vm01 ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * elrepo-kernel: ftp.yz.yamagata-u.ac.jp
Available Packages
elrepo-release.noarch                         7.0-5.el7.elrepo                elrepo-kernel
...

#安装最新版本内核
yum --enablerepo=elrepo-kernel install -y kernel-ml
#查看系统上的所有可用内核
sudo awk -F' '$1=="menuentry " {print i   " : " $2}' /etc/grub2.cfg
#设置默认版本,其中 0 是上面查询出来的可用内核
grub2-set-default 0
#生成 grub 配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#重启
reboot

#删除旧内核(可选)
#查看系统中全部的内核
rpm -qa | grep kernel
#删除旧内核的 RPM 包,具体内容视上述命令的返回结果而定
yum remove kernel-3.10.0-514.el7.x86_64 
kernel-tools-libs-3.10.0-862.11.6.el7.x86_64 
kernel-tools-3.10.0-862.11.6.el7.x86_64 
kernel-3.10.0-862.11.6.el7.x86_64

3、安装模块

代码语言:javascript复制
#在所有虚拟机上操作
[root@k8s-master ~]# modprobe -- ip_vs
[root@k8s-master ~]# modprobe -- ip_vs_rr
[root@k8s-master ~]# modprobe -- ip_vs_wrr
[root@k8s-master ~]# modprobe -- ip_vs_sh
[root@k8s-master ~]# modprobe -- nf_conntrack_ipv4
modprobe: FATAL: Module nf_conntrack_ipv4 not found.
[root@k8s-master ~]# lsmod | grep ip_vs
ip_vs_sh               16384  0
ip_vs_wrr              16384  0
ip_vs_rr               16384  0
ip_vs                 159744  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          159744  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              16384  3 nf_conntrack,xfs,ip_vs
[root@k8s-master ~]# lsmod | grep nf_conntrack_ipv4

4、系统设置

代码语言:javascript复制
#关闭并停止防火墙,
systemctl stop firewalld && systemctl disable firewalld
#禁用SELinux,让容器可以顺利地读取主机文件系统
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

5、配置主机名解析

这个 ip 要根据个人实际情况填写。

代码语言:javascript复制
cat >> /etc/hosts << EOF
192.168.190.147 k8s-master
192.168.190.148 k8s-node1
EOF

6、设置 ipv4 转发

代码语言: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

7、时间同步

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

代码语言:javascript复制
ntpdate time.windows.com

8、安装依赖软件包

代码语言:javascript复制
yum install -y ipvsadm ipset sysstat conntrack libseccomp wget git

9、SSH免密登录

应该都会吧。

代码语言:javascript复制
#此步操作在Master主机上进行
[root@vm01 ~]# ssh-keygen -t rsa
...

#配置公钥到其他节点,输入对方密码即可完成从master到node的免密访问
[root@vm01 ~]# ssh-copy-id k8s-node1
...

10、系统使能

代码语言:javascript复制
sysctl -p

以上皆为版本无关的,接下来安装软件,就需要根据你选择的 k8s 版本而选择不同版本的软件了(指的是 Docker,kube 相关的和你的目的集群版本一致即可):

查看 k8s各版本 对应 各组件版本

11、安装 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-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

12、安装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

13、准备集群镜像

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

加上执行权限,运行。


集群初始化

参数根据个人情况自行替换。

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

上面这个命令只在 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 人点赞