首页 > 其他分享 >手把手教你在虚拟机中部署K8S集群二

手把手教你在虚拟机中部署K8S集群二

时间:2023-09-03 22:04:18浏览次数:45  
标签:kubectl kubernetes Kubernetes 手把手 虚拟机 集群 docker K8S 节点


我们在:  手把手教你在虚拟机中部署Kubernetes集群(K8S)_ZeroMaster的博客

知道基本的部署方式,但是上面还是有一些问题,比如一些服务启动有问题。下面有一个更详细的方式。实测可用。

一、环境规划

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

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包三种。简介如下:
(1)minikube:一个用于快速搭建单节点的kubernetes工具。
(2)kubeadm:一个用于快速搭建kubernetes集群的工具。
(3)二进制包:从官网上下载每个组件的二进制包依次安装,此方式对于理解kubernetes组件更加有效。
1.集群类型:一主多从
2.安装方式:使用kubeadm工具快速搭建kubernetes集群。
3.主机规划:

角色    IP地址    实验环境
Master    192.168.171.7    Centos7.8 虚拟机
Node1    192.168.171.6    Centos7.8 虚拟机
Node2    192.168.171.4    Centos7.8 虚拟机

二、环境准备

2.1 搭建流程概述:

准备3台机器,要求网络互通(云服务器私网互通,虚拟机网络互通),同时可联网,因为要拉取镜像。
关闭防火墙、selinux、swap分区等,这些是可能会导致k8s集群出问题的地方,需要提前配置好。
安装Docker容器化环境,同时安装三个核心组件:kubeadm、kubelet、kubectl。
下载k8s所需镜像,创建一个Master节点,将Node节点加入到当前集群。
在k8s集群安装相关服务进行验证,登录k8s的WEB的用户界面dashboard。

2.2 安装环境准备

其实简单来说通过两条指令就能部署一个kubernetes集群:
1.创建一个master节点:kubeadm init
2.将node节点加入当前集群:kubeadm join <Master 节点的IP和端口>
在执行kubeadm init 指令后,kubeadm首先会做一系列检查工作,确保机器能够安装kubernetes:

linux系统内核的版本是否必须3.10以上?
linux cgroups模块是否可用?
机器的hostname是否标准?
安装的kubeadm和kubelet是否匹配?
docker是否已经安装?

2.2.1 查看系统内核

uname -r

3.10.0-957.el7.x86_64

如果内核太低,需要升级。

2.2.2 设置主机名和hosts本地解析

这一步的作用是方便识别,如主节点所在的虚拟机命名为k8s-master,从节点所在的虚拟机命名为k8s-node1、k8s-node2(重启或者新开窗口可验证)。

Linux 的 /etc/hosts 文件是配置ip地址及其对应主机名的文件,这里可以记录本机的或其他主机的ip及其对应主机名,方便后面集群节点间的直接调用,因此在每个节点(三台机器)上都配置一下主机名解析。

#根据集群规划,各节点设置对应的主机名
hostnamectl set-hostname master    #192.168.171.7
hostnamectl set-hostname node1     #192.168.171.6
hostnamectl set-hostname node2     #192.168.171.4

vi /etc/hosts 
#所有节点编辑/etc/hosts文件,添加:
127.0.0.1   $(hostname)
192.168.171.7 master
192.168.171.6 node1
192.168.171.4 node2

2.2.3 关闭防火墙和SELinux

在每个节点(三台机器)上都关闭防火墙,并设置开机禁用。

在实际生产环境中,通常会采用防火墙和SELinux来增强系统的安全性,但在学习和测试环境中,这些安全措施可能会造成麻烦。因此,只用于学习环境建议关闭所有节点的防火墙和SELinux,以方便学习和测试。三台机器(所有节点)均需要在部署前配置好环境。

参考:手把手教你在虚拟机中部署Kubernetes集群(K8S)_ZeroMaster的博客

中关闭防火墙和SELinux

2.2.4时间同步

参考:手把手教你在虚拟机中部署Kubernetes集群(K8S)_ZeroMaster的博客

中时间同步

2.2.5 关闭 swap 分区

参考:手把手教你在虚拟机中部署Kubernetes集群(K8S)_ZeroMaster的博客

中关闭swap分区

2.2.6 将桥接的IPv4流量传递到iptables链

  • 1:netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

2:规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
3:在每个节点(三台机器)上都将桥接的IPv4流量传递到iptables的链:

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
#加载br_netfilter模块
modprobe br_netfilter

#查看是否加载
lsmod | grep br_netfilter

#使生效
sysctl --system

#拓展:持久化修改(保留配置包本地文件,重启系统或服务进程仍然有效)
sysctl -p

