• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gys001
博客园    首页    新随笔    联系   管理    订阅  订阅

kubeadm方式搭建Kubernetes集群(k8s v1.18)

kubeadm方式搭建k8s集群

流程介绍

【环境准备】准备三台虚拟机,并安装操作系统 CentOS 7.x

【系统初始化】对三个刚安装好的操作系统进行初始化操作

【安装工具】在三个节点安装 docker kubelet kubeadm kubectl

【集群部署-master】在 master 节点执行kubeadm init命令初始化

【集群部署-node】在 node 节点上执行 kubeadm join命令,把 node 节点添加到当前集群

【安装网络插件】配置 CNI 网络插件,用于节点之间的连通

【测试集群】通过拉取一个 nginx 进行测试,能否进行外网测试

环境准备
注:本次部署是单master节点
master 192.168.1.50 node1 192.168.1.51 node2 192.168.1.52

 

在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:

一台或多台机器,操作系统 CentOS7.x-86_x64

硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多

【注意】【注意】【注意】【master 需要两核】

可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点

禁止 swap 分区

系统初始化

注:未特殊说明,则三台设备均需操作

禁用iptable和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 关闭防火墙
systemctl stop firewalld

# 禁用 firewalld 服务
systemctl disable firewalld
禁用selinux

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

# 关闭 selinux

# 临时关闭【立即生效】
setenforce 0

# 永久关闭【重启生效】
sed -i 's/SELINUX=enforcing/\SELINUX=disabled/' /etc/selinux/config

 

# 关闭 swap

禁用swap分区

swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,

因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明。

# 临时关闭【立即生效】
swapoff -a

# 永久关闭【重启生效】
sed -ri 's/.*swap.*/#&/' /etc/fstab
主机名解析
# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname master

# 根据规划设置主机名【node1 节点上操作】
hostnamectl set-hostname node1

# 根据规划设置主机名【node2 节点操作】
hostnamectl set-hostname node2

# 主机master、node静态查询表中添加 hosts
为了方便集群节点间的直接调用,在这个配置一下主机名解析,企业中推荐使用内部DNS服务器

cat >> /etc/hosts << EOF
192.168.1.50 master
192.168.1.51 node1
192.168.1.52 node2
EOF

 

修改linux的内核参数

# 将桥接的 IPv4 流量传递到 iptables 的链(master、node都需要设置)

# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:

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
EOF
# 重新加载配置
sysctl -p # 加载网桥过滤模块 modprobe br_netfilter # 查看网桥过滤模块是否加载成功 lsmod | grep br_netfilter

时间同步

# 时间同步(master、node都需要设置)

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

企业中建议配置内部的会建同步服务器

# 启动chronyd服务

yum -y install chrony
systemctl enable chronyd --now
date

 

配置ipvs功能

在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

# 1.安装ipset和ipvsadm
yum install ipset ipvsadm -y

# 2.添加需要加载的模块写入脚本文件
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

# 3.为脚本添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules

# 4.执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules

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

lsmod | grep -e ip_vs -e nf_conntrack_ipv4

 

安装组件Docker/kubeadm/kubelet

所有节点安装 Docker/kubeadm/kubelet

Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。

安装 Docker
yum -y install wget

添加阿里docker yum源
 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安装docker
yum -y install docker-ce-18.06.1.ce-3.el7
开机自启并启动
systemctl enable docker --now
查看版本
docker version

添加阿里云 YUM 软件源
设置仓库地址
注:这里请用自己的阿里加速地址

cat >/etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF

添加 阿里k8s yum 源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装 kubelet、kubeadm、kubectl
安装kubelet、kubeadm、kubectl,这里指定版本为1.18.0
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

配置kubelet的cgroup
为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改"/etc/sysconfig/kubelet"文件的内容:

#编辑/etc/sysconfig/kubelet

vim /etc/sysconfig/kubelet

KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

# 设置开机自启【这里暂时先不启动 kubelet】
systemctl enable kubelet

 

集群部署master
在master(1.50)执行初始化操作
# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看

[root@master ~]# kubeadm config images list

在 192.168.1.50 上执行【集群初始化命令】,也就是master节点

[root@master ~]# kubeadm init --apiserver-advertise-address=192.168.1.50 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

注:
--pod-network-cidr=10.244.0.0/16 指定pod分配ip的范围(pod网络的范围域)
--service-cidr=10.96.0.0/12 指定service分配ip的范围(service网络的范围域)
apiserver-advertise-address=192.168.1.50 是自己master的ip

 

由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,其实后台已经在拉取镜像了】,

使用docker images 命令即可查看已经拉取的镜像。共计拉取七个镜像

提示初始化成功

Your Kubernetes control-plane has initialized successfully!

部署成功后,【系统提示】运行以下命令使用 kubectl

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.50:6443 --token 1p1n1s.v9ig618gqxb6pniy \
--discovery-token-ca-cert-hash sha256:224a4ee5a62b4c4e283dc7c0165a68608cc70ba7ac759f6c932607aaf70093d7
在master.50上执行
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get nodes

 

集群部署node节点

在两个node节点分别执行

以下的命令是在 master 初始化完成后给出的,每个人的都不一样!!!需要复制自己生成的

kubeadm join 192.168.1.50:6443 --token 1p1n1s.v9ig618gqxb6pniy \
--discovery-token-ca-cert-hash sha256:224a4ee5a62b4c4e283dc7c0165a68608cc70ba7ac759f6c932607aaf70093d7

 

再次查看node状态

[root@master ~]# kubectl get nodes

注:默认的token有效期为24小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token:

kubeadm token create --print-join-command
# 生成一个永不过期的token
kubeadm token create --ttl 0 --print-join-command

 

部署CNI网络插件

上面的状态还是 NotReady,下面我们需要网络插件,来进行联网访问

# 下载网络插件配置(若不成功,多试几次)

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

# 添加
[root@master ~]#kubectl apply -f kube-flannel.yml

# 等一会!

# ......

# 查看状态 【kube-system 是 k8s 中的最小单元】
[root@master ~]# kubectl get pods -n kube-system

等status均为running且ready都是1/1后

再次查看node状态
[root@master ~]]# kubectl get nodes
status状态为running

 

测试 kubernetes 集群

在 Kubernetes 集群中创建一个 pod,验证是否正常运行

下载 nginx 【会联网拉取 nginx 镜像】
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine

# 查看状态
[root@master ~]# kubectl get pod
ContainerCreating是正在创建

如果出现 Running 状态的时候,表示已经成功运行了

下面就需要将端口暴露出去,让外界能够访问
[root@master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort

# 查看一下对外的端口
[root@master ~]# kubectl get pod,svc

此时可通过节点ip:端口访问镜像,看到nginx界面即为测试成功
访问地址:http://节点IP:Port
http://192.168.1.51:31598/

 

参考

黑马B站k8s课程https://www.bilibili.com/video/BV1Qv41167ck/
https://gitee.com/yooome/golang/blob/main/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B-%E8%B0%83%E6%95%B4%E7%89%88/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B.md
https://www.yuque.com/fairy-era/yg511q/xyqxge

 

posted @ 2022-10-31 17:32  gys001  阅读(269)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3