WLinux
发布于 2026-04-10 / 2 阅读
0
0

kubernetes安装

K8S集群部署

测试环境最低硬件要求:

1)CPU:2c

2)内存:4G

3)硬盘:50G

机器准备

节点

主机名

IP地址

安装的组件

master

BS-M1

192.168.19.6

apiserver,controller-manager、schedule、kubelet、etcd、kube-proxy、容器运行时、calico、kubeadm

node1

BS-N1

192.168.19.8

kube-proxy、calico、coredns、容器运行时、kubelet、kubeadm

node2

BS-N2

192.168.19.9

kube-proxy、calico、coredns、容器运行时、kubelet、kubeadm

准备工作(三台机器都操作)

关闭selinux和firewalld

为了保证k8s节点之间的正常通信,需要关闭firewalld。

为了保证k8s节点对系统的正常操作,需要关闭SELinux

临时关闭Selinux:

setenforce 0

永久关闭Selinux:

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

关闭firewalld:

systemctl disable firewalld;  systemctl stop firewalld

设置主机名

hostnamectl  set-hostname  bs-m1    # bs-m1上执行
hostnamectl  set-hostname  bs-n1    # bs-n1上执行
hostnamectl  set-hostname  bs-n2    # bs-n2上执行

编辑/etc/hosts

cat  >> /etc/hosts <<EOF
192.168.19.6 bs-m1
192.168.19.8 bs-n1
192.168.19.9 bs-n2
EOF

关闭swap

临时关闭:

swapoff -a 

永久关闭:

vi  /etc/fstab  #注释掉swap那行

将桥接的ipv4流量传递到iptables链

生成bridge相关内核参数

modprobe br_netfilter

将内核参数写入配置文件

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1   # 控制IPv6数据包经过网桥时,传递给ip6tables规则进行处理
net.bridge.bridge-nf-call-iptables = 1    # 控制IPv4数据包经过网桥时,传递给iptables规则进行处理
net.ipv4.ip_forward = 1
EOF

使内核参数生效

sysctl --system
或者
sysctl -p /etc/sysctl.d/k8s.conf

设置时间同步

yum install -y chrony
systemctl start chronyd
systemctl enable chronyd

安装containerd(三台机器都操作)

从Kubernetes 1.20版本开始,Kubernetes官方支持使用Docker和Containerd作为容器运行时使用。从Kubernetes 1.24版本开始,Docker作为容器运行时正式被官方弃用,Containerd成为唯一推荐的容器运行时

安装yum-utils工具

yum install -y yum-utils

配置Docker官方的yum仓库

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装docker因为一些原因导致国内无法安装。

安装docker服务需要给对应的yum仓库配置代理才行。否则无法安装。

安装docker镜像也需要在docker的daemon.json中指定代理才能使用。

yum安装containerd

yum install containerd.io -y

启动containerd服务

systemctl enable containerd
systemctl start containerd

修改sandbox镜像地址----生成默认配置文件

containerd  config default > /etc/containerd/config.toml

修改配置文件

vi  /etc/containerd/config.toml  ##改如下内容
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"   # 修改为阿里云镜像地址
SystemdCgroup = true

pause容器是Pod 的基础容器,用来持有 namespace(尤其是网络 namespace),为 Pod 内所有容器提供共享的运行环境。

sed -i 's|sandbox_image.*|sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"|g' /etc/containerd/config.toml
sed -i 's|SystemdCgroup.*|SystemdCgroup = true|g' /etc/containerd/config.toml

重启containerd服务

systemctl restart containerd

配置代理(必须设置代理(这里的代理为科学上网的代理),否则镜像拉取不下来)

# 查看containerd的systemd管理文件位置
systemctl status containerd.service

# 编辑服务管理文件,在[Service]单元下面增加内容

Environment="HTTP_PROXY=http://proxy.wlinux.top:8083/"
Environment="HTTPS_PROXY=http://proxy.wlinux.top:8083/"
Environment="NO_PROXY=192.168.0.0/16,127.0.0.1/8,10.0.0.0/8,172.16.0.0/12,169.254.0.0/16,aliyuncs.com"

重启containerd服务

systemctl daemon-reload
systemctl restart containerd

安装kubeadm和kubelet(三台机器都操作)

配置kubernetes仓库

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

安装kubeadm和kubelet

yum install -y kubelet-1.26.2  kubeadm-1.26.2  kubectl-1.26.2

Kubelet