2.2.7 开启 ipvs

1:ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是4层LAN交换,作为Linux内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。
2:k8s 默认情况下有三种网络负载均衡模式:userspace 代理模式、iptables代理模式、ipvs代理模式。这三种代理模式的负载能力是依次递增的。
3:在 Kubernetes 中 service 有两种代理模型,一种是基于 iptables ,另一种是基于 ipvs 。ipvs 的性能要高于 iptables 的,但是如果要使用它,需要手动载入 ipvs 模块。

#在三台机器安装 ipset 和 ipvsadm :
yum -y install ipset ipvsadm

#在三台机器执行如下脚本:
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

#授权、运行、检查是否加载:
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

2.2.8 重启机器

此时三台机器都基本上完成了安装前准备,因为有些配置是重启后生效,因此建议在每个节点(三台机器)上都重启一下机器(reboot)。

2.3 容器化环境和组件安装

2.3.1 Docker 安装

1:因为安装kubernetes需要docker容器化环境,因此先安装docker,但是注意kubernetes版本和docker的版本对应问题。按本博客的版本即可,如果是安装其他版本,需参考官方文档。
2:Kubernetes 和 Docker之间有版本的对应关系(如 Docker 版本v20.10对应 Kubernetes 的版本是 v1.21),版本对应不上可能会提示docker版本不兼容,可参考Kubernetes各版本对应支持的docker版本列表。
3:在每个节点(3台机器)上都安装docker
 

#卸载旧版本docker(如有)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# yum安装 gcc 相关软件,安装yum工具包
yum -y install gcc gcc-c++
yum -y install yum-utils

#设置阿里云的stable 镜像仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新 yum 软件包索引
yum makecache fast

#安装指定版本的 Docker(v20.10.8):
yum -y install docker-ce-3:20.10.8-3.el7.x86_64 docker-ce-cli-1:20.10.8-3.el7.x86_64 containerd.io

#启动docker并设置开机自启
systemctl start docker
systemctl enable docker

#验证 Docker 是否安装成功:
systemctl status docker
docker -v

2.3.2 设置Docker镜像加速器:

为了下载各组件时从国内镜像源下载,在每个节点(3台机器)上都需要配置镜像加速器。

mkdir -p /etc/docker

#配置阿里云镜像加速:
tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],	
  "registry-mirrors": [
    "https://du3ia00u.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://registry.docker-cn.com"
  ],
  "live-restore": true,
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"},
  "max-concurrent-downloads": 10,
  "max-concurrent-uploads": 5,
  "storage-driver": "overlay2"
}
EOF

#使之生效并重启docker
systemctl daemon-reload
systemctl restart docker

2.3.3 添加阿里云的YUM软件源

由于kubernetes的镜像源在国外,下载软件包较慢或者下载失败,这里在每个节点(3台机器)上都切换成国内的阿里云镜像源。

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
#清除缓存并更新软件包列表
yum clean all
yum makecache
yum list

2.3.4 安装kubeadm、kubelet和kubectl

在每个节点(3台机器)上都需要安装kubeadm、kubelet和kubectl,安装时指定版本为1.21.10。

     kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
     Kubelet:运行在cluster(集群)所有节点上,负责启动POD和容器。
     kubectl是Kubernetes集群的命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件

1.安装三大组件:

yum install -y kubelet-1.21.10 kubeadm-1.21.10 kubectl-1.21.10

#查看安装版本:
kubelet --version

2.为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,修改"/etc/sysconfig/kubelet"文件为以下内容:

vi /etc/sysconfig/kubelet

# 修改为
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

3.设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动:

systemctl enable kubelet

三、kubernetes集群部署

3.1 下载k8s所需镜像

在每个节点(3台机器)上都安装好k8s集群所需的镜像。

1.查看 Kubernetes 安装所需镜像

kubeadm config images list

2.下载 Kubernetes 安装所需镜像

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.0

3.查看镜像下载情况

docker images

3.2 部署 Kubernetes 的 Master 节点

1.在 192.168.171.7 机器上部署 Kubernetes 的 Master 节点:

kubeadm init --kubernetes-version=v1.17.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.171.7

说明:

  • apiserver-advertise-address =Master节点的 IP 地址。
  • image-repository=容器镜像的仓库地址。
  • kubernetes-version= 安装的kubernetes版本号。
  • service-cidr 和 apiserver-advertise-address 、pod-network-cidr 不能在同一个网络范围内。
  • 不要使用 172.17.0.1/16 网段范围,因为这是 Docker 默认使用的。

2.拷贝kubectl使用的连接k8s认证文件到默认路径,根据日志提示,想要开始使用集群,需要在 master节点机器上(192.168.79.101 )执行如下命令:

