【K8s】Kubernetes入门-02

环境规划

集群类型

Kubernetes集群大体上分为两类:

  • 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境

  • 多主多从:多台Master节点和多台Node节点,搭建复杂,安全性高,适合用于生产环境

image-20220807225935670

安装方式

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

主机安装

安装三台服务器

image-20220807231215279

环境配置

检查系统版本

1
2
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

此方式安装Kubernetes集群要求CentOS版本在7.5以上

hosts配置

配置主机名解析,有DNS也可以直接配置DNS,方便后面集群节点之间的调用

1
2
3
4
5
cat <<EOF>>/etc/hosts
192.168.2.94 master
192.168.2.95 node1
192.168.2.96 node2
EOF

时间同步配置

集群中节点的时间必须精确一致

使用 chronyd

1
2
3
4
5
6
7
8
9
10
yum install -y chrony
timedatectl set-timezone Asia/Shanghai
## 启动
systemctl start chronyd
## 启用
systemctl enable chronyd
## 停止
systemctl stop chronyd
## 禁用
systemctl disable chronyd

使用 ntp

1
2
3
4
5
6
7
8
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

image-20220807232320564

禁用iptable和firewalld服务

Kubernetes和Docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

关闭防火墙

1
2
systemctl stop firewalld
systemctl disable firewalld
1
2
3
4
[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服务

1
2
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables

selinux 配置

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

需要重启生效

1
2
3
4
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 临时关闭
setenforce 0
getenforce

image-20220808141956564

禁用swap分区

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

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

1
2
3
4
5
6
7
8
9
# 编辑分区配置文件/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

image-20220808141929110

修改linux的内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
# 修改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

image-20220808141603448

配置ipvs功能

在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs

两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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

image-20220808141545255

重启服务器

1
reboot

检查

1
2
3
4
5
6
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

image-20220808144501504

为什么要修改docker的cgroup driver

修改Docker的Cgroup Driver为systemd,替换默认的cgroupfs

安装Kubernetes组件

添加源

1
2
3
4
5
6
7
8
9
10
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

1
2
3
[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

1
2
3
4
cat <<EOF> /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

设置kubelet开机自启

1
2
systemctl start kubelet
systemctl enable kubelet

image-20220808145907841

1
2
[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集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看

1
[root@master ~]# kubeadm config images list

image-20220808153955718

下载镜像

国内无法拉取上述镜像,可以通过aliyun代理拉取,也可以直接执行下面语句

我先在香港服务器上拉取然后推送的Docker Hub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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节点执行

创建集群

1
2
3
4
5
6
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

重置集群

1
kubeadm reset -f

创建文件

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

image-20220809102933345

加入集群

1
2
kubeadm join 192.168.2.94:6443 --token dl0jdc.tby7pc1yd2q37wws \
--discovery-token-ca-cert-hash sha256:0210b33b1b18e09cd32e0c6b3a1afa7f5a1e2f8c93f9fa5ccf156a9245fa51d6

image-20220809103525615

查看节点

1
kubectl get nodes

image-20220809103828566

安装网络插件

Kubernetes支持多种网络插件,比如flannel、calico、canal等

只需要在master节点执行即可,插件使用的是DaemonSet的控制器,会在每个节点运行

下载配置文件

获取配置文件,根目录即可/root/

1
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kube-flannel.yml

启动flannel

1
kubectl apply -f kube-flannel.yml

image-20220809134455940

查看节点状态

稍等片刻,集群node节点Ready

1
kubectl get nodes

至此,Kubernetes集群环境搭建完成

image-20220809133903974

服务部署

在K8s集群中部署Nginx服务,测试集群是否正常

master节点执行

Nginx服务

创建服务

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

暴露端口

1
kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort

查看服务

1
2
kubectl get pod
kubectl get service

image-20220809135611076

访问服务

使用任意node IP 加端口访问

192.168.2.94:32148

image-20220809135533022

参考文档