用kubeadm搭建kubernetes集群

一、用kubeadm部署kubernetes

kubernetes节点架构图:

kubernetes组件架构图:

1.准备基础环境

我们将使用kubeadm部署3个节点的 Kubernetes Cluster,节点信息如下:

主机名

IP地址

角色

OS

组件

最低配置

master

192.168.139.13

master

centos7

kube-apiserver

kube-controller-manager

kube-scheduler

kube-proxy

etcd

coredns

calico

2C2G

node1

192.168.139.14

node1

centos7

kube-proxy

calico

2C2G

node2

192.168.139.15

node2

centos7

kube-proxy

calico

2C2G

node3

192.168.139.16

node3

centos7

calico

kube-proxy

2C2G

2.系统初始化的准备工作(无特殊说明以下操作须在所有节点执行)

2.1修改主机名

#master节点: 
hostnamectl set-hostname master 
#node1节点: 
hostnamectl set-hostname node1 
#node2节点: 
hostnamectl set-hostname node2
#node3节点:
hostnamectl set-hostname node3

注:为了方便可以使用ansible去查看

2.2基础配置

#修改/etc/hosts文件 
cat >> /etc/hosts << EOF 
192.168.139.13 master 
192.168.139.14 node1 
192.168.139.15 node2 
192.168.139.16 node3 
EOF 
#关闭防火墙和selinux 
systemctl stop firewalld && systemctl disable firewalld 
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0 
#临时关闭swap 
swapoff -a 
#永久关闭swap 
sed -ri 's/.*swap.*/#&/' /etc/fstab

2.3配置时间同步

#安装chrony: 
yum install -y chrony 
#注释默认ntp服务器 
sed -i 's/^server/#&/' /etc/chrony.conf 
#指定上游公共 ntp 服务器,并允许其他节点同步时间 
cat >> /etc/chrony.conf << EOF 
server 0.asia.pool.ntp.org iburst 
server 1.asia.pool.ntp.org iburst 
server 2.asia.pool.ntp.org iburst 
server 3.asia.pool.ntp.org iburst 
allow all 
EOF 
#重启chronyd服务并设为开机启动: 
systemctl enable chronyd && systemctl restart chronyd 
#开启网络时间同步功能 
timedatectl set-ntp true

2.3.1 node节点配置时间同步

#安装chrony: 
yum install -y chrony 
#注释默认服务器 
sed -i 's/^server/#&/' /etc/chrony.conf 
#指定内网 master节点为上游NTP服务器 
echo server 192.168.139.13 iburst >> /etc/chrony.conf 
#重启服务并设为开机启动: 
systemctl enable chronyd && systemctl restart chronyd

所有节点执行chronyc sources命令,查看存在以^*开头的行,说明已经与服务器时间同步

2.4 将桥接的IPv4流量传递到iptables的链

由于iptables被绕过会导致流量路由不正确,所以需要在各个节点配置如下:

cat > /etc/sysctl.d/k8s.conf << EOF 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
net.ipv4.ip_forward = 1 
vm.swappiness = 0 
EOF 
#加载br_netfilter模块 
modprobe br_netfilter 
#查看是否加载 
lsmod | grep br_netfilter 
#生效 
sysctl --system

2.5加载ipvs相关模块

为了便于查看ipvs的代理规则,在所有节点安装ipvs和ipset安装包

yum install -y ipvs ipset

由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:

在所有的Kubernetes节点执行以下脚本:

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_ipv4 
EOF 
#执行脚本 
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

三、安装k8s服务安装包

Kubernetes默认的容器运行时仍然是Docker,使用的是kubelet中内置dockershim CRI实现。所以在所有节点需要先安装docker

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

如果出现以下报错,需要安装yum-utils这个安装包:

yum -y install yum-utils

1.安装docker服务和启动docker服务并将其设置为开机启动

yum install -y docker &&systemctl start docker &&docker enable docker

2.配置docker加速并修改驱动

kubernetes官方建议docker驱动采用systemd,当然可以不修改,只是kubeadm init时会有warning([WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/)可以忽略,生产环境建议修改,因为更稳定。

通过docker info 可以查看到安装的docker默认驱动是cgroupfs

在所有节点添加配置加速如下并将驱动修改:

{ 
"exec-opts":["native.cgroupdriver=systemd"], 
"registry-mirrors":["https://bsa5lza7.mirror.aliyuncs.com"] 
}
systemctl daemon-reload 
systemctl restart docker 
docker info |grep "Cgroup Driver"

注:上图中不清楚咋样配置docker加速器可以访问Docker 镜像加速 | 菜鸟教程

3.安装kuberenetes组件

3.1配置kubernetes的yum源

1>kubelet 在集群中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。

2>kubeadm 引导启动k8s集群的命令行工具,用于初始化 Cluster。

3>kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

#配置kubernetes.repo的源,由于官方源国内无法访问,这里使用阿里云yum源 
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

3.2在所有节点上安装指定版本 kubelet、kubeadm 和 kubectl

yum install -y kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0

3.3启动kubelet服务

[root@master yum.repos.d]# systemctl enable kubelet && systemctl start kubelet 
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service. 
[root@master yum.repos.d]# kubelet --version 
Kubernetes v1.21.0

此时kubelet处于不断重启状态,因为集群还没有初始化,kubelet等待kubeadm初始化完成后运行状态正常。

4.部署K8s的master

4.1查看初始化需要的镜像

[root@master yum.repos.d]# kubeadm config images list 
I1217 18:41:32.037319 51446 version.go:254] remote version is much newer: v1.23.1; falling back to: stable-1.21 
k8s.gcr.io/kube-apiserver:v1.21.8 
k8s.gcr.io/kube-controller-manager:v1.21.8 
k8s.gcr.io/kube-scheduler:v1.21.8 
k8s.gcr.io/kube-proxy:v1.21.8 
k8s.gcr.io/pause:3.4.1 
k8s.gcr.io/etcd:3.4.13-0 
k8s.gcr.io/coredns/coredns:v1.8.0

