Kubernetes安装

本文详细介绍了如何使用kubeadm在两台服务器上安装Kubernetes集群,包括系统初始化、安装docker和containerd、配置阿里云repo源、安装kubernetes组件以及设置网络和节点。
摘要由CSDN通过智能技术生成

Kubernetes安装

二进制安装

暂无

Kubeadm安装

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令完成一个kubernetes集群的部署

# 创建一个 Master 节点
kubeadm init

# 将一个 Node 节点加入到当前集群中
kubeadm join <Master节点的IP和端口>

1、准备工作

  • 准备至少2台服务器,配置(CPU核心数>=2,内存>=2G,硬盘>=30GB)
  • 操作系统初始化:关闭防火墙,关闭selinux,关闭swap

其中:

禁用iptable和firewalld服务

kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 关闭防火墙
systemctl stop firewalld

# 禁用 firewalld 服务
systemctl disable firewalld
禁用selinux

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

# 临时关闭【立即生效】
setenforce 0

# 永久关闭【重启生效】
sed -i 's/SELINUX=enforcing/\SELINUX=disabled/' /etc/selinux/config
禁用swap分区:

swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,

因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

# 临时关闭【立即生效】
swapoff -a

# 永久关闭【重启生效】
sed -ri 's/.*swap.*/#&/' /etc/fstab
主机重命名,添加hosts工作
# 主机重命名
# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8s-master
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8s-node1
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname k8s-node2
...
# 主机添加hosts
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.12.130 k8s-master
192.168.12.131 k8s-node1
192.168.12.132 k8s-node2
EOF
配置时间同步
yum install ntpdate -y
ntpdate cn.pool.ntp.org
crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
service crond restart
安装基础软件包
yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl- devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm
安装docker:方便拉取和build镜像

直接使用deploy_cloud项目中的安装docker脚本进行安装处理,并修改docker的配置文件:

vi /etc/docker/daemon.json