#创建目录存放 Kubernetes 的配置文件并配置 Kubernetes 客户端工具 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

#将 $HOME/.kube/config 文件的权限修改为当前用户
chown $(id -u):$(id -g) $HOME/.kube/config

# 如果是 root 用户,可以执行如下命令,在使用 kubectl 命令时就不需要每次都指定配置文件的路径
export KUBECONFIG=/etc/kubernetes/admin.conf

3.默认的 token 有效期为 2 小时,当过期之后,该 token 就不能用了,另外也可以生成一个永不过期的token,命令如下 :

#生成token,有效期2小时
kubeadm token create --print-join-command

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

#此时系统自动生成了一个kubeadm join命令,这个命令是用来将一个新的节点加入到 Kubernetes 集群中的。说明:
kubeadm join 192.168.79.101:6443    ----集群的 API Server 地址
  --token y1aqpl.ktwweub0h338qh46   ----用来认证新节点的凭证
  --discovery-token-ca-cert-hash sha256:dca999e4b0fdd14b7e92a6ed3cd1fbfedad273ba409e0bc5a76ebc947bd1f3b2

3.3 部署 Kubernetes 的 Node节点

通过上面自动生成的kubeadm join命令,将两个node节点加入到kubernetes集群中

此时集群已经有了一个节点(master)了,此时是NotReady状态。同样的在192.168.171.6 和 192.168.171.4两台机器上都执行生成的命令把这两个工作节点加入到当前集群:

3.4 部署网络插件

Kubernetes本身并没有自己实现容器网络,而是借助CNI标准,通过插件化的方式来集成各种网络插件,实现集群内部网络相互通信。

Kubernetes集群设计了Cluster IP、Node IP、Pod IP三种类型的通信IP:

(1)Cluster IP是Service对象的IP地址,实现Pod服务的负载均衡,外部网络无法ping通,只在集群内部可以访问使用,是一个虚拟的IP。
(2)Node IP是集群节点Node的IP地址,可以是物理机的IP(也可能是虚拟机IP)。
(3)Pod IP是容器组Pod的IP地址,是在容器组初始化过程由Pause容器申请的IP地址。其中Pod IP是容器网络接口CNI与具体的网络插件来实现IP的申请及数据包的转发。
 

1.Kubernetes 支持多种网络插件,比如 flannel、calico、canal 等,任选一种安装即可,这里选择 calico。在 master节点(192.168.171.7)上执行:

kubectl apply -f https://projectcalico.docs.tigera.io/v3.19/manifests/calico.yaml

2.查看部署 CNI 网络插件进度:

kubectl get pods -n kube-system
#或者
watch kubectl get pods -n kube-system

3.在Master节点使用kubectl工具查看节点状态,此时节点状态应该都是Ready,pod全部running。

kubectl get nodes

到这里一个一主两从的k8s集群已经搭建好了。

3.5 设置 kube-proxy 的 ipvs 模式

1.在 Master节点(192.168.65.101)上设置 kube-proxy 的 ipvs 模式:

kubectl edit cm kube-proxy -n kube-system

找到ipvs模块,将 mode: " " 双引号里面加上ipvs。

2.删除 kube-proxy ,让 Kubernetes 集群自动创建新的 kube-proxy :

kubectl delete pod -l k8s-app=kube-proxy -n kube-system

3.6 配置Node节点也能使用 kubectl 命令

默认情况下,只有 Master 节点才有 kubectl 命令,但是有些时候我们也希望在 Node 节点上执行 kubectl 命令

1.在两个node节点(192.168.171.6 和 192.168.171.4)上都创建config文件,执行命令:

mkdir -pv ~/.kube
touch ~/.kube/config

2.在node节点已经创建好了config文件,接下来将master节点的admin.conf文件远程拷贝复制到需要安装的机器(注意你配置的机器名是什么?如root@k8s-node1)。在master节点(192.168.171.7)上执行:

scp /etc/kubernetes/admin.conf root@node1:~/.kube/config
scp /etc/kubernetes/admin.conf root@node2:~/.kube/config

3.此时在两个node节点验证,已经可以使用kubectl命令了:

拓展:scp命令的应用

  • 机器名一般为root@localhost,把localhost换成机器IP
  • 复制的是目录的话就要加-r参数
  • 复制过程输入yes同意,再输入对应机器密码即可

3.7 服务部署

kubernetes集群已经部署完毕,接下来可以部署服务使用了

在Kubernetes集群中部署nginx1.14,测试下集群是否正常工作。
1.部署Nginx:

kubectl create deployment nginx --image=nginx:1.14-alpine

2.暴露端口:

kubectl expose deployment nginx --port=80 --type=NodePort

