一、环境规划

1. 集群类型

Kubernetes集群大体分为两类:一主多从、多主多从

  • 一主多从:一台Master节点多台Node节点,搭建简单,但是有单机故障风险,适合测试环境
  • 多主多从:多台Master节点多多Node节点,搭建麻烦,安全性高,适合生产环境

image-20200404094800622.png

2. 安装方式

Kubernetes有多种安装方式,目前主流的方式有minikube、kubeadm、二进制包

1. minikube

一个用于快速搭建单节点Kubernetes的工具

2. kubeadm

Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kub
eadm join,用于快速部署Kubernetes 集群
官方网址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

3. 二进制包

从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护

3. 主机规划

作用 IP地址 操作系统 配置
k8s-master01 192.168.5.3 Centos7.5 基础设施服务器 2核CPU 2G内存 50G硬盘
k8s-node01 192.168.5.4 Centos7.5 基础设施服务器 2核CPU 2G内存 50G硬盘
k8s-node02 192.168.5.5 Centos7.5 基础设施服务器 2核CPU 2G内存 50G硬盘

二、环境搭建

本次环境搭建需要安装三台Centos服务器(一主二从),然后在每台服务器中分别安装docker (18.06.3),kubeadm (1.17.4)、kubelet (1.17.4)、kubectl (1.17.4)程序

1. 主机安装

