zoukankan      html  css  js  c++  java
  • 使用Kubeadm搭建Kubernetes集群

    Kubernetes架构

    Kubernetes 主要由以下几个核心组件组成:
    • etcd 保存了整个集群的状态;

    • kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;

    • kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

    • kube-scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;

    • kubelet 负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;

    • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时为 Docker;

    • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;

    今天我们先重点说一下kubelet组件,kubelet 主要负责同容器运行时(比如 Docker 项目)打交道。而这个交互所依赖的,是一个称作 CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数。

    此外,kubelet 还通过 gRPC 协议同一个叫作 Device Plugin 的插件进行交互。这个插件,是 Kubernetes 项目用来管理 GPU 等宿主机物理设备的主要组件,也是基于 Kubernetes 项目进行机器学习训练、高性能作业支持等工作必须关注的功能。

    而kubelet 的另一个重要功能,则是调用网络插件和存储插件为容器配置网络和持久化存储。这两个插件与 kubelet 进行交互的接口,分别是 CNI(Container Networking Interface)和 CSI(Container Storage Interface)。

    kubelet 完全是为了实现 Kubernetes 项目对容器的管理能力而实现的一个组件。

    了解完Kubernetes架构后,我们今天使用Kubeadm部署一个Kubernetes集群。使用Kubeadm部署Kubernetes集群很简单,只需要两步操作即可:kubeadm init,kubeadm join,当然在正式安装之前咱们先需要做一下基础准备!

    基础环境准备

    安装一个Kubernates最小集群需要三台机器,一台Master节点,两台Node节点,机器规划如下:

    虚拟机版本主机名IP角色
    centos7 kubernetes-master 192.168.136.128 master
    centos7 kubernetes-node1 192.168.136.129 node
    centos7 kubernetes-node2 192.168.136.130 node
    • 安装并启动Docker
      安装过程略,可参看我之前的Docker系列文章,安装完成后使用 systemctl start docker 命令启动Docker

    • 使用命令将docker服务设置开机启动
      systemctl enable docker

    • 查看docker 版本,确保各个节点安装的docker版本一致

    • 关闭禁用各节点的防火墙
      停止防火墙:systemctl stop firewalld.service
      禁用防火墙:systemctl disable firewalld.service
      查看防火墙状态:systemctl list-unit-files|grep firewalld.service

    • 关闭各节点的selinux
      编辑/etc/selinux/config 文件并设置 SELINUX 的值为 disabled

    • 关闭各节点的swap
      如果不关闭kubernetes运行会出现错误, 即使安装成功了,node重启后也会出现kubernetes server运行错误。
      sudo swapoff -a

    • 给各节点添加kubernetes的yum源
      进入目录 cd /etc/yum.repos.d/

      内容如下,大家可以直接复制粘贴。

    [kubernetes]
    name=Kubernetes Repo
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    enable=1
    EOF
    
    • 查看yum源是否可用yum repolist

    做好上面的准备工作后,我们来安装Kubeadm。

    Kubeadm 安装

    Master安装

    • 修改master主机名为kubernetes-master
      hostnamectl set-hostname kubernetes-master

    • 卸载原kubeadm(若有):
      yum remove -y kubelet kubeadm kubectl

    • 安装kubeadm:
      yum install -y kubelet kubeadm kubectl

    • 重启 docker,并启动 kubelet

    systemctl daemon-reload
    systemctl restart docker
    systemctl enable kubelet && systemctl start kubelet
    
    • 查看kubelet状态:
      systemctl status kubelet

    如果此时执行 service status kubelet 命令,将得到 kubelet 启动失败的错误提示,请忽略此错误,因为必须完成后续步骤中 kubeadm init 的操作,kubelet 才能正常启动

    • 生成kubeadm配置文件kubeadm.yml
      进入文件夹 cd /app/k8s,执行命令生成配置文件kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml在文件夹下,会生成一个kubeadm.yml文件,需要对kubeadm.yml进行修改。

    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.136.128
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: kubernetes-master
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: k8s.gcr.io
    kind: ClusterConfiguration
    kubernetesVersion: v1.18.0
    networking:
      dnsDomain: cluster.local
      podSubnet: "192.168.0.0/16"
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
    

    主要做三处修改:
    修改imageRepository为registry.aliyuncs.com/google_containers 阿里镜像源;
    修改kubernetesVersion,我们使用v1.18.0作为kubernetes版本;
    修改podSubnet,配置成Calico默认网段

    • 查看并拉取镜像

    # 查看所需镜像列表
    kubeadm config images list --config kubeadm.yml
    # 拉取镜像
    kubeadm config images pull --config kubeadm.yml
    
    • master初始化
      执行以下命令初始化主节点,该命令指定了初始化时需要使用的配置文件,其中添加 --upload-certs 参数可以在后续执行加入节点时自动分发证书文件。追加的 tee kubeadm-init.log 用以输出日志。
      kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

    • 再次查看kebelet状态
      systemctl status kubelet此时kubelet为active,运行状态。

    • 配置kubelet

    rm -rf /root/.kube/
    mkdir /root/.kube/
    cp -i /etc/kubernetes/admin.conf /root/.kube/config
    
    • 验证是否安装成功kubectl get node

      此时节点的状态为NotReady,这是由于我们还没部署任何网络插件,是正常的。

    Node 节点安装

    Node节点只需要在安装docker的基础上安装kubeadm组件即可。

    • 修改主机名
      hostnamectl set-hostname kubernetes-node1

    • 卸载原kubeadm(若有):
      yum remove -y kubelet kubeadm kubectl

    • 安装kubeadm:
      yum install -y kubeadm

    • 获取join命令(在Master节点执行)
      kubeadm token create --print-join-command

    kubeadm join 192.168.136.128:6443 --token bk1hs7.bxxz26xkzamtpn64     --discovery-token-ca-cert-hash sha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc
    

    Node2节点安装过程略。。。

    完成两个节点的join后可以在master节点查看节点状态,kubectl get nodes -o wide

    至此  Node节点都已经加入Master。

    安装网络插件Calico

    在Master节点使用命令kubectl apply -f https://docs.projectcalico.org/v3.13/manifests/calico.yaml 进行Calico网络插件的安装。

    安装完成后我们可以使用命令kubectl get pods -n kube-system -o wide 查看pod状态。

    再次查看node节点状态kubectl get nodes -o wide,发现处于Ready状态这样我们整个Kubernetes集群已经搭建完成,大家可以开始部署你的服务应用了!

    重新加入节点

    若节点需要重新加入节点可以按照如下步骤进行:

    • 先在node节点执行kubeadm reset -f 命令,重置kubeadm

    • 在Master节点删除原节点
      kubectl delete node kubernetes-node1

    • 在Master节点获取join命令
      kubeadm token create --print-join-command

    • 在Node节点执行命令重新加入集群kubeadm join 192.168.136.128:6443 --token bk1hs7.bxxz26xkzamtpn64 --discovery-token-ca-cert-hash sha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc

    安装错误

    在安装Node节点时可能会出现如下的错误

    [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
    

    解决方法:

    echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
    

    重启Master节点后执行kubectl 相关命令出现如下错误,则很可能是没关闭swap导致kubelet无法正常启动,可以使用free -m 命令查看

    若swap所在行不为0则表示未关闭swap,可以使用swapoff -a命令关闭,然后使用命令systemctl start kubelet 重新启动kubelet 。

    好了,各位朋友们,本期的内容到此就全部结束啦,能看到这里的同学都是优秀的同学,下一个升职加薪的就是你了!
    如果觉得这篇文章对你有所帮助的话请扫描下面二维码加个关注。"转发" 加 "在看",养成好习惯!咱们下期再见!

    热文推荐

    ☞ 数据库优化之SQL优化
    ☞ 数据库优化之实例优化
    ☞ Docker基础与实战,看这一篇就够了!
    ☞ Docker-Compose基础与实战,看这一篇就够了!
    ☞ OAuth2.0最简向导(多图预警)
    ☞ 构建三维一体立体化监控体系
    ☞ SpringCloud实战系列

  • 相关阅读:
    135 01 Android 零基础入门 02 Java面向对象 07 Java多态 03 多态的实现(难点) 02 向上转型
    leetcode-----169. 多数元素
    leetcode-----167. 两数之和 II
    leetcode-----136. 只出现一次的数字
    leetcode-----125. 验证回文串
    leetcode-----122. 买卖股票的最佳时机 II
    java实体类和json串字段名称不一致或者与map中字段名称不一致使用注解转化
    如何优雅的将Object转换成List
    java中远程调用接口springboot
    返回前端页面的属性名称和实体类的名称不一致用@JsonProperty
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13295887.html
Copyright © 2011-2022 走看看