RHEL8.6使用kubeadm方式安装k8s

RHEL8.6使用kubeadm方式安装k8s

原文主要参考如下链接:主要更换了安装的系统,并解决了一些实际中的安装问题
https://blog.51cto.com/flyfish225/7254537

一:安装前准备

1.1:操作系统

准备3台操作系统,具体版本为:
Red Hat Enterprise Linux release 8.6 (Ootpa)
4.18.0-372.32.1.el8_6.x86_64

1.2:主机规划

依次将下列信息复制进 /etc/hosts文件中,一个管理节点,两个node节点,注意通过命令hostnamectl -sethostname 主机名称 把对应主机名称进行更改,三台都安装

10.10.2.206    k8s-master
10.10.2.207    k8s-node1
10.10.2.208    k8s-node2

1.3:系统初始化(同步时间、关闭防火墙、关闭swap、系统优化)

三台都安装

#同步时间
yum install chrony -y
vim /etc/chrony.conf
#添加以下内容
pool 1.ntp1.aliyun.com iburst
#重启时间服务
systemctl restart chronyd
#修改为时区为上海
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone

在这里插入图片描述
在这里插入图片描述

#关闭防火墙,selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config 
setenforce 0

在这里插入图片描述

# 关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

在这里插入图片描述

#系统优化
cat > /etc/sysctl.d/k8s_better.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
modprobe br_netfilter
lsmod |grep conntrack
modprobe ip_conntrack
sysctl -p /etc/sysctl.d/k8s_better.conf

在这里插入图片描述

1.4:安装ipvs 转发支持

三台都安装

#安装系统依赖包
yum -y install wget jq psmisc vim net-tools nfs-utils socat telnet device-mapper-persistent-data lvm2 git network-scripts tar curl -y
yum install -y conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
#开启ipvs 转发
modprobe br_netfilter 
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
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules 
bash /etc/sysconfig/modules/ipvs.modules 
lsmod | grep -e ip_vs -e nf_conntrack

在这里插入图片描述

二:容器安装

2.1:安装docker

三台都安装

#获取阿里云YUM源
vim /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/8.6/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/rhel/gpg
#更新yum缓存
yum makecache 
#下载安装
yum install -y docker-ce

在这里插入图片描述

#修改cgroup方式
mkdir -p /etc/docker 
#在/etc/docker/daemon.json添加如下内容
{
        "exec-opts": ["native.cgroupdriver=systemd"]
}
#启动docker-ce 
service docker start 
chkconfig docker on 

在这里插入图片描述

2.2:配置cri-docker 环境

三台都安装

#配置cri-docker
# libcgroup 安装
yum install -y libcgroup 
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el8.x86_64.rpm
rpm -ivh cri-dockerd-0.3.4-3.el8.x86_64.rpm
vim /usr/lib/systemd/system/cri-docker.service
修改第10行内容,将原有第十行内容注释掉,换成下面的内容
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://
#重启服务
systemctl restart cri-docker
systemctl enable cri-docker

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.3:配置k8s的yum 源

三台都安装

#添加阿里云YUM软件源,这里用的是1.28的版本的
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
yum makecache

在这里插入图片描述

#查看所有的可用版本,现在最高的就是1.28的版本,我们就默认安装最新的
yum list kubelet --showduplicates | sort -r 

在这里插入图片描述

2.4:安装kubeadm,kubelet和kubectl

三台都安装

yum install -y kubelet kubeadm kubectl

在这里插入图片描述
在这里插入图片描述

#为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
#设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
#准备k8s1.28.10 所需要的镜像
kubeadm config images list --kubernetes-version=v1.28.10

在这里插入图片描述

#使用以下命令从阿里云仓库拉取镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
#可以通过docker images查看
docker images

在这里插入图片描述

在这里插入图片描述
注意这里只在master节点上执行

#集群初始化
#使用kubeadm init命令初始化
在master上执行,报错请看k8s报错汇总
kubeadm init --kubernetes-version=v1.28.10 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=10.10.2.206 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock

--apiserver-advertise-address 集群通告地址
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version K8s版本,与上面安装的一致
--service-cidr 集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致

成功后如下显示
在这里插入图片描述
接下来按照提示来在master上执行以下命令:

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

  export KUBECONFIG=/etc/kubernetes/admin.conf

在这里插入图片描述
在node节点上执行以下命令,(也是从之前master节点安装陈成功以后的输出复制过来的):

kubeadm join 10.10.2.206:6443 --token llz8fb.vy1qaeh5mujzrihh --discovery-token-ca-cert-hash sha256:454a732dc3e43d7bc7dbccb8d5290509daf37febb836125522d0edf25534e7dc 

执行后,如果出现下列报错,是因为你的主机上找到了多个容器运行时接口 (CRI) 端点,并且 kubeadm 无法确定使用哪一个,为了解决这个问题,需要在 kubeadm 配置文件中指定你想要使用的 CRI 端点。
在这里插入图片描述
创建一个kubeadm的配置文件,其中token和caCertHashes替换成安装时候的信息,apiServerEndpoint是master的地址

vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: "10.10.2.206:6443"
    token: "llz8fb.vy1qaeh5mujzrihh"
    caCertHashes:
    - "sha256:454a732dc3e43d7bc7dbccb8d5290509daf37febb836125522d0edf25534e7dc"
nodeRegistration:
  criSocket:  "unix:///var/run/cri-dockerd.sock"