安装虚拟机过程中注意下面选项的设置:

  • 操作系统设置:CPU(2C)、内存(2G)、硬盘(50G)
  • 语言选择:中文简体
  • 软件选择:基础设施服务器
  • 分区选择:自动化分区
  • 网络配置:按照下面配置网络地址信息
  1. 网络地址:192.168.142.100(每台主机都不一样,分别为100,101,102
  2. 子网掩码:255.255.255.0
  3. 默认网关:192.168.142.2
  4. DNS223.5.5.5(阿里巴巴)

image.png
image.png

2. 环境初始化

1. 检查操作系统的版本

检查操作系统的版本(要求操作系统的版本至少在7.5以上):

cat /etc/redhat-release

image.png

2. 关闭防火墙和禁止防火墙开机自启动

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

# 关闭防火墙
systemctl stop firewalld
# 关闭防火墙开机自启
systemctl disable firewalld

# 关闭iptables服务(部分系统没有)
systemctl stop iptables
systemctl disable iptables

image.png
注:生产环境谨慎关闭防火墙

3. 设置系统主机名以及 Host 文件的相互解析

设置主机名

hostnamectl set-hostname <hostname>
# 设置192.168.142.100的主机名
hostnamectl set-hostname K8S-Master
# 设置192.168.142.101的主机名
hostnamectl set-hostname K8S-Node1
# 设置192.168.142.102的主机名
hostnamectl set-hostname K8S-Node2

主机名解析

为了方便后面集群节点间的直接调用,需要配置一下主机名解析,企业中推荐使用内部的DNS服务器
修改 _/etc/hosts_ 文件
image.png
image.png

4. 时间同步

  • kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步(企业中建议配置内部的时间同步服务器):
    # 启动chronyd服务
    [root@K8S-Node2 etc]# systemctl start chronyd
    # 启动chronyd服务开机自启
    [root@K8S-Node2 etc]# systemctl enable chronyd
    # date命令验证时间
    [root@K8S-Node2 etc]# date
    2021年 07月 29日 星期四 13:17:38 CST
    

5. 关闭 SELINUX

  • 查看selinux是否开启:

    getenforce
    
  • 永久关闭selinux,需要重启:

    # 修改SELINUX的值为disabled
    vim /etc/selinux/config
    

    image.png

  • 临时关闭selinux,重启之后无效:

    setenforce 0
    

6. 禁用swap分区

  • swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
  • 启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
  • 但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
    #编辑分区配置文件/etc/fstab,注释掉swap分区一行
    #注意修改完毕之后需要重启linux服务
    vim /etc/fstab
    
    image.png

7. 修改Linux内核参数

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

net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1

重新加载配置

sysctl -p

加载网桥过滤模块

modprobe br_netfilter

查看网桥过滤模块是否加载成功

lsmod | grep br_netfilter

8. 配置IPVS功能

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

  • 在每个节点安装ipset和ipvsadm

    yum -y install ipset ipvsadm
    
  • 添加需要加载的模块写入脚本文件中

    vim /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
    
  • 为脚本文件添加执行权限

    chmod 755 /etc/sysconfig/modules/ipvs.modules
    
  • 执行脚本文件

    /bin/bash /etc/sysconfig/modules/ipvs.modules
    
  • 查看对应的模块是否加载成功

    lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    

    image.png

9. 重启服务器

reboot

3. 每个节点安装Docker、kubeadm、kubelet和kubectl

1. 安装Docker

  • 设置阿里云镜像源

    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    
  • 设置镜像仓库

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  • 查看当前镜像源中支持的Docker版本

    yum list docker-ce --showduplicates
    
  • 安装特定版本的Docker-ce(必须指定—setopt=obsoletes=0,否则yum会自动安装更高版本)

    yum -y --setopt=obsoletes=0 install docker-ce-18.06.3.ce-3.el7
    
  • 添加配置文件

    • Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
    • registry-mirrors修改为阿里云镜像 ```shell mkdir -p /etc/docker

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


- 启动服务、查看服务版本
```shell
# 开启docker
systemctl start docker
systemctl enable docker.service
# docker开机自启
systemctl enable docker
# 查看docker版本
docker version

2. 安装Kubernetes组件

设置镜像源

  • 由于Kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
    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
    

安装kubeadm、kubelet和kubectl

  • 由于版本更新频繁,这里指定版本号部署:

    yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
    
  • 为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改”/etc/sysconfig/kubelet”文件的内容:

    vim /etc/sysconfig/kubelet
    
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
  • 设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动:
    systemctl enable kubelet
    

4. 准备集群镜像

  • 在安装Kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可通过下面命令查看

    kubeadm config images list
    
  • 由于镜像在kubernetes仓库中,由于网络原因无法连接,下面提供了一种替代方案(有问题) ```shell images=( kube-apiserver:v1.21.3 kube-controller-manager:v1.21.3 kube-scheduler:v1.21.3 kube-proxy:v1.21.3 pause:3.4.1 etcd:3.4.13-0 coredns:v1.8.0 )

for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/k8sos/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/k8sos/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/k8sos/$imageName done



<a name="63hZD"></a>
## 5. 部署K8S的Master节点

- 部署k8s的Master节点(192.168.142.100):
```shell
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址
# 初始化
kubeadm init \
  --apiserver-advertise-address=192.168.142.100 \
  --image-repository=registry.cn-hangzhou.aliyuncs.com/k8sos \
  --kubernetes-version=v1.21.3 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

执行后Kubernetes会在底层创建数据
image.png

  • 根据提示消息,在Master节点上使用kubectl工具:

      # 执行下面命令
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  • 查看kubernetes节点

    kubectl get nodes
    

    image.png

  • 可在需要移除的节点上,重置kubeadm的安装状态:

    sudo kubeadm reset
    

6. 部署K8S的Node节点

  • 根据提示,在192.168.142.101和192.168.142.102上添加如下的命令(命令取自Master中的提示内容):
    kubeadm join 192.168.142.100:6443 --token 8zbr5j.t75f708ab5umo6pv \
      --discovery-token-ca-cert-hash sha256:40b0c62c1648dcc6110537a3305b0d3fc1eb33e299c1327c787e65a4f552d0db
    

7. 安装网络插件

使用 _kubectl get nodes_ 命令查看节点信息
image.png

kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel

下面操作依旧只在 Master 节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行

  • kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择flannel,如果网络不行,可以使用本人提供的kube-flannel.yml,当然,你也可以安装calico,请点这里calico.yaml,推荐安装calico。
  • 在Master节点上获取flannel配置文件(可能会失败,如果失败,请下载到本地,然后安装):

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
  • 使用配置文件启动flannel:

    kubectl apply -f kube-flannel.yml
    

    image.png

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

    kubectl get pods -n kube-system
    
  • 再次在Master节点使用kubectl工具查看节点状态:

    kubectl get nodes
    

    image.png

  • 查看集群健康状况:

    kubectl get cs
    

    image.png

kubectl cluster-info

image.png

三、服务部署

在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作(Master节点)

  • 部署Nginx:

    kubectl create deployment nginx --image=nginx
    
  • 暴露端口:

    kubectl expose deployment nginx --port=80 --type=NodePort
    
  • 查看服务状态:

    kubectl get pod,svc
    

    image.png