一篇文章让你精通:Kubernetes·第二章
2.1 环境规划
2.1.1 集群类型
Kubernetes集群大体上分为两类:一主多从和多主多从
- 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合英语测试环境
- 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性该,适合用于生产环境
注:以下使用的为一主两从类型的集群
2.1.2 安装方式
Kubernetes有多种部署方式,目前主流的方式有Kubeadm、minikube、二进制包
- Kubeadm:一个用于快速搭建单节点Kubernetes的工具
- minikube:一个用于快速搭建Kubernetes的工具
- 二进制包:从官网下载每个组件的二进制包,依次去安装,次方式对于理解Kubernetes组件更加有效
Kubernetes官网地址传送门
注: 以下使用Kubeadm方式,另外两种方式日后我会单独写文
2.1.3 主机规划
作用 | IP地址 | 操作系统 | 配置 |
---|---|---|---|
Master | 192.168.30.100 | CentOS 8.3 服务器 | CPU*2 - 内存3G - 硬盘50G |
Node1 | 192.168.30.101 | CentOS 8.3 服务器 | CPU*2 - 内存3G - 硬盘50G |
Node2 | 192.168.30.102 | CentOS 8.3 服务器 | CPU*2 - 内存3G - 硬盘50G |
2.2 环境搭建
本次环境搭建需要三台CentOS服务器(一主二从),然后在每台服务器中分别安装docker、kubeadm、kubelet、kubectl程序。
2.2.1 主机安装
安装虚拟机过程中的选择设置:
- 操作系统环境: CPU(2C) 内存(3G) 硬盘(50G)
- 语言选择:中文简体
- 软件选择:服务器
- 网络配置:如下(!!!请根据自己的NAT模式网段配置)
- 主机名:Master、Node1、Node2
网络地址 | 192.168.30.100/101/102 |
子网掩码 | 255.255.255.0 |
默认网关 | 192.168.30.2 |
DNS | 223.5.5.5 |
2.2.2 环境初始化
- 所有操作通过MobaXterm软件实现三台同时操作
- 以下为MobaXterm官网链接
- MobaXterm官网正版
- 以下为MobaXterm度盘链接
- MobaXterm软件——提取码:8t4v
- MobaXterm许可证破解程序——提取码:wlld
- 以上破解软件仅供学习使用,请勿商用,商用请支持正版,违者后果自负
- 检查操作系统的版本
# 此方式下安装Kubernetes集群要求Centos版本要在7.5或之上
[root@Master ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
- 主机名解析
为了方便后面集群节点的之间调用,于此处配置主机名解析,企业中推荐使用内部DNS服务器
#主机名解析 编辑(vim)三台服务器的/etc/hosts文件,添加以下内容
#注:ip地址根据本地IP来,切勿直接复制粘贴以下内容
192.168.30.100 Master
192.168.30.101 Node1
192.168.30.102 Node2
- 同步时间
kubernetes要求集群中的节点时间必须精确一直,这里使chronyd服务从网络同步时间
企业中建议配置内部的时间同步服务器
chrony可使用yum 安装yum install -y chrony
# 启动chronyd服务
[root@Master ~]# systemctl start chronyd
#设置chronyd服务开机自启
[root@Master ~]# systemctl enable chronyd
#chronyd服务启动稍等几秒后,使用date命令验证时间
[root@Master ~]# date
- 禁用iptables和direwalld服务
Kubernetes和Docker在运行中会产生大量的iptables规则,为了不让系统规则与他们混淆,直接关闭系统的规则
# 1 关闭firewalld服务
[root@Master ~]# systemctl stop firewalld
[root@Master ~]# systemctl disable firewalld
# 2 关闭iptables服务
[root@Master ~]# systemctl stop iptables
[root@Master ~]# systemctl disable iptables
- 禁用selinux
selinux是linux系统一下的一个安全服务,若不关闭它,在安装集群中会产生各种各样的问题
#临时关闭,重启后生效
[root@Master ~]# setenforce 0
[root@Master ~]# getenforce //查看状态
Permissive
#永久关闭
# 编辑(vim) /etc/selinux/config 文件,修改SELINUX的值为disabled
# 注意修改完毕之后需要重启linux服务(步骤9统一重启)
SELINUX=disabled
- 禁用swap分区
swap分区值的是虚拟内存分区,它的作用是物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此Kubernetes要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务(步骤9统一重启)
[root@Master ~]# vim /etc/fstab
/dev/mapper/cl-root / xfs defaults 0 0
UUID=c13f844c-0091-46e7-baa6-1f984a427afa /boot xfs defaults 0 0
/dev/mapper/cl-swap none swap defaults 0 0
--------------------------------------------------
#/dev/mapper/cl-swap none swap defaults 0 0
7.修改Linux的内核参数
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
# 编辑/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
8.配置ipvs功能
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 1.安装ipset和ipvsadm
[root@Master ~]# yum install ipset ipvsadm -y
# 2.添加需要加载的模块写入脚本文件 //shell脚本加载模块
[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 #注意高内核版本为nf_conntrack
EOF
# 3.为脚本添加执行权限
[root@Master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.执行脚本文件
[root@Master ~]# /bin/bash /etc/sysconfig/modeules/ipvs.modules
# 5.查看对应的模块是否加载成功
[root@Master ~]# lsmod | grep -e -ip_vs -e nf_conntrack_ipv4
9.完成以上8步后。重启Linux系统
[root@Master ~]# reboot
2.2.3 安装Docker
# 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
# 必须制定allowerasing,解决依赖冲突问题
[root@Master ~]# yum install docker-ce --allowerasing
# 4、添加一个配置文件
#Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
[root@Master ~]# mkdir /etc/docker
[root@Master ~]# cat <<EOF> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 5、启动dokcer
[root@Master ~]# systemctl restart docker
[root@Master ~]# systemctl enable docker
2.2.4 安装Kubernetes组件
# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
#2.
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
# 3、安装kubeadm、kubelet和kubectl
[root@Master ~]# yum install -y kubelet kubeadm kubectl
# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 5、设置kubelet开机自启
[root@Master ~]# systemctl enable kubelet && systemctl start kubelet
2.2.5 准备集群镜像
# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@Master ~]# kubeadm config images list #自己看一下版本号,不然容易报错
k8s.gcr.io/kube-apiserver:v1.22.3
k8s.gcr.io/kube-controller-manager:v1.22.3
k8s.gcr.io/kube-scheduler:v1.22.3
k8s.gcr.io/kube-proxy:v1.22.3
k8s.gcr.io/pause:3.5
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4
# 下载镜像
# 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
images=(
kube-apiserver:v1.22.3
kube-controller-manager:v1.22.3
kube-scheduler:v1.22.3
kube-proxy:v1.17.4
pause:3.5
etcd:3.5.0-0
coredns:v1.8.4
)
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
2.2.6 集群初始化
注:下面的操作只需要在master节点上执行即可
# 创建集群
[root@Master ~]# kubeadm init \
--apiserver-advertise-address=192.168.30.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 创建必要文件
[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
下面的操作只需要在node节点上执行即可
#根据自己的Master得到的命令,在Node1与Node2上操作
kubeadm join 192.168.30.100:6443 --token 9hv50z.0581s37z5q3bkibh \
--discovery-token-ca-cert-hash sha256:7e8b5799c6e707392502146bccf82aadfa7e9901f939d4a34e1f966d5ba34a63
- 在Master上查看信息,Node1,Node2成功进入集群
2.2.7 安装网络插件
kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel
下面操作依旧只在master节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行
#获取fannel的配置文件[root@master ~] # wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#使用配置文件启动fannel
[ root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#检查集群健康,发现报错
[root@Master ~]# kubectl get cs
出现这种情况,是/etc/kubernetes/manifests/下的kube-controller-manager.yaml和kube-scheduler.yaml设置的默认端口是0导致的,解决方式是注释掉对应的port即可,操作如下:
[root@Master ~]# cd /etc/kubernetes/manifests/
[root@Master manifests]# vim kube-controller-manager.yaml
[root@Master manifests]# vim kube-scheduler.yaml
- kube-controller-manager.yaml文件修改:注释掉27行
- kube-scheduler.yaml配置修改:注释掉19行,- --port=0
#Master上重启kubelet,检查集群健康
[root@Master ~]# systemctl restart kubelet.service
[root@Master ~]# kubectl get cs
NICE!
2.3 服务部署
2.3.1 目标
- 在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作。
2.3.2 部署操作
- 部署Nginx
[root@Master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
- 暴露端口
[root@Master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
- 查看服务状态
[root@Master ~]# kubectl get pods,svc
- 在PC浏览器测试结果,尝试访问nginx服务