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

注:本次实验是选择一主三从的类型。
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以上
[root@k8s-master ~]# cat /etc/redhat-releaseCentOS 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
- 查看集群健康状况
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和服务
2.6.4 输入任意主机的IP加上端口号进行访问测试