再次在node节点执行以下命令:

 kubeadm join --config kubeadm-config.yaml

执行完成后如下截图
在这里插入图片描述

在master节点上查看节点

#查看集群节点:
kubectl get nodes 

在这里插入图片描述

2.5 集群部署网络插件

在master节点上部署
网络组件有很多种,只需要部署其中一个即可,推荐Calico。
Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。
Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。
此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。

#下载Calico
wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
vim calico.yaml
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"
#vim模式下通过/CALICO_IPV4POOL_CIDR查找后修改
#修改后重新应用下
kubectl apply -f calico.yaml

在这里插入图片描述
在这里插入图片描述

#下载
docker pull docker.io/calico/cni:v3.25.0
docker pull docker.io/calico/node:v3.25.0
docker pull  docker.io/calico/kube-controllers:v3.25.0

此时可能会因为网络连接的原因出现以下报错
在这里插入图片描述
解决方法:
在/etc/docker/daemon.json文件下添加国内镜像加速

vim /etc/docker/daemon.json
#添加后如下所示,注意是json格式的,格式要保持一致
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
    ]
}
#重启服务
systemctl daemon-reload
systemctl restart docker

然后就可以正常拉取了
在这里插入图片描述
#备注:我在这里正常拉取的时候还是重试了很多次,后面突然就好了,不知道为什么,可能是网络的原因,如果在master节点正常拉取了,可以通过命令进行拷贝(其他两个镜像类似操作):

docker save -o calico-cni-v3.25.0.tar calico/cni:v3.25.0
scp calico-cni-v3.25.0.tar root@k8s-node1:/root/
docker load -i /root/calico-cni-v3.25.0.tar
#在master节点上执行以下命令进行查看,所有节点都是running状态
kubectl get pods -n kube-system

在这里插入图片描述

三、部署dashboard

#下载yaml文件,安装版本为2.7版本
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
vim recommended.yaml
#修改配置文件,在文件最后加上以下内容
---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  type: NodePort      
  selector:
    k8s-app: kubernetes-dashboard
    
---
#应用yaml文件
kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard
kubectl get pods,svc -n kubernetes-dashboard

执行wget命令时可能会出现以下提示
在这里插入图片描述
可以登录https://site.ip138.com/ 进行域名和对应IP地址的操作,输入域名raw.githubusercontent.com进行查询,这里选185.199.110.133,然后在/etc/hosts文件中写入
在这里插入图片描述
在这里插入图片描述

再次执行即可下载
在这里插入图片描述
执行完成后如下:(注意这里在执行kubectl apply -f dashboard-user.yaml以后,在执行kubectl get pods -n kubernetes-dashboard命令下dashboard-mertics这个镜像会显示ImagePullBackOff,需要更换镜像源为registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.7即可)
在这里插入图片描述

在这里插入图片描述

#创建用户:
wget https://raw.githubusercontent.com/cby-chen/Kubernetes/main/yaml/dashboard-user.yaml

kubectl apply -f dashboard-user.yaml

在这里插入图片描述

#创建token 
kubectl -n kubernetes-dashboard create token admin-user

在这里插入图片描述

#复制创建出来的token:
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik5OZlJSYTQySDNWelhaVUxxTjhvNFJfUFp2WGd6aGV0dUpMRXM4VGlWaHcifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzE4MDk2NjU3LCJpYXQiOjE3MTgwOTMwNTcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiMGM3NTZjMTAtZTNlZi00MDIzLWI5NTItNmViZjMwYzBjZWExIn19LCJuYmYiOjE3MTgwOTMwNTcsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.GYzi8xzQUjfJDaPNHgqAkA-c5YV6WiYH4E-Ypqu-U9MgpC1eTlXNs_ZPFkBrPQrgYTCqon4TrSIMdCps6zy5c3Gt-MXmCD6Q0rZebPFr9Er-HnCPJiF1p6aQVCeG6HHSorLaQhwdfkhr_VbKDqXSI04QZzJuVnadt7KFqmXpXp_Aa_MXTidxmVaHtQ4GDe563gefUkGi6ePB_wIjHRDXgzKPL-4t1K8YsF5XYHkAA55Cj7DkpKH-QmEvW8wOF5BJy8jmbmKkVKhLY2yJrVn8eiJZpeTqLnAU5QX1IBYiMlv0acKfNDRIsYoinwMr87kxDCLclG2gMfF1bN9wRs4uQw
#打开对应web界面
https://10.10.2.206:30001/#/login

选择token,复制对应token到里面
在这里插入图片描述
登录进去后界面如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、部署nginx测试

#部署一个nginx:
vim web.yaml
---
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: web-deployment-label
  name: web-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-selector
  template:
    metadata:
      labels:
        app: web-selector
    spec:
      containers:
      - name: web-container
        image: nginx:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https

---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: web-service-label
  name: web-service
  namespace: default
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 30443
  selector:
    app: web-selector

---

kubectl apply -f web.yaml
#查看服务
kubectl get deploy,svc,pod 

在这里插入图片描述
这里镜像还是不能拉下来,需要更改对应的镜像源
在这里插入图片描述
在之前的web.yaml中,把containers下的image改为ccr.ccs.tencentyun.com/library/nginx:latest,如下所示,然后重新应用
kubectl apply -f web.yaml
再查看变为running状态为正常
在这里插入图片描述
在这里插入图片描述

然后在三个节点都可以访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值