3.查看服务状态:

kubectl get pods,svc

3.8 自动补全

启动 kubectl 自动补全功能,参考kubernetes官网:Linux 系统中的 Bash 自动补全功能

# 安装bash
yum -y install bash-completion
# 自动补全 
echo 'source <(kubectl completion bash)' >>~/.bashrc 
kubectl completion bash >/etc/bash_completion.d/kubectl
# 全局
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
source /usr/share/bash-completion/bash_completion


标签:kubectl,kubernetes,Kubernetes,手把手,虚拟机,集群,docker,K8S,节点
From: https://blog.51cto.com/u_16147772/7343523

相关文章

  • k8s安装etcd出现Job for etcd.service failed......"journalctl -xe" for details.
    错误如下先按照提示,输入journalctl-xe看一些详细信息1、针对:startrequestrepeatedtooquicklyforetcd.service错误,解决办法如下vi/usr/lib/systemd/system/etcd.service在[service]部分添加:RestartSec=5(参数作用:如果服务需要被重启,这个参数的值为服务被重启前的......
  • k8s 说一下deployment,statefulset,daemonset 的区别
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)在Kubernetes(K8s)中,Deployment、StatefulSet和DaemonSet是三种常用的控制器对象,用于管理应用程序的部署和运行。它们在不同的场景下有不同......
  • Windows与网络基础——虚拟机镜像相关
    1.虚拟机Windows10安装硬盘分区时,先新建分区,再格式化在启动此电脑——管理——本地用户和组 向下箭头代表为禁用开机状态快照占用内存大于关机状态快照2.虚拟机WindowsServer2016安装要桌面的话,需要选择桌面体验版Server版本的WINDOWS需要给管理员设置密码,且具备复杂性,......
  • 手把手教你vue3-ts-uniapp-vite创建多端小程序-3 统一ui,uni-ui库
    uni-ui官网地址https://uniapp.dcloud.net.cn/component/uniui/quickstart.html1.安装sass、sass-loadernpminstallsass-Dnpminstallsass-loader-D2.安装uni-uinpminstall@dcloudio/uni-ui3.配置easycom。在pages.json中配置"easycom":{"autoscan&q......
  • img文件如何安装在虚拟机内?看这里↓↓↓
    一、安装qemu软件(qemu下载)二、确认软件是否安装成功安装qemu后,打开cmd检测是否安装成功,切换至安装目录下,输如以下命令出现如下版本信息,则表示安装成功!三、将img文件转换为vmdk开始转换img文件,首先确定img文件位置打开cmd,切换至qemu安装目录输入如下命令.\qemu-img.execonvert......
  • 手把手教你vue3-ts-uniapp-vite创建多端小程序-2 设置底部导航
    1.打开项目,打开pages.json,设置底部导航栏。注意pages中的path和tabBar中list中的path要一致{ "pages":[ { "path":"pages/index/index", "style":{ "navigationBarTitleText":"首页" } },{ "pa......
  • 在Kubernetes(K8S)上安装和部署MySQL
    摘要:本文将介绍如何在Kubernetes(K8S)上安装和部署MySQL。我们将通过以下步骤实现这一目标:准备工作、安装MySQL、配置MySQL以及在K8S上部署MySQL。通过本文,您将了解如何使用K8S来管理MySQL的容器化部署,提高应用程序的性能、可靠性和安全性。一、引言MySQL是一种流行的关系型数据库,广......
  • springboot的管理系统连接虚拟机数据库
    1、在配置文件里面进行更改原来的localhost更改为:虚拟机的IP地址:3306用户名密码更改为:Linux系统MYSQL的帐号密码2、有时因为权限不够,就需要进行权限的授予GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'wingkin45';然后就可能会出现这样的问题:我们可能需......
  • SpringBoot管理系统连接虚拟机MYSQL数据库
    1、使用Navicat软件连接虚拟机ip地址填写虚拟机的:192.168.158.129;密码填写虚拟机的mysql的密码:wingkin45;发现弹出这样一个提示框:2、在虚拟机中查看网络端口信息netstat-ntpl找到3306端口;3、在虚拟机中查看防火墙的状态systemctlstatusfirewalld没有3306端口,则就是......
  • ubuntu宿主机和centos7虚拟机如何基于samba共享文件夹
    理论介绍要在Ubuntu宿主机和CentOS虚拟机之间设置基于Samba的文件夹共享,您可以按照以下步骤进行操作:在Ubuntu宿主机上:安装Samba服务器软件:sudoaptupdatesudoaptinstallsamba```````编辑Samba配置文件:sudonano/etc/samba/smb.conf```````在文件末尾添加以下内容来定义......