zoukankan      html  css  js  c++  java
  • 使用kubeadm部署k8s

    k8s组件

    master,node

    master中包括apiserver,scheduler,controller。etcd

    apiserver:负责接收用户请求,并且保存至etcd中。

    scheduler:负责将apisever中创建的资源根据node的负载情况调度至其他node

    controller:负责监控apiserver中用户期望创建资源的状态。如果当前状态与期望状态不同,controller就会试图将资源重启或者删除重建。和拉取容器镜像

    etcd:用于保存k8s cluster中的所有配置信息

    node节点:kubelet,kube-proxy,docker,pod

    docker/容器引擎:运行pod时容器引擎

    kubelet:相当于agent,会watch着apiserver中的资源变动,一旦资源跟自己节点有关,则执行调动docker引擎。拉取镜像。创建容器

    pod:k8s中的核心基本单元。一个pod中可以存在多个容器。一个pod共享同一组网络空间。IPC。等

    kube-proxy:

    ADDONS插件:

    DNS:用于服务注册服务发现

    CNI:容器网络插件。包括(flannel,calico)

    k8s中常用的资源类型:Pod,Service,Namespace,Volume。控制器对象。ReplicaSet,deployment,DaemonSet,StatefulSet。等等

    使用kubeadm容器化部署k8s

    设定时钟同步

    若节点可直接访问互联网,直接启动chronyd系统服务,并设定其随系统引导而启动。

            ~]# systemctl start chronyd.service
            ~]# systemctl enable chronyd.service
    

    关闭iptables或firewalld服务

    关闭并禁用SELinux

    若当前启用了SELinux,则需要编辑/etc/sysconfig/selinux文件,禁用SELinux,并临时设置其当前状态为permissive:

        ~]# sed -i 's@^(SELINUX=).*@1disabled@' /etc/sysconfig/selinux
        ~]# setenforce 0
    

    禁用Swap设备

    部署集群时,kubeadm默认会预先检查当前主机是否禁用了Swap设备,并在未禁用时强制终止部署过程。因此,在主机内存资源充裕的条件下,需要禁用所有的Swap设备,否则,就需要在后文的kubeadm init及kubeadm join命令执行时额外使用相关的选项忽略检查错误。

    关闭Swap设备,需要分两步完成。首先是关闭当前已启用的所有Swap设备:

        ~]# swapoff -a
    

    而后编辑/etc/fstab配置文件,注释用于挂载Swap设备的所有行

    启用ipvs内核模块

    创建内核模块载入相关的脚本文件/etc/sysconfig/modules/ipvs.modules,设定自动载入的内核模块。文件内容如下:

    #!/bin/bash
    ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
    for mod in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
        /sbin/modinfo -F filename $mod  &> /dev/null
        if [ $? -eq 0 ]; then
            /sbin/modprobe $mod
        fi
    done
    

    修改文件权限,并手动为当前系统加载内核模块:

        ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
        ~]# bash /etc/sysconfig/modules/ipvs.modules
    

    **二、安装程序包(在各主机上完成如下设定) **

    1、生成yum仓库配置

    首先获取docker-ce的配置仓库配置文件:

            ~]# wwget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo
    

    而后手动生成kubernetes的yum仓库配置文件/etc/yum.repos.d/kubernetes.repo,内容如下:

    [kubernetes]
    name=Kubernetes
    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
    enabled=1
    

    2、安装相关的程序包

    Kubernetes会对经过充分验正的Docker程序版本进行认证,目前认证完成的最高版本是17.03,但docker-ce的最新版本已经高出了几个版本号。管理员可忽略此认证而直接使用最新版本的docker-ce程序,不过,建议根据后面的说明,将安装命令替换为安装17.03版。

        ~]# yum install docker-ce -y
        ~]# yum install kubelet kubeadm kubectl -y
    

    三、启动docker服务(在各节点执行)

    另外,docker自1.13版起会自动设置iptables的FORWARD默认策略为DROP,这可能会影响Kubernetes集群依赖的报文转发功能,因此,需要在docker服务启动后,重新将FORWARD链的默认策略设备为ACCEPT,方式是修改/usr/lib/systemd/system/docker.service文件,在“ExecStart=/usr/bin/dockerd”一行之后新增一行如下内容:

        ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
    

    image

    重载完成后即可启动docker服务:

        ~]#systemctl daemon-reload       
    
        ~]# systemctl start docker.service
    

    而后设定docker和kubelet随系统引导自动启动:

    ~]# systemctl enable docker kubelet

    四、初始化主节点(在master上完成如下操作)

    1、初始化master节点

    若未禁用Swap设备,则需要编辑kubelet的配置文件/etc/sysconfig/kubelet,设置其忽略Swap启用的状态错误,内容如下:

    KUBELET_EXTRA_ARGS="--fail-swap-on=false"

    (可选步骤)而后,在运行初始化命令之前先运行如下命令单独获取相关的镜像文件,而后再运行后面的kubeadm init命令,以便于观察到镜像文件的下载过程。

        ~]# kubeadm config images pull
    

    初始化方式一:

    运行如下命令完成master01节点的初始化:

        ~]# kubeadm init --kubernetes-version=v1.16.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --image-repository gcr.azk8s.cn/google_containers
    

    命令中的各选项简单说明如下:

    (1) --kubernetes-version选项的版本号用于指定要部署的Kubenretes程序版本,它需要与当前的kubeadm支持的版本保持一致;

    (2) --pod-network-cidr选项用于指定分Pod分配使用的网络地址,它通常应该与要部署使用的网络插件(例如flannel、calico等)的默认设定保持一致,10.244.0.0/16是flannel默认使用的网络;

    (3) --service-cidr用于指定为Service分配使用的网络地址,它由kubernetes管理,默认即为10.96.0.0/12;

    (4) 最后一个选项“--ignore-preflight-errors=Swap”仅应该在未禁用Swap设备的状态下使用。
    (5) --image-repository gcr.azk8s.wcn/google_containers 更改默认的镜像仓库指定为国内镜像

    初始化方式二:

    kubeadm也可通过配置文件加载配置,以定制更丰富的部署选项。以下是个符合前述命令设定方式的使用示例,不过,它明确定义了kubeProxy的模式为ipvs,并支持通过修改imageRepository的值修改获取系统镜像时使用的镜像仓库。

    apiVersion: kubeadm.k8s.io/v1alpha2
    kind: MasterConfiguration
    kubernetesVersion: v1.13.3
    api:
      advertiseAddress: 172.20.0.71
      bindPort: 6443
      controlPlaneEndpoint: ""
    imageRepository: k8s.gcr.io
    kubeProxy:
      config:
        mode: "ipvs"
        ipvs:
          ExcludeCIDRs: null
          minSyncPeriod: 0s
          scheduler: ""
          syncPeriod: 30s   
    kubeletConfiguration:
      baseConfig:
        cgroupDriver: cgroupfs
        clusterDNS:
        - 10.96.0.10
        clusterDomain: cluster.local
        failSwapOn: false
        resolvConf: /etc/resolv.conf
        staticPodPath: /etc/kubernetes/manifests
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.96.0.0/12
    

    将上面的内容保存于配置文件中,例如kubeadm-config.yaml,而后执行相应的命令:

      ~]# kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=Swap
    

    注意:对于Kubernetes系统的新用户来说,无论使用上述哪种方法,命令运行结束后,请记录最后的kubeadm join命令输出的最后提示的操作步骤。下面的内容是需要用户记录的一个命令输出示例,它提示了后续需要的操作步骤:

    image.png

    2、初始化kubectl

    kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf,它可由kubectl通过默认的“$HOME/.kube/config”的路径进行加载。当然,用户也可在kubectl命令上使用--kubeconfig选项指定一个别的位置。

    下面复制认证为Kubernetes系统管理员的配置文件至目标用户(例如当前用户root)的家目录下:

        ~]# mkdir ~/.kube 
        ~]# cp /etc/kubernetes/admin.conf ~/.kube/config
    

    而后,即可通过kubectl进行客户端命令测试,并借此了解集群组件的当前状态:
    ~]# kubectl get componentstatus

    一个正常的输出应该类似如下输出结果所示:

    NAME                 STATUS    MESSAGE              ERROR
      controller-manager   Healthy   ok                   
      scheduler            Healthy   ok                   
      etcd-0               Healthy   {"health": "true"}
    

    node节点拉取镜像

     docker image pull gcr.azk8s.cn/google_containers/kube-proxy:v1.16.3 && docker image pull gcr.azk8s.cn/google_containers/pause:3.1 && docker image pull quay.io/coreos/flannel:v0.11.0-amd64
    

    3、添加flannel网络附件

    Kubernetes系统上Pod网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为著名的有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目。下面的命令用于在线部署flannel至Kubernetes系统之上:

        ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

    image.png

    而后使用如下命令确认其输出结果中Pod的状态为“Running”,类似如下所示:

        ~]# kubectl get pods -n kube-system -l app=flannel
        NAME                          READY   STATUS    RESTARTS   AGE
        kube-flannel-ds-amd64-wscnz   1/1     Running   0          14m
    

    五、添加节点到集群中(在node01和node02上分别完成如下操作)

    1、若未禁用Swap设备,编辑kubelet的配置文件/etc/sysconfig/kubelet,设置其忽略Swap启用的状态错误,内容如下:
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"

    kubeadm join 192.168.1.195:6443 --token b3agph.vszgxzb76lneyob5
    --discovery-token-ca-cert-hash sha256:19fcd3a8494247f8f12ce17fb65620853301cb07662c2f56c627075d4dbdc3db
    image.png

    部署完成

  • 相关阅读:
    Spring框架之 我对AOP的理解
    第二次分班考试之 ---纠错19/25题
    Spring IOC(控制反转) 和DI
    一级缓存,二级缓存
    多对多连接
    MyBatis 智能标签
    小结javaScriptOOP的对象内容点
    15年错题小结2月
    《Java周边》Http请求模拟工具(postman)
    《Java周边》IDEA 设置快捷键和快捷键中英文对照
  • 原文地址:https://www.cnblogs.com/woaiyitiaochai/p/12023131.html
Copyright © 2011-2022 走看看