一、安装前准备

1、开启端口
2、同步时间
3、修改主机名
4、关闭/禁用swap(虚拟内存)
5、关闭selinux

1、开启端口

需要开启的端口 :
6443	Kubernetes API server	
2379-2380	etcd server client API	kube-apiserver, etcd
10250	Kubelet API	 控制面
10259	kube-scheduler	
10257	kube-controller-manager	

# 如开启8080端口
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 重启让端口生效
firewall-cmd --reload

# 查看端口是否开通
firewall-cmd --list-ports

2、同步时间

# 查看当前时间
date 

# 同步时间
timedatectl set-timezone Asia/Shanghai && timedatectl set-local-rtc 0

3、修改主机名

# 设置mast 主机
hostnamectl set-hostname mast

# 如果是node 节点
# hostnamectl set-hostname node1

# 修改 hosts
vi /etc/hosts

# 插入如下信息
#mast地址 名称
10.211.55.6 mast
#节点1地址 名称
10.211.55.7 node1

4、 关闭/禁用swap(虚拟内存)

说明:

Swap 是一种操作系统的虚拟内存机制,当物理内存不足时,可以将部分内存数据交换到磁盘上的 Swap 分区中。然而,Swap 的使用会导致以下问题:

性能影响:Swap 是基于磁盘 IO 操作的,与内存相比,磁盘 IO 的速度较慢。当系统频繁使用 Swap 时,会导致应用程序的响应时间延迟,性能下降。

不可预测的行为:Kubernetes 集群中的容器和应用程序通常需要快速和可靠的响应,而 Swap 的使用可能导致容器或应用程序的无法预测的行为,例如被 OOM(Out of Memory)杀死或进程挂起。

内存限制问题:Kubernetes 中的内存限制(Memory Limit)是基于 Cgroups 控制组实现的,而 Swap 使用后,会导致内存限制失效,无法正确管理容器或应用程序的内存使用。

操作:

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

5、关闭selinux

说明:

SELinux(Security-Enhanced Linux)是一种安全机制,用于在操作系统层面上增强安全性。
它通过为每个进程和文件分配安全上下文来实施访问控制策略,限制进程和文件的访问权限。
然而,在某些情况下,SELinux 可能会干扰 Kubernetes 的正常运行.
导致以下问题:

1、容器访问权限问题:Kubernetes 使用容器技术来隔离应用程序,并为每个容器分配一个安全上下文。
SELinux 的强制访问控制可能会阻止容器与其他系统资源进行正确的交互,导致应用程序出现权限问题或无法正常工作。
2、配置复杂性:SELinux 的配置相对复杂,需要熟悉其规则和策略。
如果不正确地配置 SELinux 规则,可能会导致意外的问题,例如应用程序无法启动或文件访问被阻止。

操作:

setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

二、安装

需要安装:
1、docker
2、containerd
3、k8s
4、网络插件

1、安装docker

docker安装教程

设置docker驱动 为systemd ,保持与k8s一致

cat >/etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
  "max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
  "overlay2.override_kernel_check=true"
],
"registry-mirrors":["https://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"]
}
EOF

2、安装containerd

# 安装yum工具包
yum install -y yum-utils

# 添加yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 生成yum源缓存
yum makecache fast

# 安装 containerd
yum install -y containerd.io


# 查询版本,验证是否安装完成
containerd -v
# 配置 containerd 配置文件
# 1、 etc目录 创建containerd 文件
mkdir -p /etc/containerd 

# 2、 创建配置文件config.toml 并指定containerd 
containerd config default > /etc/containerd/config.toml

