零 服务器准备

IP 类别
172.16.56.102 master
172.16.56.103 Node1
172.16.56.104 Node2

一 准备工作

准备好一个主节点master的centos7.5以上的机器,准备相关相关环境的node节点机器

下载一个可以批量运维服务器的工具mobaXterm,这个工具暂时只支持windows,其下载地址为:

1
https://mobaxterm.mobatek.net/download-home-edition.html

二 初始化机器的配置信息[9步]

  1. 检查操作系统版本,确保操作系统版本是一致,并且大于7.5版本;

    1
    cat /etc/redhat-release

    输出:

    version

  2. 主机名解析

    为了在集群环境中方便节点调用,配置主机解析功能,在企业内部应该使用DNS解析;

    1
    2
    3
    4
    在 /etc/hosts 文件中,添加主机名解析,如下
    172.16.56.102 master
    172.16.56.103 node1
    172.16.56.104 node2

    上面的地址,就是我们给每个主机分配的ip地址,这个是固定的,我使用102做master节点,使用103、104分别做node1、node2节点;

  3. 时间同步

    kebernetes在内部要求时间必须精确一致,这里使用chronyd服务从网络上同步时间;在生产环境中,应该使用企业内部的时间服务器,保证各个服务器时间一致。

    1
    2
    3
    4
    5
    6
    1 启动chrondy服务
    systemctl start chronyd
    2 设置服务开机自启动
    systemctl enable chronyd
    3 查看时间是否一致,使用date验证
    date

    时间同步

  4. 禁用系统的iptables规则和firewalld规则

    由于docker 和 kebernetes在运行时,会产生大量的iptables规则,为了不让系统的iptables规则和运行时产生的混淆,则关闭系统的iptables规则使用。

    1
    2
    3
    4
    5
    6
    7
    8
    1 关闭firewalld
    systemctl stop firewalld
    2 重启取消自动重启
    systemctl disable firewalld
    3 关闭iptables
    systemctl stop iptables
    4 启动时取消自动重启
    systemctl disable iptables

    本项目中时没有iptables的,所有关闭时会报错,直接跳过即可。

  5. 禁用selinux

    selinux时linux的一个安全服务,如果不关闭,在安装集群中就会出现各种奇葩问题。

    查看:

    getenforce 输出 Enforcing

    关闭:

    1
    2
    3
    vim /etc/selinux/config
    设置:
    SELINUX=disable

    重启操作系统后,则会生效。

  6. 禁用swap分区

    swap分区虚拟内存分区,是指在物理内存耗尽情况下,会将磁盘空间虚拟为内存使用。启用swap设备会对系统性能产生非常负面的影响。因此,kebernetes要求每个节点都禁用swap分区。如果关闭不了分区,则需要在集群安装过程中明确参数进行配置说明。

    1
    2
    3
    分区的配置文件: /etc/fstab
    注释掉swap分区最后一行
    修改完毕后,需要重启linux操作系统
  7. 修改linux内核参数

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

    重新加载配置项:

    sysctl -p

    加载网桥过滤模块:

    modprobe br_netfilter

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

    lsmod | grep br_netfilter

    结果如下:

    linux内核参数修改

  8. 配置ipvs功能

    kubernetes中service对外提供服务,有两种代理模式,iptables和ipvs,从性能角度来看,ipvs性能优于iptables,如果要使用,需要手动载入ipvs模块。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 手动载入ipvs模块
    1. 安装ipset 和ipvsadm
    yum install ipset ipvsadm -y
    2. 添加需要加载的模块脚本
    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. 为添加的脚本添加执行权限
    chmod +x /etc/sysconfig/modules/ipvs.modules

    4. 执行脚本
    /bin/bash /etc/sysconfig/modules/ipvs.modules

    5. 查看对应的模块是否加载成功
    lsmod |grep ip_vs

    如下图:

    添加ipvs

  9. 重启服务器

    reboot

    检查selinux安全检查,检查swap分区状态是否满足要求;

    检查

