kubernetes学习|用kubeadm搭建kubernetes集群

一、用kubeadm部署kubernetes
kubernetes节点架构图:
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

kubernetes组件架构图:
kubernetes学习|用kubeadm搭建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去查看
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

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

kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

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

kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

2.5加载ipvs相关模块
为了便于查看ipvs的代理规则,在所有节点安装ipvs和ipset安装包
yum install -y ipvs ipset

由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
在所有的Kubernetes节点执行以下脚本:
cat > /etc/sysconfig/modules/ipvs.modules <

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

三、安装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这个安装包:
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

yum -y install yum-utils

kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

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
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

在所有节点添加配置加速如下并将驱动修改:
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

{ "exec-opts":["native.cgroupdriver=systemd"], "registry-mirrors":["https://bsa5lza7.mirror.aliyuncs.com"] }

systemctl daemon-reload systemctl restart docker docker info |grep "Cgroup Driver"

kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

注:上图中不清楚咋样配置docker加速器可以访问Docker 镜像加速 | 菜鸟教程
3.安装kuberenetes组件
3.1配置kubernetes的yum源
1>kubelet 在集群中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。
2>kubeadm 引导启动k8s集群的命令行工具,用于初始化 Cluster。
3>kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。
#配置kubernetes.repo的源,由于官方源国内无法访问,这里使用阿里云yum源 cat < /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

初始化成功后会出现如下信息
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

(注意记录下初始化结果中的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学习|用kubeadm搭建kubernetes集群
文章图片

注:需要这些配置命令的原因是:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群。
如果不这么做的话,我们每次都需要通过 export KUBECONFIG 环境变量告诉 kubectl 这个安全配置文件的位置。
查看集群组件状态是否正常:
[root@master yum.repos.d]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19+ NAMESTATUS MESSAGE ERROR controller-manager Healthy ok schedulerHealthy ok etcd-0Healthy {"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.

kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

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查看节点状态
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

将网络组件下载到本地并安装
[root@master ~]# wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml [root@master ~]# kubectl apply -f calico.yaml

查看部署CNI网络插件进度:
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

然后再去查看节点状态:
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

查看集群信息:
kubernetes学习|用kubeadm搭建kubernetes集群
文章图片

查看所有pod,节点,组件都显示正常状态,kubernetes集群就创建完成了。
【kubernetes学习|用kubeadm搭建kubernetes集群】

    推荐阅读