# 3、编辑config.toml
sed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml
sed -i "s#registry.k8s.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g" /etc/containerd/config.toml
sed -i "/\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors\]/a\        [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"docker.io\"]" /etc/containerd/config.toml
sed -i "/\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"docker.io\"\]/a\          endpoint = [\"https://hub-mirror.c.163.com\",\"https://docker.mirrors.ustc.edu.cn\",\"https://registry.docker-cn.com\"]" /etc/containerd/config.toml
sed -i "/endpoint = \[\"https:\/\/hub-mirror.c.163.com\",\"https:\/\/docker.mirrors.ustc.edu.cn\",\"https:\/\/registry.docker-cn.com\"]/a\        [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"registry.k8s.io\"]" /etc/containerd/config.toml
sed -i "/\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"registry.k8s.io\"\]/a\          endpoint = [\"registry.cn-hangzhou.aliyuncs.com/google_containers\"]" /etc/containerd/config.toml
sed -i "/endpoint = \[\"registry.cn-hangzhou.aliyuncs.com\/google_containers\"]/a\        [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"k8s.gcr.io\"]" /etc/containerd/config.toml
sed -i "/\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"k8s.gcr.io\"\]/a\          endpoint = [\"registry.cn-hangzhou.aliyuncs.com/google_containers\"]" /etc/containerd/config.toml

# 4、重新加载 systemd  
systemctl daemon-reload

在这里插入图片描述

3、安装k8s

I、添加k8s阿里源

ps:这里用的是x86_64,其他系统架构需要切换。
在这里插入图片描述

# 添加 阿里k8s源
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

在这里插入图片描述

II、下载安装k8s(kubelet、kubeadm、kubectl)

# 下载 安装k8s
yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17 --disableexcludes=kubernetes

# 设置驱动方式为systemd


III、启动docker 、 containerd
# 重启docker
systemctl restart docker
# 查看docker是否启动成功
systemctl status  docker
# docker 设置开机自启
systemctl enable docker

# 重启containerd
systemctl restart containerd
# 查看docker是否启动成功
systemctl status  containerd
# docker 设置开机自启
systemctl enable containerd

docker 操作页面
在这里插入图片描述

containerd 操作页面
在这里插入图片描述

IV. 初始化k8s mast 节点
# 初始化 k8s
kubeadm init \
  --apiserver-advertise-address=10.211.55.6\
  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
  --kubernetes-version=v1.23.17 \
  --service-cidr=192.68.0.0/12 \
  --pod-network-cidr=192.244.0.0/16 | tee /k8sdata/log/kubeadm-init.log

# 初始化失败如下图
# 看日志结局报错,下图有举例

-----------  初始化完成跳过下面    -----------

# 解决完出事话报错,使用一下命令进行重设
kubeadm reset

# 再次初始化 重复以上操作,直到初始化完成

初始化命令 解析

--apiserver-advertise-address 
指定 Kubernetes API Server 广播地址,即集群中所有节点可以访问的 IP 地址(当前服务器ip地址)。

--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers:
指定容器镜像的存储库地址。在该示例中,使用阿里云容器镜像服务。

--kubernetes-version=v1.23.17:
指定要安装的 Kubernetes 版本。

--service-cidr=192.68.0.0/12:
指定服务网络的 CIDR 范围。该范围用于分配给 Kubernetes 服务的 IP 地址。

--pod-network-cidr=192.244.0.0/16:
指定 Pod 网络的 CIDR 范围。该范围用于分配给集群中每个 Pod 的 IP 地址。

tee /k8sdata/log/kubeadm-init.log:
将命令的输出保存到指定的日志文件 /k8sdata/log/kubeadm-init.log 中,并在终端上显示输出。 
ps:没有/k8sdata/log/kubeadm-init.log 这个文件会报错

--ignore-preflight-errors=NumCPU,Mem  
用于初始化 Kubernetes 集群并忽略内存大小限制:

k8s初始化报错
在这里插入图片描述
解决报错
1、增加RAm
2、忽略内存大小,在初始化后面加上 --ignore-preflight-errors=NumCPU,Mem ,如下图
在这里插入图片描述

V.初始化node节点

mast 节点初始化完成后会得倒token
在这里插入图片描述
初始化 node
在初始化后面加上–ignore-preflight-errors=NumCPU,Mem (忽略cpu、内存不足)

初始化 node节点:

kubeadm join 10.211.55.6:6443 --token zv0xyz.ioc67yt5wxeqduwd --discovery-token-ca-cert-hash sha256:d48b131f86add7acbdb3cc311903c2e39862ca65798bb5995841252905546dfd --ignore-preflight-errors=NumCPU,Mem  

初始化完成
在这里插入图片描述

VI.启动k8s
# 启动 k8s 
systemctl  start kubelet

# 启动 k8s 
systemctl  status  kubelet

# 自启 k8s  
systemctl  enable  kubelet

# 查看启动失败报错信息 如下图:
journalctl -xe 

启动失败
在这里插入图片描述
报错日志信息
在这里插入图片描述
报错原因:
kubelet 和 docker 的 cgroup 驱动程序设置不一致。kubelet 使用了 systemd cgroup 驱动程序,而 docker 使用了 cgroupfs cgroup 驱动程序。

解决报错:修改docker 驱动与k8s一致

cat >/etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
  "max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
  "overlay2.override_kernel_check=true"
],
"registry-mirrors":["https://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"]
}
EOF

# 重启docker kubelet
systemctl restart docker
systemctl restart docker

kubelet 启动成功
在这里插入图片描述

4、安装网络插件

在 Kubernetes 集群中,Pod(容器)之间需要进行网络通信,因此需要安装一个可靠的网络插件。

安装 flannel或calico 网络插件

转发IPv4并让iptables看到桥接流量

说明

桥接(Bridge)的 IPv4 流量传递到 iptables 的链是为了实现以下几个功能:

1、Pod 之间的通信:Kubernetes 集群中的不同 Pod 在虚拟网络中的通信需要经过 iptables 的 NAT 规则进行转发。
桥接的 IPv4 流量会被 iptables 的 FORWARD 链捕获,根据规则进行数据包转发。

2、节点与 Pod 的通信:Kubernetes 集群中的节点需要与 Pod 进行通信,例如,从节点上的容器内部访问其他 Pod。
通过让桥接的 IPv4 流量传递到 iptables,可以实现节点和 Pod 之间的网络连接。

3、服务发现和负载均衡:Kubernetes 集群中的 Service 是一组 Pod 的抽象,通过 Service 可以实现负载均衡和服务发现。
为了让 Service 能够将流量转发到对应的 Pod,需要通过 iptables 的规则来实现。

配置

# 1、添加 /etc/modules-load.d/k8s.conf  配置如下
vi /etc/modules-load.d/k8s.conf 

# 2、
modprobe overlay
modprobe br_netfilter

# 3、添加/etc/sysctl.d/k8s.conf
vi /etc/sysctl.d/k8s.conf

# 4、 sysctl --system
sysctl --system

k8s.conf

overlay
br_netfilter

/etc/sysctl.d/k8s.conf

et.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
安装flannel

mkdir -p /home/k8s/network/
vi flannelkube-flannel.yml 

kubectl create -f  /home/k8s/network/flannelkube-flannel.yml

flannelkube-flannel.yml

---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    k8s-app: flannel
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
- apiGroups:
  - networking.k8s.io
  resources:
  - clustercidrs
  verbs:
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    k8s-app: flannel
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
    k8s-app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: docker.io/flannel/flannel-cni-plugin:v1.2.0
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: docker.io/flannel/flannel:v0.22.3
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: docker.io/flannel/flannel:v0.22.3
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate

三、报错结局

1、解决k8s集群在节点运行kubectl出现的错误:The connection to the server localhost:8080 was refused - did you specify the right host or port?

出现这个问题的原因是kubectl命令需要使用kubernetes-admin来运行

i.将主节点(master节点)中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下:

scp -r /etc/kubernetes/admin.conf (报错的node节点ip):/etc/kubernetes/admin.conf

ii.配置环境变量

mast与需要的node节点点都配置

echo export KUBECONFIG=/etc/kubernetes/admin.conf >> ~/.bash_profile

iii.立即生效

source ~/.bash_profile

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