当前位置:   article > 正文

用kubeadm搭建kubernetes集群_kubeadm init --image-repository 的作用

kubeadm init --image-repository 的作用

一、用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修改主机名

  1. #master节点:
  2. hostnamectl set-hostname master
  3. #node1节点:
  4. hostnamectl set-hostname node1
  5. #node2节点:
  6. hostnamectl set-hostname node2
  7. #node3节点:
  8. hostnamectl set-hostname node3

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

2.2基础配置

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

2.3配置时间同步

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

2.3.1 node节点配置时间同步

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

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

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

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

  1. cat > /etc/sysctl.d/k8s.conf << EOF
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. net.ipv4.ip_forward = 1
  5. vm.swappiness = 0
  6. EOF
  7. #加载br_netfilter模块
  8. modprobe br_netfilter
  9. #查看是否加载
  10. lsmod | grep br_netfilter
  11. #生效
  12. sysctl --system

2.5加载ipvs相关模块

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

yum install -y ipvs ipset

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

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

  1. cat > /etc/sysconfig/modules/ipvs.modules <<EOF
  2. #!/bin/bash
  3. modprobe -- ip_vs
  4. modprobe -- ip_vs_rr
  5. modprobe -- ip_vs_wrr
  6. modprobe -- ip_vs_sh
  7. modprobe -- nf_conntrack_ipv4
  8. EOF
  9. #执行脚本
  10. 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

  1. #配置docker yum源
  2. 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

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

  1. {
  2. "exec-opts":["native.cgroupdriver=systemd"],
  3. "registry-mirrors":["https://bsa5lza7.mirror.aliyuncs.com"]
  4. }
  1. systemctl daemon-reload
  2. systemctl restart docker
  3. 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 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

  1. #配置kubernetes.repo的源,由于官方源国内无法访问,这里使用阿里云yum源
  2. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  3. [kubernetes]
  4. name=Kubernetes
  5. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  6. enabled=1
  7. gpgcheck=1
  8. repo_gpgcheck=1
  9. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. 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服务

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

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

4.部署K8s的master

4.1查看初始化需要的镜像

  1. [root@master yum.repos.d]# kubeadm config images list
  2. I1217 18:41:32.037319 51446 version.go:254] remote version is much newer: v1.23.1; falling back to: stable-1.21
  3. k8s.gcr.io/kube-apiserver:v1.21.8
  4. k8s.gcr.io/kube-controller-manager:v1.21.8
  5. k8s.gcr.io/kube-scheduler:v1.21.8
  6. k8s.gcr.io/kube-proxy:v1.21.8
  7. k8s.gcr.io/pause:3.4.1
  8. k8s.gcr.io/etcd:3.4.13-0
  9. 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节点

  1. kubeadm init \
  2. --apiserver-advertise-address=192.168.139.13 \
  3. --image-repository registry.aliyuncs.com/google_containers \
  4. --service-cidr=10.96.0.0/12 \
  5. --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 就能使用了。

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

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

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

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

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

5.添加node节点

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

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

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

  1. [root@node3 yum.repos.d]# kubeadm join 192.168.139.13:6443 --token irfynt.htcy2ymyoexwkgqx --discovery-token-ca-cert-hash
  2. sha256:865e5dadb2341823edb7677790d7504d1e8f73e6fe86e3c730429fd4c8d7eef9
  3. [preflight] Running pre-flight checks [WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
  4. [preflight] Reading configuration from the cluster...
  5. [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
  6. [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"
  7. [kubelet-start] Starting the kubelet
  8. [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
  9. This node has joined the cluster:
  10. * Certificate signing request was sent to apiserver and a response was received.
  11. * The Kubelet was informed of the new secure connection details.
  12. 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查看节点状态

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

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

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

然后再去查看节点状态:

查看集群信息:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/728032
推荐阅读
相关标签
  

闽ICP备14008679号