4.2kubeadm init介绍

初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。

可选参数:

--apiserver-advertise-address apiserver的监听地址,有多块网卡时需要指定

(指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。)

--apiserver-bind-port apiserver的监听端口,默认是6443

--cert-dir 通讯的ssl证书文件,默认/etc/kubernetes/pki

--control-plane-endpoint 控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加

--image-repository 拉取镜像的镜像仓库,默认是k8s.gcr.io

--kubernetes-version 指定kubernetes版本

(关闭版本探测,因为它的默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(最新版:v1.21.0)来跳过网络请求。)

--pod-network-cidr pod资源的网段,需与pod网络插件的值设置一致

(指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求)

--service-cidr service资源的网段

--service-dns-domain service全域名的后缀,默认是cluster.local

4.3kubeadm指定具体参数初始化

因为以上镜像都需要从kubernetes官方镜像仓库拉取,国内无法访问,所以需要设置国内的阿里镜像仓库,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers。

4.4部署k8s的Master节点

kubeadm init \ 
--apiserver-advertise-address=192.168.139.13 \ 
--image-repository registry.aliyuncs.com/google_containers \ 
--service-cidr=10.96.0.0/12 \ 
--pod-network-cidr=10.244.0.0/16

初始化成功后会出现如下信息

(注意记录下初始化结果中的kubeadm join命令,部署worker节点时会用到) 上图所示

初始化过程说明:

  1. [preflight] kubeadm 执行初始化前的检查。
  2. [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
  3. [certificates] 生成相关的各种token和证书
  4. [kubeconfig] 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信
  5. [control-plane] 安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像。
  6. [bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
  7. [addons] 安装附加组件 kube-proxy 和 kube-dns。
  8. Kubernetes Master 初始化成功,提示如何配置常规用户使用kubectl访问集群。
  9. 提示如何安装 Pod 网络。
  10. 提示如何注册其他节点到 Cluster。

4.5根据提示信息,在Master节点上使用kubectl工具

kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。

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

注:需要这些配置命令的原因是:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群。

如果不这么做的话,我们每次都需要通过 export KUBECONFIG 环境变量告诉 kubectl 这个安全配置文件的位置。

查看集群组件状态是否正常:

[root@master yum.repos.d]# kubectl get cs 
Warning: v1 ComponentStatus is deprecated in v1.19+ 
NAME               STATUS MESSAGE ERROR 
controller-manager Healthy ok 
scheduler          Healthy ok 
etcd-0             Healthy {"health":"true"}

5.添加node节点

5.1在node1,node2,node3上添加如下命令:

kubeadm join 192.168.139.13:6443 --token irfynt.htcy2ymyoexwkgqx \ 
--discovery-token-ca-cert-hash sha256:865e5dadb2341823edb7677790d7504d1e8f73e6fe86e3c730429fd4c8d7eef9

执行成功后如下图所示代表节点已加入集群中

[root@node3 yum.repos.d]# kubeadm join 192.168.139.13:6443 --token irfynt.htcy2ymyoexwkgqx --discovery-token-ca-cert-hash
sha256:865e5dadb2341823edb7677790d7504d1e8f73e6fe86e3c730429fd4c8d7eef9 
[preflight] Running pre-flight checks [WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service' 
[preflight] Reading configuration from the cluster... 
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' 
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" 
[kubelet-start] Starting the kubelet 
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... 

This node has joined the cluster: 
* Certificate signing request was sent to apiserver and a response was received. 
* The Kubelet was informed of the new secure connection details. 

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

5.2默认的token有效期为24小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token。在master执行此命令

kubeadm token create --print-join-command

如果要生成一个永不过期的token,执行以下命令

kubeadm token create --ttl 0

5.3部署CNI网路插件

在master节点上执行 kubectl get nodes查看节点状态

将网络组件下载到本地并安装

[root@master ~]# wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml 
[root@master ~]# kubectl apply -f calico.yaml

查看部署CNI网络插件进度:

然后再去查看节点状态:

查看集群信息:

查看所有pod,节点,组件都显示正常状态,kubernetes集群就创建完成了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值