kubernetes 集群搭建( kubeadm 方式 )

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值