三 安装Kubernetes相关应用

  1. docker安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # 1. 切换镜像源
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

    # 2. 查看当前镜像源中支持的docker版本
    yum list docker-ce --showduplicates

    # 3. 安装特定版本的docker-ce
    # 必须制定 —setopt=obsoletes=0, 否则yum会自动安装最高版本
    yum install —setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

    # 4. 添加一个配置文件
    # Docker在默认情况下使用的Cgroup Driver为cgroupfs, 而kubernetes推荐使用systemd来代替cgroupfs
    mkdir /etc/docker
    cat <<EOF > /etc/docker/daemon.json
    {
    "exec-opts":["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
    }
    EOF

    # 5. 查看docker版本
    docker version

    # 6. 重启docker
    systemctl restart docker

    # 7. 设置docker开机自动重启
    systemctl enable docker
  2. 安装kubernetes组件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 1. 切换国内的镜像源
    # cd /etc/yum.repos.d/
    vim kubernetes.repo

    # 在文件中添加下列信息
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=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

    # 2. 安装kubeadm、kubelet和kubectl
    yum install —-setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

    # 3. 配置kubelet的cgroup
    # 编辑/etc/sysconfig/kubelet,添加下面的配置
    KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
    KUBE_PROXY_MODE="ipvs"

    # 4. 设置kubelet开机自启
    systemctl enable kubelet
  3. 准备集群镜像

    1
    2
    # 1. 查看kubeadm 目前需要的组件依赖
    kubeadm config images list

    输出结果:

    kubeadm依赖组件

    编写脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    cd ~
    cat <<EOF > /root/kubernetes.sh
    #!/bin/bash
    images=(
    kube-apiserver:v1.17.4
    kube-controller-manager:v1.17.4
    kube-scheduler:v1.17.4
    kube-proxy:v1.17.4
    pause:3.1
    etcd:3.4.3-0
    coredns:1.6.5
    )
    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
    EOF

    添加文件可执行权限:
    chmod +x kubernetes.sh

    运行添加镜像:
    ./kubernetes.sh

    等待安装成功,截图如下:

    拉k8s镜像

  1. 集群的初始化

    4.1. 在master节点上进行集群的初始化

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

    上述必须要保证有2核,如果一核就会报错。

    要保证 kubelet是启动状态

    内存一定要大一点,起码4G,否则会报错

    重制: kubeadm reset

    看节点: kubectl get pods -n kube-system

    4.2. 创建必要文件

    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

    4.3. 让从节点加入到主节点中

1
2
kubeadm join 172.16.56.102:6443 --token dy1nfq.xhcyreop4t3me22k \
--discovery-token-ca-cert-hash sha256:e020f149af492b4f780e19a3fecdf0271a7f3b37583f8124ad712ed30099ec82

   4.4. 安装网络插件(在主节点上操作)

   NotReady 未就绪,网络插件有fannel calico canal,只要给主节点配置即可。

   使用flannel网络插件, 由于flannel插件使用官方的方式安装会报错,所以提前下载好flannel的包,然后倒入到docker环境中。

​ 下载flannel.tar包,然后倒入:

​ docker load -i flannel.tar

​ 下载flannel的yuml配置文件:

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

​ 然后安装:

​ kubectl apply -f kube-flannel.yml

​ 查看pods:

​ kubectl get pods -n kube-system -o wide

​ 删除多余的pods:

​ kubectl delete pod Pod的名字 -n kube-system

​ 查看pod的安装描述信息:

​ kubectl describe pod 名称 -n kube-system

​ 查看nodes:

​ kubectl get nodes

四 测试Nginx

  1. 创建应用

    1
    kubectl create deployment nginx --image=nginx:1.14.2
  2. 暴露端口

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

  3. 应用访问

    1. 删除应用

    kubectl delete deployment nginx

    删除serive

    kubectl delete service,pods nginx -n kube-system

  4. 在node节点上查看

    1
    scp ~/.kube/ root@172.16.56.103:/root/