第 2 章 集群环境搭建

环境规划

集群类型

  1. 一主多从
    1. 概念
      1. 一个 master 节点
      2. 多个 node 节点
    2. 特点
      1. 搭建简单
      2. 有单机故障风险
      3. 适合测试环境

  1. 多主多从
    1. 概念
      1. 多个 master 节点
      2. 多个 node 节点
    2. 特点
      1. 搭建麻烦
      2. 安全性高
      3. 适合用于生产环境

本次采用一主多从

安装方式

  1. minikube
    1. 快速搭建单节点 kubernetes

  1. kubeadm
    1. 快速搭建 kubernetes 集群

  1. 二进制包
    1. 官网下载每个组件的二进制包,依次安装

本次采用 kubeadm

主机规划

主机名 IP 操作系统 配置
master 192.168.93.100 Centos 7.6 基础设施服务器 2 核 CPU、50G 硬盘
node1 192.168.93.101 Centos 7.6 基础设施服务器 2 核 CPU、50G 硬盘
node2 192.168.93.102 Centos 7.6 基础设施服务器 2 核 CPU、50G 硬盘

版本选择

组件 版本
docker 18.06.3
kubeadm 1.17.4
kubectl 1.17.4
kubelet 1.17.4

环境搭建

主机安装

  1. 硬件配置
    1. CPU
      1. 2C
    2. 内存
      1. 2G
    3. 硬盘
      1. 50G

  1. 语言选择
    1. 中文简体

  1. 软件安装
    1. 基础设施服务器

  1. 分区选择
    1. 自动分区

  1. 网络配置
    | 网络地址 | 子网掩码 | 默认网关 | DNS |
    | --- | --- | --- | --- |
    | 192.168.93.100 | 255.255.255.0 | 192.168.93.2 | 223.5.5.5 |
    | 192.168.93.101 | 255.255.255.0 | 192.168.93.2 | 223.5.5.5 |
    | 192.168.93.102 | 255.255.255.0 | 192.168.93.2 | 223.5.5.5 |

image-20200505213817934.png


  1. 主机名
    1. master 节点
      1. master
    2. node 节点
      1. node1
    3. node 节点
      1. node2

image-20200505214156148.png

环境初始化

以下操作三台主机都要进行

  1. 系统检查
    1. kubeadmin 安装 kubernetes 集群要求 Centos 版本在 7.5 及以上
cat /etc/redhat-release
  1. 主机名解析
vi /etc/hosts

192.168.93.100  master
192.168.93.101  node1
192.168.93.102  node2
  1. 时间同步
systemctl start chronyd
systemctl enable chronyd
date
  1. 禁用 iptables 和 firewalld 服务
systemctl stop iptables
systemctl disable iptables

systemctl stop firewalld
systemctl disable firewalld
  1. 禁用 selinux
vi /etc/selinux/config

SELINUX=disabled

# 修改完毕后需要重启 linux
  1. 禁用 swap 分区
vi /etc/fstab

# 注释掉 swap 分区一行
# /dev/mapper/centos-swap swap

# 修改完毕后需要重启 linux
  1. 修改 linux 的内核参数
# 修改 linux 的内核参数,添加网桥过滤和地址转发功能
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

# 重新加载配置
sysctl -p

# 加载网桥过滤模块
modprobe br_netfilter

# 查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
-----------
br_netfilter           22256  0 
bridge                151336  1 br_netfilter
  1. 配置 ipvs 功能
# kubernetes 中 service 有两种代理模式
# 基于 iptables
# 基于 ipvs
# ipvs 性能更高,使用 ipvs,需要手动载入 ipvs 模块

# 安装 ipset 和 ipvsadmim
yum install ipset ipvsadmin -y

# 添加需要加载的模块写入脚本文件
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

# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules

# 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules

# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e ip_vs_rr -e ip_vs_wrr -e nf_conntrack_ipv4
  1. 重启服务器
reboot

docker 安装

以下操作三台主机都要进行

# 切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

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

# 安装特定版本的 docker-ce
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce.el7 -y

# docker 默认使用的 Cgroup Driver 为 cgroups,kubernetes 推荐使用 systemd 代替 cgroups
cat <<EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

# 启动 docker
systemctl restart docker
systemctl enable docker

# 查看 docker 版本
docker --version

kubernetes 组件安装

以下操作三台主机都要进行

  1. 切换 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
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
  1. 安装 kubeadm、kubelet、kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
  1. 配置 kubelet 的 cgroup
vi /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs
  1. 设置 kubelet 开机自启
systemctl enable kubelet

准备集群镜像

以下操作三台主机都要进行

  1. 查看集群需要的镜像
kubeadm config images list
---------
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
  1. 下载镜像
# 若 kubenetes 的仓库无法连接,使用下面方案
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

集群初始化

  1. master 节点操作
# 创建集群
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=192.168.93.100

# 创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. node 节点操作
# 该命令相关信息在 kubeadm init 结束后会显示
kubeadm join 192.168.93.100:6443 --token xxxxxx --discovery-token-ca-cert-hash xxxxxx

# 如果没有保存,可以在 master 节点通过下面命令查看
kubeadm token create --print-join-command
---------
W0311 14:55:26.929759   27528 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0311 14:55:26.929911   27528 validation.go:28] Cannot validate kubelet config - no validator is available
kubeadm join 192.168.93.100:6443 --token b5ctcn.qxrwr8xu6ucnwlvv     --discovery-token-ca-cert-hash sha256:85b2687d369eacf5ff08d6f6f9ade63315ee2241531913e0a173322684da763f

网络插件安装

  1. kubernetes 支持的网络插件
    1. flannel
    2. calico
    3. canal
    4. ...

本次选自 flannel

  1. 操作
# 获取 flannel 的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 使用配置文件启动 flannel
kubectl apply -f kube-flannel.yml

# 查看集群节点的状态
kubectl get nodes
------------
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   2d21h   v1.17.4
node1    Ready    <none>   2d21h   v1.17.4
node2    Ready    <none>   2d21h   v1.17.4

至此,kubernetes 集群部署完成!

服务部署

测试部署 nginx 服务

# 部署 nginx
kubectl create deployment nginx --image=nginx:1.14-alpine

# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务状态
kubectl get pods,services
------------
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6867cdf567-lvd6x   1/1     Running   1          2d21h

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        2d22h
service/nginx        NodePort    10.98.50.197   <none>        80:32628/TCP   2d21h
------------

# 访问 nginx 服务

image.png

posted @ 2024-04-01 09:43  Wndexx  阅读(26)  评论(0)    收藏  举报