一、服务器基础配置
1、修改服务器名称
bash
# 修改主机名
hostnamectl set-hostname master170
# 重启服务器
reboot
2、添加ip映射域名
bash
# 输入配置信息
cat >> /etc/hosts <<EOF
121.5.167.170 master170
EOF
# 重启网络服务
systemctl restart NetworkManager.service
3、部署docker和k8s的云环境准备
- kubernetes1.20.9版本,Docker19.03.15版本(k8s和docker的版本要对应)
- 所有节点上都需安装:Docker和kubeadm,kubelet
- 部署容器网络插件(这里使用的是calico)
二、安装docker19.03.15版本
bash
# 1、卸载旧版本docker
sudo yum remove docker*
# 2、安装yum-utils(一次性)
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、为yum源添加docker仓库位置
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4、可以查看所有仓库中所有docker版本,并选择特定版本安装(如下图)
yum list docker-ce --showduplicates | sort --r
# 5、指定安装版本为3:19.03.15-3.el8,与要安装的kubernetes版本兼容。安装版本列表,如下图:
bash
# 6、安装选定的版本:3:19.03.15-3.el8
yum -y install docker-ce-19.03.15-3.el8 docker-ce-cli-19.03.15-3.el8 containerd.io
# 7、配置开机启动docker容器(会创建:/etc/docker 路径)
systemctl enable docker --now
# 8、配置docker的镜像加速(tee命令用于读取标准输入的数据,并将其内容输出成文件)
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 8、加载配置
sudo systemctl daemon-reload
# 10、重启docker
sudo systemctl restart docker
# 11、查看版本(如下图:)
docker version
三、安装Kubernetes1.20.9
1、k8s介绍文档地址
2、k8s安装环境的基础配置
bash
# 2-1、把SELINUX设置为 permissive 模式(相当于禁用)
sudo setenforce 0
sudo sed -i -e "s:SELINUX=.*:SELINUX=permissive:g" /etc/selinux/config
# 2-2、查看是否所有机器必须关闭swap分区。注:关闭Swap可以确保集群的可预测性和稳定性,避免不必要的磁盘交换
free -m
## 不为0,则关闭swap分区
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 2-3、允许 iptables 检查桥接流量(桥接流量:两个网络之间产生的流量)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
# 2-4、添加网桥过滤和地址转发功能(主要用于集群配置)
## 描述说明:
## 网桥:是一个网络设备,用于将不同的网络接口,连接在一起,使得它们可以在同一网络中通信
## 网桥过滤:是指在网桥上对网络数据包进行过滤和处理的功能
## 地址转发:是指在一个网络设备上将收到的网络数据包,从一个网络接口转发到另一个网络接口的功能
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 2-5、从所有系统配置文件中加载参数,显示参数如下图:
sudo sysctl --system
3、k8s参数配置及准备工作
bash
# 3-1、配置k8s的yum源地址
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
EOF
# 3-2、安装tc(防止k8s安装时报警告:tc not found in system path)
yum install iproute-tc --y
# 3-3、清理缓存及重新缓存
# 清理缓存、将服务器的包信息下载到本地电脑缓存起来,提高速度
yum clean all
yum makecache
4、安装 kubelet,kubeadm,kubectl
bash
# 4-1、删除服务器中旧的k8s组件
yum remove -y kubelet kubeadm kubectl
# 4-2、开始安装k8s组件
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
# 4-3、启动、重启、查看kubelet
systemctl enable --now kubelet
systemctl restart kubelet
systemctl status kubelet
5、kuberadm的配置
bash
# 5-1、初始化kubeadm的参数文件
mkdir -p /app/k8s/
kubeadm config print init-defaults > /app/k8s/kubeadm.yaml
# 5-2、列出配置中所需的镜像列表
kubeadm config images list --config kubeadm.yaml
# 5-3、修改kubeadm.yaml的配置
## ① advertiseAddress: 10.0.4.7
## ② imageRepository: registry.aliyuncs.com/google_containers
## ③ kubernetesVersion: v1.20.9
bash
# 5-4、拉取配置文件中的镜像到本地
kubeadm config images pull --config kubeadm.yaml
# 查看拉取的镜像
docker images
# 5-5、k8s master节点部署(从节点无需执行此命令)
kubeadm init --config kubeadm.yaml
# 5-6、若部署失败,则先重新加载及删除一些生成的文件
kubeadm reset
rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*
# 5-7、主节点部署成功后,会有以下内容需要在主、从节点执行(如下图)
# 要开始使用集群,需要以普通用户运行以下命令(主节点可用)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 或者,在root用户执行下列命令(主节点可用)
export KUBECONFIG=/etc/kubernetes/admin.conf
# 5-8、在每个节点上执行,加入到工作节点(集群时,用到)
kubeadm join 10.0.4.7:6443 --token abcdef.0123456789abcdef ...........................
# 如果口令过期,可获取新的口令,得到的口令在从节点执行
kubeadm token create --print-join-command
bash
# 5-9、部署成功后,查看节点状态(如下图)
# 查询节点状态
kubectl get node
# 查看节点健康情况
kubectl get cs
# 查看网络情况
kubectl get pod -A
四、部署遇到的问题处理
1、集群组件Status出现Unhealthy问题
bash
# 1-1、问题:kubectl get cs的Status为Unhealthy
## 编辑文件,并注释这一行【- --port=0】,如下图1(左)
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
## 编辑文件,并注释这一行【- --port=0】,如下图2,(右)
vim /etc/kubernetes/manifests/kube-scheduler.yaml
# 1-2、重启kubelet
systemctl restart kubelet
# 1-3、查看节点健康情况(如下图3)
kubectl get cs
2、pod的Status出现Pending问题
bash
# 2-1、安装pod网络插件(必须操作),可解决问题2和3
## 问题1:kubectl get node的Status为NotReady
## 问题2:kubectl get pod --A的Status为Pending
# 下载calico指定的版本
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O >> /app/k8s/calico.yaml
# 2-2、创建资源,该命令是基于声明性配置工作(执行前,先进入calico.yaml目录下)
## apply 在进行创建资源时,首先会扫描系统是否存在该资源,若不存在则创建,存在则进行更新
## 模板: kubectl apply -f FILENAME(JSON或YAML格式的文件)
kubectl apply -f calico.yaml
# 2-3、重启所有的kube-proxy
kubectl get pod -A | grep kube-proxy | awk '{system("kubectl delete pod "$2" -n kube-system")}'
# 2-4、重新查看网络情况
kubectl get pod --A 和 kubectl get node
3、docker与k8s版本不一致问题
执行命令 : kubeadm init --config kubeadm.yaml ,
出现的警告 :this Docker version is not on the list of validated versions: 20.10.8. Lates validated version:19.03
解决:降低Docker版本为19.xx或18.xx
4、Port 10257 is in use
bash
# 清空一下上一次初始化产生的文件
rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*
# 停用端口,先下载个包
yum install lsof
lsof -i :6443|grep -v "PID"|awk '{print "kill -9",$2}'|sh
lsof -i :10250|grep -v "PID"|awk '{print "kill -9",$2}'|sh
lsof -i :10257|grep -v "PID"|awk '{print "kill -9",$2}'|sh
lsof -i :10259|grep -v "PID"|awk '{print "kill -9",$2}'|sh
# 重新加载一下
kubeadm reset
5、tc not found in system path
bash
# tc命令可以由 iproute-tc 软件包提供,于是尝试先安装
yum install iproute-tc -y
6、kubeadm init相关异常:Initial timeout of 40s passed
bash
# 查看组件需要那种k8s的版本,可提前下载,因有些镜像下载慢
docker images
kubeadm config images list
7、The connection to the server localhost:8080 was refused - did you specify the right host or port?
bash
export KUBECONFIG=/etc/kubernetes/admin.conf
五、Dashboard部署安装
1、下载recommended.yaml文件
所在地址:https://github.com/kubernetes/dashboard/releases?page=1
bash
# 注:kubernetes与dashboard有版本的兼容性
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
2、创建pod或删除pod
bash
kubectl apply -f recommended.yaml
kubectl delete -f recommended.yaml
3、查看dashboard是否创建成功
bash
kubectl get pods --all-namespaces
4、删除现有的服务
bash
kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard
5、创建配置文件kubectl apply -f *
注:在dashboard-svc.yaml文件中,增加对于NodePort的支持;这样发布成功之后不需要执行kubectl
proxy命令,可以直接采用Node IP + 端口进行访问
bash
## 5-1、创建dashboard-svc.yaml文件并导入数据
cat <<EOF | sudo tee /app/dashboard/dashboard-svc.yaml
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30003 ## nodeport映射外部主机访问端口为30003
selector:
k8s-app: kubernetes-dashboard
EOF
# 5-2、创建dashboard-svc.yaml文件并导入数据
cat <<EOF | sudo tee /app/dashboard/dashboard-svc-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1 # 需要修改的地方
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
EOF
# 5-3、声明式创建文件内对象
kubectl apply -f dashboard-svc.yaml
kubectl apply -f dashboard-svc-account.yaml
6、获取登录token
bash
# 6-1、获取登录token文件名
kubectl get secret -n kube-system|grep admin|awk '{print $1}'
# 6-2、获取token内容
kubectl describe secret 文件名(由6-1获取) -n kube-system|awk '/^token/ {print $2}'
7、登录Kubernetes Dashboard
bash
# 7-1、查看kubernetes-dashboard的端口号
kubectl get svc --all-namespaces
# 7-2、登录地址
https://121.5.167.170:30003/