Kubernetes的一个核心组件,负责在每个节点上运行Pod并管理其生命周期。它通过容器运行时(如Docker或Containerd)来运行容器。Kubelet负责监控容器的状态、资源使用情况和网络连接情况,并将这些信息报告给Kubernetes的其他组件,以便它们可以协调容器在整个集群中的运行。

Kubeadm

用于启动Kubernetes集群的命令行工具。它负责在集群中的每个节点上初始化Kubernetes控制面和工作负载节点的各种资源。Kubeadm还可以协调集群组件之间的相互依赖关系,并配置默认的网络插件和其他功能。

Kubectl

Kubernetes的命令行工具,可用于管理Kubernetes集群的各个方面,包括创建、部署、管理和监控应用程序、服务和资源。Kubectl可以与Kubernetes API服务器交互,以管理集群的各个方面。

启动kubelet服务

systemctl start kubelet.service
systemctl enable kubelet.service

设置crictl连接containerd

crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock
crictl config --set image-endpoint=unix:///run/containerd/containerd.sock
crictl config --set timeout=10

查看设置后的crictl的配置,配置文件:【/etc/crictl.yaml】

cat /etc/crictl.yaml 
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false

初始化

  • 使用kubeadm初始化k8s(M1上操作)

其要做的事情是将k8s核心的各个组件用容器的形式运行起来,包括aip-server、controller-manager等

kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.19.6 --kubernetes-version=v1.26.2  --service-cidr=192.168.24.0/24  --pod-network-cidr=192.168.25.0/24

其中有一段输出是这样的:

kubeadm join 192.168.19.6:6443 --token 0qkyg0.2x7y4q2cfcxu6fbx \
	--discovery-token-ca-cert-hash sha256:0b3469255aed7441cad08f3e54668c8d406d841418866229020c5919301fea27

上面这条命令就是如果需要将node节点加入到集群需要执行的命令,这个token有效期为24小时,如果过期,可以使用下面命令获取

kubeadm token create --print-join-command
  • 创建配置文件(M1上操作)

这个配置文件指的是,k8s管理员用户的相关配置,如果没有这个配置,我们是无法使用命令行工具去访问k8s里的资源对象的(如,pod、deployment、service等)

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
  • 如果worker节点需要能使用kubectl命令,在worker节点执行下面命令

mkdir -p $HOME/.kube
scp k8s-master:/etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
  • 此时就可以执行如下命令来获取节点、pod信息了:

kubectl get node   # 获取节点信息
kubectl get pod --all-namespaces # 获取所有pod信息

安装完网络插件后,coredns才会正常

  • node节点加入master(N1和N2上操作)

Kubernetes集群每个节点默认允许运行110个pod。

kubeadm join 192.168.19.6:6443 --token 0qkyg0.2x7y4q2cfcxu6fbx \
	--discovery-token-ca-cert-hash sha256:0b3469255aed7441cad08f3e54668c8d406d841418866229020c5919301fea27
  • 查看node信息(M1上操作)

kubectl get node  ##可以看到有三个节点
  • 默认输出的结果如下,worker节点对应的ROLES的值为none

[root@bs-m1 ~]# kubectl get node
NAME    STATUS   ROLES           AGE     VERSION
bs-m1   Ready    control-plane   4h55m   v1.26.2
bs-n1   Ready    <none>          177m    v1.26.2
bs-n2   Ready    <none>          177m    v1.26.2
  • 将工作节点的值标记为worker

[root@bs-m1 ~]# kubectl label node bs-n1 node-role.kubernetes.io/worker=worker
[root@bs-m1 ~]# kubectl label node bs-n2 node-role.kubernetes.io/worker=worker
  • 再次查看所有节点的信息

[root@bs-m1 ~]# kubectl get node
NAME    STATUS   ROLES           AGE     VERSION
bs-m1   Ready    control-plane   4h59m   v1.26.2
bs-n1   Ready    worker          3h1m    v1.26.2
bs-n2   Ready    worker          3h      v1.26.2

安装网络插件(M1上操作)

此时k8s还不能正常工作,因为它的网络插件还未安装,各组件之间还不能正常通信,下面我们来安装calico网络插件

部署calico插件

  • 下载部署calico的yaml文件

curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O
  • 修改yaml文件,定义网段配置

vim calico.yaml  ##找到如下内容
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
# 修改为:
- name: CALICO_IPV4POOL_CIDR
  value: "192.168.25.0/24"           # 规划的pod网络信息
  • 部署calico

kubectl apply -f calico.yaml
  • 查看pod

kubectl get pod -n kube-system

等所有pod都是running状态才算正常


评论