一、环境规划

1、集群类型

kubernetes集群大体上分为两类:一主多从多主多从

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

图片.png说明:本文档搭建的是 一主两从 类型的集群

2、安装方式

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包

  • minikube:一个用于快速搭建单节点kubernetes的工具
  • kubeadm:kubernetes.io 官方推荐的工具,便于快速安装 kubernetes 集群
  • 二进制包 :从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效

说明:本文档采用kubernetes.io 官方推荐的工具(kubeadm)便捷安装k8s集群

3、主机规划

主机名 IP地址 操作系统 配置
Master 192.168.0.100 CentOS 7.9 2核CPU 2G内存 50G硬盘
Node1 192.168.0.101 CentOS 7.9 2核CPU 2G内存 50G硬盘
Node2 192.168.0.102 CentOS 7.9 2核CPU 2G内存 50G硬盘

4、软件版本

Docker version:19.03.8
Kubernetes version :1.21.2

  • k8s.gcr.io/kube-apiserver:v1.21.2k8s.gcr.io/kube-controller-manager:v1.21.2
  • k8s.gcr.io/kube-scheduler:v1.21.2
  • k8s.gcr.io/kube-proxy:v1.21.2
  • k8s.gcr.io/pause:3.4.1
  • k8s.gcr.io/etcd:3.4.13-0
  • k8s.gcr.io/coredns/coredns:v1.8.0
  • flannel: v0.14.0

    二、环境初始化

    下面的操作需要在_**所有节点**_上执行

    1、主机名解析

    编辑三台服务器的/etc/hosts文件,添加下面内容
    1. 192.168.0.100 master
    2. 192.168.0.101 node1
    3. 192.168.0.102 node2

    2、时间同步

    ntpdate ntp.aliyun.com
    echo "10 1 * * * root ntpdate ntp.aliyun.com" >> /etc/crontab
    

    3、禁用swap分区

    swapoff -a
    sed -ri 's/.*swap.*/#&/' /etc/fstab
    

    4、允许 iptables 检查桥接流量

    ``` cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sudo sysctl —system

<a name="dVSTA"></a>
## 5、安装docker
```bash
 yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io

 systemctl start docker

安装docker参考菜鸟教程:

Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
vim /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}

重启docker

systemctl daemon-reload
systemctl restart docker
systemctl enable docker

6、安装k8s组件

安装kubelet kubeadm kubectl,先配置国内源,再进行安装。

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

# 安装kubeadm、kubelet和kubectl,不指定版本,默认为当前最新版v1.21.2
yum install -y kubelet kubeadm kubectl
# 指定版本安装如下
# yum install --setopt=obsoletes=0 kubeadm-1.21.2-0 kubelet-1.21.2-0 kubectl-1.21.2-0 -y

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

systemctl enable --now kubelet
# kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。

7、拉取集群所需镜像

# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
kubeadm config images list

# 下载镜像
# 此镜像在kubernetes的仓库中,由于网络原因,无法连接,可以先从阿里仓库进行pull,再tag打标签。
images=(
    kube-apiserver:v1.21.2
    kube-controller-manager:v1.21.2
    kube-scheduler:v1.21.2
    kube-proxy:v1.21.2
    pause:3.4.1
    etcd:3.4.13-0  
    coredns/coredns:v1.8.0
)

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

# coredns/coredns:v1.8.0 镜像应该拉取不到,因为在阿里仓库 其名称为coredns:1.8.0,可以先手动拉取再打标签修改名称
docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0

三、集群初始化

下面的操作只需要在_**master节点**_上执行

# 创建集群
[root@master ~]# kubeadm init \
     --kubernetes-version=v1.21.2 \
   --pod-network-cidr=10.244.0.0/16 \
   --service-cidr=10.96.0.0/12 \
   --apiserver-advertise-address=192.168.0.100

# 创建必要文件
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

下面的操作只需要在_**node节点**_上执行

kubeadm join 192.168.0.100:6443\
    --token bh8xta.9r5vcoxg80t0uhcz\
    --discovery-token-ca-cert-hash\ sha256:f6dbd36cc71f97c86c0cfa836d5808469b5a222643694132842f76619d0e060a

四、安装网络插件

kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel
下面操作依旧只在master节点执行即可**,插件使用的是DaemonSet的控制器,它会在每个节点上都运行**

wget https://kuboard.cn/install-script/flannel/flannel-v0.14.0.yaml
kubectl  apply -f flannel-v0.14.0.yaml

稍等片刻,再次查看集群节点的状态

[root@master ~]# kubectl get node 
NAME     STATUS   ROLES                  AGE     VERSION
master   Ready    control-plane,master   7m16s   v1.21.2
node1    Ready    <none>                 3m23s   v1.21.2
node2    Ready    <none>                 3m21s   v1.21.2

至此,kubernetes的集群环境搭建完成