1、 前置知识点
目前生产部署 kubernetes 集群主要有两种方式,kubeadm方式和二进制方式,其中kubeadm方式比较方便快捷,
kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
2 、kubeadm 部署方式介绍
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通
过两条指令完成一个 kubernetes 集群的部署:
第一、创建一个 Master 节点 kubeadm init
第二, 将 Node 节点加入到当前集群中 $ kubeadm join <Master 节点的 IP 和端口 >
3 、安装要求
在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止 swap 分区
4 、最终目标
(1) 在所有节点上安装 Docker 和 kubeadm
(2)部署 Kubernetes Master
(3)部署容器网络插件
(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中
5、环境准备
三台服务器,一主两从:
k8s-master 10.10.181.200
k8s-node1 10.10.181.201
k8s-node2 10.10.181.202
5.1 检查操作系统的版本
cat /etc/redhat-release
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上 [root@master ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
6、系统初始化
以下命令只在master执行
# 在master添加hosts
# 下面六行是一个命令
cat >> /etc/hosts << EOF
10.10.181.200 k8s-master
10.10.181.201 k8s-node1
10.10.181.202 k8s-node2
EOF
# 使用ping命令测试是否配置成功,都可以ping通则配置成功
ping k8s-master
ping k8s-node1
ping k8s-node2
ping k8s-node3
下面命令需在所有节点都要执行
# 关闭防火墙
systemctl stop firewalld #临时关闭防火墙
systemctl disable firewalld #启动时禁用防火墙
# 关闭selinux
setenforce 0 # 临时
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
# 关闭swap,注意swap关闭后将不能使用文件finalshell工具的文件上下传功能【踩坑】
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 根据规划设置主机名,尽量与虚拟机名称一致
# hostnamectl set-hostname k8s-master
# hostnamectl set-hostname k8s-node1
# hostnamectl set-hostname k8s-node2
hostnamectl set-hostname <hostname>
# 将桥接的IPv4流量传递到iptables的链
# 下面这四行是一个命令
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
# wget 安装,wget是k8s用于递归下载文件的工具,如果wget不能使用则需要按钮,-y表示不需要再次输入y确认
yum install wget -y
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
yum命令国内镜像源配置【踩坑】
# yum 命令安装 ,如果yum命令不能正常使用则需要重新配置源
# 把原配置重命名
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 现在新的配置
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清除缓存
yum clean all
# 生成缓存
yum makecache
# 查看使用有可用的仓库,如果所有仓库都是禁用,则需要在网上查找可用的yum镜像源,并重新配置
yum repolist all
或
yum update
到此为止,重启三台机器
reboot
7 、安装 Docker
所有节点都需要安装 Docker
# 下载docker的yum命令镜像源
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 执行安装目录
yum -y install docker-ce-18.06.1.ce-3.el7
# 设置开机启动,并立即启动docker
systemctl enable docker && systemctl start docker
# 检查是否安装成功
docker --version
# 看到下面版本号表示安装成功
# Docker version 18.06.1-ce, build e68fc7a
## 注意,在执行这个步骤之前,需要先测试这个docker源是否还能正常使用,
ping b9pmyelo.mirror.aliyuncs.com
## 若不能使用则需要找到能使用的
# 下面这四行是一个命令
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# 重启docker
systemctl restart docker
# 查看docker服务状态
service docker status
切换镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
8、安装 kubeadm,kubelet和kubectl
所有节点都需要安装
# 在安装之前需要先下载国内k8s的yum镜像源
# 下面十行是一个命令
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 执行安装命令,把三个工具一次性安装好
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet
9、部署Kubernetes Master
以下只是在master节点执行
## 注意apiserver-advertise-address要为master的本机ip,
# 等初始化待命令执行完成
kubeadm init \
--apiserver-advertise-address=10.10.181.200 \
--image-repository registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=Swap \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 确保 $HOME/.kube 目录存在,如果不存在则创建
mkdir -p $HOME/.kube
# 将 Kubernetes 集群的管理员配置文件复制到 $HOME/.kube/config,以便 kubectl 命令可以使用它来连接到集群
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 将 $HOME/.kube/config 文件的所有者和所属组修改为当前用户和当前用户的主要组,这样当前用户就有权限读取和修改这个配置文件了
sudo chown $(id -u):$(id -g) $HOME/.kube/config
10、加入 Kubernetes Node
在 Node节点执行
向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令:
$ kubeadm join 10.10.181.200:6443 --token tpvyrp.1u2yrw4i8cxm5bop \
--discovery-token-ca-cert-hash sha256:fb23a3f81fabf3231ec77e8e901527b14d258177ef8cead747e7a07f8a479a8a
把集群中的节点删除,再重新加入【踩坑】
# 删除指定节点
kubectl delete node k8s-node1
kubeadm join 报错detected “cgroupfs“ as the Docker cgroup driver. The recommended driver is “systemd“.【踩坑】
vi /etc/docker/daemon.json 这个配置
“exec-opts”: [“native.cgroupdriver=systemd”], 此处把systemd为修改driver
# 刷新
sudo systemctl daemon-reload
# 重启
sudo systemctl restart docker
# 查看
cat /etc/docker/daemon.json
11、安装 Pod 网络插件(CNI)
CNI为节点与master通信的插件,在master执行以下命令
# 上述网址为国外源,使用下面网址访问
kubectl apply -f https://raw.gitmirror.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 查看docker镜像服务情况
kubectl get pod -A
使用看到命令【kubectl get pod -A】后如果看到Init:ImagePullBackOff,或者其他镜像问题,大概率是kubectl工具根据kube-flannel.yml配置自动拉取镜像拉取失败了,需按下面排查步骤排查【开始踩大坑】
以下排查步骤为【踩坑、踩坑、踩坑】,踩出来的;没有提到所有机器都有执行,则只在master执行
#############问题排查start###############
# 1.先使用命令【kubectl get pod -A】查看服务的情况,根据镜像的情况,比如检查失败,或者拉取失败等# 执行应对措施
kubectl get pod -A
# 2.1.检查失败,重新拉取
# 2.2.拉取失败,检查docker的镜像源是否可用,不可以则替换为可用的镜像源,参考【https://gitee.com/xxxgod/Java-DevSpace/tree/master/doc】
# 2.3.注意,以下镜像源只是作为参考,需ping通了才算可使用状态,并且是所有机器都要执行的操作
vi /etc/docker/daemon.json # 打开docker镜像源配置文件
# 把下载这些可用ping通的镜像源放置进去,或者自己去网上找可以ping通的docker镜像源
{
"registry-mirrors": [
"https://b9pmyelo.mirror.aliyuncs.com",
"https://ustc-edu-cn.mirror.aliyuncs.com/",
"https://ccr.ccs.tencentyun.com/",
"https://docker.m.daocloud.io/"
]
}
# 2.4.注意:配置好了需要重启docker,不然配置不生效
systemctl restart docker
# 3.检查【kube-flannel.yml】文件中的【image:】后面的镜像配置与上面看到的是否都拉取到了
# 3.1.在浏览器打开上述【kubectl apply -f https://raw.gitmirror.com/coreos/flannel/master/Documentation/kube-flannel.yml】命令对应的配置文件地址,即可查看到kube-flannel.yml文件的内容
# 4.每台机器都手动执行命令拉取镜像【docker pull docker.io/flannel/flannel:v0.25.4】
docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1
docker pull docker.io/flannel/flannel:v0.25.4
# 5.等待5分钟,等待服务自动恢复,若服务自动恢复则不需要执行下面的步骤,以下命令在master执行
kubectl get pod -A #查看各个pod的运行状态
kubectl get nodes #查看节点的运行就绪状态
# 5.1.删除应用,
kubectl delete -f https://raw.gitmirror.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 5.2.重新创建应用
kubectl apply -f https://raw.gitmirror.com/coreos/flannel/master/Documentation/kube-flannel.yml
##############问题排查end################
如果还是不行,可以下载插件到本地安装
# 下载flannel插件的yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改kube-flannel.yml中的镜像仓库地址为国内源
sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml
# 安装网络插件
kubectl apply -f kube-flannel.yml
# 删除网络插件
kubectl delete -f kube-flannel.yml
如下图所示即表示k8s集群搭建成功
12 、测试 kubernetes 集群
在 Kubernetes 集群中创建一个 pod,验证是否正常运行:
# 在 Kubernetes 集群中创建一个名为 nginx 的 Deployment,使用的容器镜像是官方的 Nginx 镜像
kubectl create deployment nginx --image=nginx
# 在 Kubernetes 中创建一个名为 nginx 的服务,并将该服务与 nginx Deployment 关联起来
kubectl expose deployment nginx --port=80 --type=NodePort
# 列出当前 Kubernetes 集群中所有的 Pod 和 Service 的信息
kubectl get pod,svc
# 查看拉取到的pod
kubectl get pod
看到以下日志则表示nginx在master与所有node都部署成功了,
通过master或者node的ip:30924即可访问到nginx,分别访问
10.10.181.200:31219 master
10.10.181.201:31219 node1
10.10.181.202:31219 node2
看到下面说明成功了
13 、k8s安装Kuboard
13.1 在线安装
只是在master节点上执行
#执行安装
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.6/metrics-server.yaml
#删除
kubectl delete -f https://kuboard.cn/install-script/kuboard.yaml
kubectl delete -f https://addons.kuboard.cn/metrics-server/0.3.6/metrics-server.yaml
#查看 Kuboard 运行状态
kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system
# Kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;您可以按如下方式访问 Kuboard。
http://任意一个Worker节点的IP地址:32567/
# 集群master节点上执行以下命令进行登录token的获取,【kuboard-user】用户权限最大
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
或
kubectl -n kube-system get secret | grep kuboard-user
#【kuboard-viewer】用户权限最小
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-viewer | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
或
kubectl -n kube-system get secret | grep kuboard-viewer
镜像拉取失败【踩坑】
error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/a1/a1a5060fe43dc107feab34cdf75cc57c739833fe0ab0744aaa8cda3b45f56082/data?verify=1725445024-hsVuoXyAYwdRzi69suU1iesvOP0%3D: dial tcp 185.45.7.189:443: i/o timeout
解决方法一:修改docker配置
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
或者
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
#重启docker
systemctl daemon-reload
systemctl restart docker
systemctl status docker
解决方法二:设置代理
export http_proxy=http://172.20.40.25:10809
export https_proxy=http://172.20.40.25:10809
#创建一下目录和文件
mkdir /etc/systemd/system/docker.service.d/
vi /etc/systemd/system/docker.service.d/http-proxy.conf
#添加一下内容
[Service]
Environment="HTTP_PROXY=http://172.20.40.25:10809"
Environment="HTTPS_PROXY=http://172.20.40.25:10809"
Environment="NO_PROXY=localhost,127.0.0.1"
#重启
systemctl daemon-reload
systemctl restart docker
#检查代理
docker info | grep -i proxy
13.2 离线安装
kuboard镜像拉取到本地,或者将 kuboard.tar.gz 传输到 Kubernetes 集群的msater节点上
#拉取镜像
docker pull eipwork/kuboard:latest
#把镜像导出压缩包到本地
docker save eipwork/kuboard:latest > kuboard.tar.gz
#获取把下载好的镜像上传到集群服务器上
#加载镜像
docker load -i kuboard.tar.gz
#查看镜像
docker images | grep kuboard
#下载kuboard 镜像包及kuboard.yaml,metrics-server.yaml编排文件的地址
链接:https://pan.baidu.com/s/1WQvDpbkcutmgAjoasFQpsw?pwd=zh19
提取码:zh19
安装Kuboard的yaml文件如下将其保存到 kuboard-offline.yaml 关键点:imagePullPolicy: IfNotPresent
仅在节点上没有该镜像时,从镜像仓库抓取
apiVersion: apps/v1
kind: Deployment
metadata:
name: kuboard
namespace: kube-system
annotations:
k8s.kuboard.cn/displayName: kuboard
k8s.kuboard.cn/ingress: "true"
k8s.kuboard.cn/service: NodePort
k8s.kuboard.cn/workload: kuboard
labels:
k8s.kuboard.cn/layer: monitor
k8s.kuboard.cn/name: kuboard
spec:
replicas: 1
selector:
matchLabels:
k8s.kuboard.cn/layer: monitor
k8s.kuboard.cn/name: kuboard
template:
metadata:
labels:
k8s.kuboard.cn/layer: monitor
k8s.kuboard.cn/name: kuboard
spec:
containers:
- name: kuboard
image: eipwork/kuboard:latest
imagePullPolicy: IfNotPresent
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
---
apiVersion: v1
kind: Service
metadata:
name: kuboard
namespace: kube-system
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 32567
selector:
k8s.kuboard.cn/layer: monitor
k8s.kuboard.cn/name: kuboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kuboard-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kuboard-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kuboard-user
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kuboard-viewer
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kuboard-viewer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: view
subjects:
- kind: ServiceAccount
name: kuboard-viewer
namespace: kube-system
# ---
# apiVersion: extensions/v1beta1
# kind: Ingress
# metadata:
# name: kuboard
# namespace: kube-system
# annotations:
# k8s.kuboard.cn/displayName: kuboard
# k8s.kuboard.cn/workload: kuboard
# nginx.org/websocket-services: "kuboard"
# nginx.com/sticky-cookie-services: "serviceName=kuboard srv_id expires=1h path=/"
# spec:
# rules:
# - host: kuboard.yourdomain.com
# http:
# paths:
# - path: /
# backend:
# serviceName: kuboard
# servicePort: http
离线部署kuboard应用执行kubectl命令
kubectl apply -f kuboard-offline.yaml
kubectl apply -f metrics-server.yaml
#删除
kubectl delete -f kuboard-offline.yaml
kubectl delete -f metrics-server.yaml