{
		"registry-mirrors":["https://lmy14a53.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
    "data-root": "/netease/lib/docker"
}
安装containerd运行时(k8s-1.24版本开始放弃使用docker)
# 安装containerd
yum install containerd.io-1.6.6 -y
# 生成containerd配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 修改配置文件 /etc/containerd/config.toml
SystemdCgroup = false ==> SystemdCgroup = true
sandbox_image = "k8s.gcr.io/pause:3.6" ==> sandbox_image="registry.aliyuncs.com/google_containers/pause:3.7"
# 配置containerd开机启动
systemctl enable containerd --now

# 修改/etc/crictl.yaml文件
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
# 重启containerd
systemctl restart containerd

# 配置containerd镜像加速器
vim /etc/containerd/config.toml
找到 config_path = "",修改成如下目录: config_path = "/etc/containerd/certs.d"
# 创建目录,写入内容
mkdir /etc/containerd/certs.d/docker.io/ -p
vim /etc/containerd/certs.d/docker.io/hosts.toml 
[host."https://lmy14a53.mirror.aliyuncs.com",host."https://registry.docker-cn.com"] capabilities = ["pull"]
# 重启containerd
systemctl restart containerd
将桥接的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 
内核模块开机挂载ipvs
cat <<EOF | sudo tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 加载内核模块到当前的内核
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack

查看是否ipvs加载

lsmod |grep -e ip_vs -e nf_conntrack

2、正式安装

配置安装 k8s 组件需要的阿里云的repo源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubelet kubeadm kubectl
yum makecache
# 安装kubelet kubeadm kubectl
yum install -y --nogpgcheck kubelet kubeadm kubectl
# 查看kubelet版本
yum list kubelet --showduplicates | sort -r |grep 1.28
使用kubeadm安装kuberetes
# 查看镜像列表
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2
# 拉取kubernets所需的镜像 
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2 --cri-socket=unix:///run/containerd/containerd.sock

其中,--cri-socket指定了运行时接口的套接字,这里我们使用的是containerd,故制定了containerd的套接字路径(/run/containerd/containerd.sock)
主节点初始化
kubeadm init --kubernetes-version=v1.28.2  --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///run/containerd/containerd.sock

初始化成功输出提示信息:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.2.48:6443 --token bc9npq.wi1l2hfqun9zp8u5 \
	--discovery-token-ca-cert-hash sha256:0ad7500cb4e8926965fe4f7e0c0ab5d24f53279bf5e4a31ae5befdcd730fd78b

此时我们可以通过join命令将node节点添加到master节点上去:

kubeadm join 192.168.2.48:6443 --token bc9npq.wi1l2hfqun9zp8u5 \
	--discovery-token-ca-cert-hash sha256:0ad7500cb4e8926965fe4f7e0c0ab5d24f53279bf5e4a31ae5befdcd730fd78b

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:

kubeadm token create --print-join-command

此时我们在主节点上使用kubectl查看一下kubernetes的节点状态:

kubectl get nodes

NAME         STATUS     ROLES           AGE     VERSION
k8s-master   NotReady   control-plane   8m25s   v1.28.2
k8s-node1    NotReady   <none>          3m57s   v1.28.2

然后我们查看一下kube-system的命令空间节点状态:

NAME                                 READY   STATUS    RESTARTS   AGE
coredns-66f779496c-hlm4k             0/1     Pending   0          8m55s
coredns-66f779496c-hpqvj             0/1     Pending   0          8m55s
etcd-k8s-master                      1/1     Running   0          8m59s
kube-apiserver-k8s-master            1/1     Running   0          8m59s
kube-controller-manager-k8s-master   1/1     Running   0          8m59s
kube-proxy-q5xmj                     1/1     Running   0          4m35s
kube-proxy-sq2zn                     1/1     Running   0          8m55s
kube-scheduler-k8s-master            1/1     Running   0          8m59s

此时发现是coredns这个pod在pending,此时我们部署CNI网络插件,来进行联网访问:

这里存在两个网络插件:flannel和calico

# flannel 
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

# calico
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml -O 
kubectl apply -f calico.yaml

请注意:

  • calico默认POD网络:192.168.0.0/16,若集群pod网络不是192.168.0.0/16则需要修改calico.yaml文件的默认地址

  • flannel默认的pod网络为10.244.0.0/16

这里我们使用的是calico网络插件,执行以后,再分别查看node和kube-system命名空间的状态,可得:

> kubectl get node
NAME         STATUS   ROLES           AGE    VERSION
k8s-master   Ready    control-plane   121m   v1.28.2
k8s-node1    Ready    <none>          117m   v1.28.2

> kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-7c968b5878-w5zgn   1/1     Running   0          8m57s
calico-node-frzt9                          1/1     Running   0          8m57s
calico-node-tj8vz                          1/1     Running   0          8m57s
coredns-66f779496c-hlm4k                   1/1     Running   0          124m
coredns-66f779496c-hpqvj                   1/1     Running   0          124m
etcd-k8s-master                            1/1     Running   0          124m
kube-apiserver-k8s-master                  1/1     Running   0          124m
kube-controller-manager-k8s-master         1/1     Running   0          124m
kube-proxy-q5xmj                           1/1     Running   0          120m
kube-proxy-sq2zn                           1/1     Running   0          124m
kube-scheduler-k8s-master                  1/1     Running   0          124m

此时通过kubeadm搭建一个简单的一主一工作节点的Kubenetes集群成功。这里顺便简单介绍一下我们安装kubernetes这些必备工具的作用:

kube-apiserver:

  • 作用:它是 Kubernetes API 服务器,是集群的控制面,所有的操作和通信都是通过它进行的。

kube-controller-manager:

  • 作用:它运行控制器进程,这些控制器是集群的后台线程,处理常规任务。例如,当副本数量不足时,副本控制器会负责启动新的 Pod。

kube-scheduler:

  • 作用:负责调度 Pod 到集群中的节点上,它选择最合适的节点来运行未调度的 Pod。

kube-proxy:

  • 作用:运行在每个节点上,维护节点网络规则并实现服务的 IP 虚拟化。

etcd:

  • 作用:它是一个键值存储,用于保存所有集群数据,是 Kubernetes 集群的后台数据库。

coredns (或 kube-dns):

  • 作用:提供 DNS 服务给集群内部的服务发现。

kubectl:

  • 作用:虽然 kubectl 不是一个 Pod,但它是一个命令行工具,用于与集群交互和管理资源。

除了这些核心组件,根据你的集群安装方式和配置,可能还会见到以下一些系统组件的 Pods:

Container Network Interface (CNI) 插件的 Pods(如 Calico, Flannel, Weave 等):负责配置节点间的网络,以使得 Pod 间可以通信。

Ingress controller Pods(如 Nginx-Ingress, Traefik 等):负责处理入站连接并将流量路由到集群内的服务。

Storage provisioner Pods(如 Local Persistent Volume Provisioner):负责自动创建存储资源,供集群使用。

Metrics Server 或其他监控工具的 Pods:用于收集节点和 Pod 的资源使用情况。

参考安装博客:

https://developer.aliyun.com/article/1401364

https://lixx.cn/archives/1702371695143

https://blog.csdn.net/weixin_58140255/article/details/129837297

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值