centos 安装 Kubernetes
kubelet 使用了 systemd cgroup 驱动程序,而 docker 使用了 cgroupfs cgroup 驱动程序。2、忽略内存大小,在初始化后面加上 --ignore-preflight-errors=NumCPU,Mem ,如下图。在 Kubernetes 集群中,Pod(容器)之间需要进行网络通信,因此需要安装一个可靠的网络插件。设置docker驱动 为systemd ,保持
一、安装前准备
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驱动 为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
更多推荐
所有评论(0)