2 集群搭建

2.1 集群类型

  • Kubernetes集群大致分为两类:一主多从和多主多从。
  • 一主多从:一个Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。
  • 多主多从:多台Master和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。

image.png
注:本次实验是选择一主三从的类型。

2.2 k8s安装方式

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

  • minikube:一个用于快速搭建单节点的kubernetes工具。
  • 从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
  • Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。


2.3 环境规划

操作系统 配置 角色 IP地址
Centos7.9 4C8G Master 172.20.1.82
Centos7.9 4C8G node 172.20.1.83
Centos7.9 4C8G node 172.20.1.84
Centos7.9 4C8G node 172.20.1.85

2.4 安装最终要求

  • 在所有节点上安装Docker 和kubeadm
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 部署Kubernetes Master
  • 部署容器网络插件
  • 将node节点加入Kubernetes 集群中
  • 部署Dashboard Web 可视化页面

2.5 环境初始化


2.5.1 检查操作系统版本

kubernetes集群要求Centos版本要在7.5以上

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

2.5.2 设置主机名并进行解析

#每个主机都最好设置成好记的主机名
hostnamectl set-hostname xxxx
#主机名解析,所有节点都需要操作,以下写成自己的IP地址和主机名
echo "172.20.1.82  k8s-master" >> /etc/hosts
echo "172.20.1.83  k8s-node1" >> /etc/hosts
echo "172.20.1.84  k8s-node2" >> /etc/hosts
echo "172.20.1.85  k8s-node3" >> /etc/hosts
#设置完成之后,进行ping 域名 测试

2.5.3 关闭防火墙和禁止防火墙开启启动

#关闭防火墙
systemctl stop firewalld
#禁止防火墙开机启动
systemctl disable firewalld

2.5.4 关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config
#注:操作完之后,最后重启一下服务器
重启后,用getenforce 检查设置是否生效

2.5.5 禁止swap分区

#永久关闭swap分区,需要重启
sed -ri 's/.*swap.*/#&/' /etc/fstab
#临时关闭,重启后,无效
swapoff -a  

#重启后用free -h查看swap分区是否关闭

2.5.6 时间同步

kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间。

# 启动chronyd服务
[root@k8s-master ~]# systemctl start chronyd
[root@k8s-master ~]# systemctl enable chronyd
[root@k8s-master ~]# date


2.5.7 桥接的IPv4流量传递到iptables

在所有节点进行下面操作

#修改linux的内核采纳数,添加网桥过滤和地址转发功能
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

#重新加载配置
sysctl -p
#加载网桥过滤模块
modprobe br_netfilter
#查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter


2.5.8 配置ipvs功能

在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块。
在所有节点进行下面操作

#安装ipset和ipvsadm
yum install ipset ipvsadm -y
#添加需要加载的模块写入脚本文件
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/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 nf_conntrack_ipv4


2.5.8 每个节点安装docker、kubeadm、kubelet和kubectl

  • 安装docker ```

    1.移除以前docker相关包

    sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine
    

2.配置yum源

sudo yum install -y yum-utils sudo yum-config-manager \ —add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装指定docker版本

yum install -y docker-ce-19.03.8-3.el7 docker-ce-cli-19.03.8-3.el7 containerd.io-1.4.6

4.设置docker启动并开机自启动

systemctl enable docker —now 或者写成 systemctl enable docker && systemctl start docker

5.配置docker镜像加速

sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-‘EOF’ { “registry-mirrors”: [“https://lo5tv2hm.mirror.aliyuncs.com“], “exec-opts”: [“native.cgroupdriver=systemd”], “log-driver”: “json-file”, “log-opts”: { “max-size”: “100m” }, “storage-driver”: “overlay2” } EOF sudo systemctl daemon-reload sudo systemctl restart docker


- 所有节点安装**kubelet、kubeadm、kubectl**

由于kubernetes的镜像源在国外,非常慢,这里切换成国内的阿里云镜像

cat <<EOF | sudo tee /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 exclude=kubelet kubeadm kubectl EOF

所有节点安装指定版本kubelet、kubeadm、kubectl

sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 —disableexcludes=kubernetes

设置开启自启动

systemctl enable kubelet


<a name="CtgZI"></a>
#### **2.5.9 查询k8s所需镜像**

kubeadm config images list

<br />
<a name="qqqIl"></a>
#### **2.5.10 下载集群所需镜像**

sudo tee ./images.sh <<-‘EOF’

!/bin/bash

images=( kube-apiserver:v1.20.9 kube-proxy:v1.20.9 kube-controller-manager:v1.20.9 kube-scheduler:v1.20.9 coredns:1.7.0 etcd:3.4.13-0 pause:3.2 ) for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName done EOF

chmod +x ./images.sh && ./images.sh


<a name="mysNj"></a>
#### **2.5.11 集群初始化**

kubeadm init \ —apiserver-advertise-address=172.20.1.82 \ —control-plane-endpoint=k8s-master \ —image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \ —kubernetes-version v1.20.9 \ —service-cidr=10.96.0.0/16 \ —pod-network-cidr=192.168.0.0/16

提示如下证明安装成功!

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster. Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root:

kubeadm join k8s-master:6443 —token 5o260x.yzc9omb0sm5lkk9y \ —discovery-token-ca-cert-hash sha256:08982e7df68643bedfe6132b710990475df622e9a852e84259044b447f7d3edc \ —control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8s-master:6443 —token 5o260x.yzc9omb0sm5lkk9y \ —discovery-token-ca-cert-hash sha256:08982e7df68643bedfe6132b710990475df622e9a852e84259044b447f7d3edc


- 根据提示安装网络节点,kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择calico,(只在master节点安装即可)。
- 文件内容如下

[calico.yaml](https://www.yuque.com/attachments/yuque/0/2022/yaml/25616084/1648988949551-14076832-f527-4d27-8b70-1f687355f15b.yaml?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2022%2Fyaml%2F25616084%2F1648988949551-14076832-f527-4d27-8b70-1f687355f15b.yaml%22%2C%22name%22%3A%22calico.yaml%22%2C%22size%22%3A187731%2C%22type%22%3A%22%22%2C%22ext%22%3A%22yaml%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u27c22576-1a47-44d7-8331-953baea2ae7%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22ufbfeca62%22%2C%22card%22%3A%22file%22%7D)

curl https://docs.projectcalico.org/manifests/calico.yaml -O

kubectl apply -f calico.yaml


- 根据提示创建必要文件

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


- node节点加入集群

kubeadm join k8s-master:6443 —token 5o260x.yzc9omb0sm5lkk9y \ —discovery-token-ca-cert-hash sha256:08982e7df68643bedfe6132b710990475df622e9a852e84259044b447f7d3edc

> 注:默认的token有效期为24小时,当过期之后,该token就不能用,这时可以使用如下的命令创建token:

kubeadm token create —print-join-command

> 生成永不过期的token

kubeadm token create —ttl 0 —print-join-command


- 在master节点查看集群信息

[root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 152m v1.20.9 k8s-node1 Ready 7m56s v1.20.9 k8s-node2 Ready 7m41s v1.20.9 k8s-node3 Ready 7m36s v1.20.9


- 查看集群健康状况

kubectl get cs

<br />
<a name="nerZw"></a>
### **2.6 测试集群**
<br />
<a name="JMKh9"></a>
#### 2.6.1 创建nginx服务

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


<a name="r4fW0"></a>
#### 2.6.2 暴露端口

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


<a name="MJsoh"></a>
#### 2.6.3 查看nginx的pod和服务

kubectl get pods,service ``` image.png

2.6.4 输入任意主机的IP加上端口号进行访问测试

image.png