环境规划
集群类型
Kubernetes集群大体上分为两类:
-
一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
-
多主多从:多台Master节点和多台Node节点,搭建复杂,安全性高,适合用于生产环境
安装方式
Kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包
- minikube:一个用于快速搭建单节点kubernetes的工具
- kubeadm:一个用于快速搭建kubernetes集群的工具
- 二进制包:从官网下载每个组件的二进制包,依次安装,有助于理解kubernetes组件
说明:演示选择使用kubeadm方式安装集群环境
主机规划
主机 | IP | 操作体统 | 配置 |
---|---|---|---|
master | 192.168.2.94 | CentOS7.6 | 4U8G 50G |
node1 | 192.168.2.95 | CentOS7.6 | 4U8G 50G |
node2 | 192.168.2.96 | CentOS7.6 | 4U8G 50G |
环境搭建
本次环境需要安装三台CentOS服务器(一主二从),然后在每台服务器分别安装Docker、Kubeadm、Kubelet、Kubectl
主机安装
安装三台服务器
环境配置
检查系统版本
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
此方式安装Kubernetes集群要求CentOS版本在7.5以上
hosts配置
配置主机名解析,有DNS也可以直接配置DNS,方便后面集群节点之间的调用
cat <<EOF>>/etc/hosts
192.168.2.94 master
192.168.2.95 node1
192.168.2.96 node2
EOF
时间同步配置
集群中节点的时间必须精确一致
使用 chronyd
yum install -y chrony
timedatectl set-timezone Asia/Shanghai
## 启动
systemctl start chronyd
## 启用
systemctl enable chronyd
## 停止
systemctl stop chronyd
## 禁用
systemctl disable chronyd
使用 ntp
yum install -y ntp
cat <<EOF>>/var/spool/cron/root
00 12 * * * /usr/sbin/ntpdate -u ntp1.aliyun.com && /usr/sbin/hwclock -w
EOF
##查看计划任务
crontab -l
##手动执行
/usr/sbin/ntpdate -u ntp1.aliyun.com && /usr/sbin/hwclock -w
禁用iptable和firewalld服务
Kubernetes和Docker 在运行的中会产生大量的iptables
规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
关闭iptables服务
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables
selinux 配置
selinux
是linux
系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
需要重启生效
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 临时关闭
setenforce 0
getenforce
禁用swap分区
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响
Kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
vi /etc/fstab
注释掉 /dev/mapper/centos-swap swap
# /dev/mapper/centos-swap swap
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
修改linux的内核参数
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
vi /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
配置ipvs功能
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 1.安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y
# 2.添加需要加载的模块写入脚本文件
[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
EOF
# 3.为脚本添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5.查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
重启服务器
reboot
检查
[root@master ~]# getenforce
Disabled
[root@master ~]# free -m
total used free shared buff/cache available
Mem: 7821 149 7478 8 192 7422
Swap: 0 0 0
安装Docker
curl -sSL https://get.daocloud.io/docker | sh
mkdir /etc/docker
cat <<EOF> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://evcbq79g.mirror.aliyuncs.com"]
}
EOF
# 启用docker
sudo systemctl start docker
sudo systemctl enable docker
# 查看版本
docker version
安装Kubernetes组件
添加源
vi /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
安装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
yum install -y kubeadm kubelet kubectl
配置kubelet的cgroup
cat <<EOF> /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
设置kubelet开机自启
systemctl start kubelet
systemctl enable kubelet
[root@node1 ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
准备集群镜像
查看镜像
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@master ~]# kubeadm config images list
下载镜像
国内无法拉取上述镜像,可以通过aliyun
代理拉取,也可以直接执行下面语句
我先在香港服务器上拉取然后推送的Docker Hub
images=(
kube-apiserver:v1.17.17
kube-controller-manager:v1.17.17
kube-scheduler:v1.17.17
kube-proxy:v1.17.17
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
# pull
for imageName in ${images[@]};do
docker pull jontymax/$imageName
docker tag jontymax/$imageName k8s.gcr.io/$imageName
docker rmi jontymax/$imageName
done
集群初始化
对集群进行初始化,并将node节点加入到集群中
master
节点执行
创建集群
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address=192.168.2.94 \
--kubernetes-version=v1.17.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
重置集群
kubeadm reset -f
创建文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
加入集群
kubeadm join 192.168.2.94:6443 --token dl0jdc.tby7pc1yd2q37wws \
--discovery-token-ca-cert-hash sha256:0210b33b1b18e09cd32e0c6b3a1afa7f5a1e2f8c93f9fa5ccf156a9245fa51d6
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPi5dNnV-1660319434467)(https://cdn.jonty.top/img/image-20220809103525615.png)]
查看节点
kubectl get nodes
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I8Uu94GR-1660319434468)(https://cdn.jonty.top/img/image-20220809103828566.png)]
安装网络插件
Kubernetes支持多种网络插件,比如flannel、calico、canal等
只需要在master节点执行即可,插件使用的是DaemonSet的控制器,会在每个节点运行
下载配置文件
获取配置文件,根目录即可/root/
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
启动flannel
kubectl apply -f kube-flannel.yml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AwyIHtil-1660319434468)(https://cdn.jonty.top/img/image-20220809134455940.png)]
查看节点状态
稍等片刻,集群node节点Ready
kubectl get nodes
至此,Kubernetes集群环境搭建完成
服务部署
在K8s集群中部署Nginx服务,测试集群是否正常
master节点执行
Nginx服务
创建服务
kubectl create deployment nginx --image=nginx:1.14-alpine
暴露端口
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
查看服务
kubectl get pod
kubectl get service
访问服务
使用任意node IP 加端口访问
192.168.2.94:32148
参考文档:
-
Kubeadm unknown service runtime.v1alpha2.RuntimeService ·第4581期 ·集装箱/集装箱式 (github.com)
-
https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY