zoukankan      html  css  js  c++  java
  • K8S搭建单点集群+问题处理

    K8S搭建集群

    一、前提条件

      1.至少两台装有linux的主机(或者虚拟机),这里我用的是两台centos7.6。一台是 172.20.111.130,用做master。另一台是 172.20.111.175 ,用作Node。这两台都是装在虚拟机上的。

      2.所有主机装有docker,并且启动docker 服务。

      3.主机硬件要求:cpu必须2核以上,内存2G以上

    二、搭建步骤

       说明:1-8(除了4以外)必须在所有节点执行

       1.关闭防火墙

    systemctl stop firewalld #防止端口不开放,k8s集群无法启动(因为不知道K8S要求开放哪些端口。运行之后,再开放相应的端口,然后开启防火墙)
    

       2.关闭selinux

    setenforce 0 
    

       3.关闭swap

    swapoff -a      #执行此命令,临时关闭swap
    vim /etc/fstab  #永久关闭:注释有swap的那一行(访问内存分区,k8s无法启动)
    free          #可以通过这个命令查看swap是否关闭了
    

       4.添加主机名与IP对应的关系,免密(这一步可以只在master执行),这一步我为后面传输网络做准备

         4.1 修改主机名称:由于是两台虚拟机,主机名称可能相同,因此先修改主机名称。

    # 设置master主机名称,将hosts的内容替换成如下的内容。
    vim /etc/hosts
    172.20.111.130       master-cent
    
    # 设置node主机名称,将hosts的内容替换成如下的内容。
    vim /etc/hosts
    172.20.111.130       master-cent
    

         如图所示
        

         4.2 设置master主机到node主机的免密登录

    #生成密钥对,授权
    ssh-keygen  #生成密钥对(生成rsa密钥对时,会提示输入保存密钥的文件 和密码,可以直接enter)
    cat .ssh/id_rsa.pub >> .ssh/authorized_keys  #复制密钥对
    chmod 600 .ssh/authorized_keys #授权
    
    #复制master授权文件到node节点:可以在master生成,然后拷贝到node节点  将.ssh整个文件夹,复制到远程服务器上的 /root下。(接受许可,并输入密码)
    scp -r .ssh root@172.20.111.175:/root  
    
    #测试免密登录连接(不需要输入密码,即可登录到node,exit 可退出)
    ssh 172.20.111.175
    

       5.将桥接的IPV4流量传递到iptables 的链

    vi /etc/sysctl.d/k8s.conf
    
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    

      

      6.安装Docker及同步时间

    #docker 安装、启动。如果已经安装docker,并启动服务。可跳过这一步。
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo
    yum -y install docker-ce
    systemctl start docker
    systemctl enable docker
    
    #同步时间:使master节点和 node 节点时间同步。这一步必须做,否则后面安装flannel可能会有证书错误。或者就算加入了集群,node节点状态也是NotReady。
    yum install ntpdate -y
    ntpdate cn.pool.ntp.org
    

       补充:同步时间,也可以使用一台时间服务器来同步。

       7.添加阿里云YUM软件源(不添加,国内是无法下载kubectl,kubeadm,kubelet三个工具的)

    vi /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
    

       8.安装kubeadm,kubelet和kubectl:可以先在官网查找最新的版本,目前是1.20.0最新

    yum makecache fast
    yum install -y kubectl-1.20.0 kubeadm-1.20.0 kubelet-1.20.0 --nogpgcheck
    yum install -y kubectl-1.20.0 kubeadm-1.20.0 kubelet-1.20.0 --nogpgcheck
    

       验证安装:

    yum list installed |grep kube
    

      

       9.部署Kubernetes Master

       9.1 初始化master节点(master 节点执行)

    #第一次初始化比较慢,需要拉取镜像(实际使用时,需要将这些命令和参数写成一行)
    kubeadm init --apiserver-advertise-address=172.20.111.130   # 换成自己master的IP
    --image-repository registry.aliyuncs.com/google_containers  
    --kubernetes-version v1.20.0 
    --service-cidr=10.1.0.0/16 
    --pod-network-cidr=10.244.0.0/16  #使用flannel网络必须设置成这个cidrKUB
    
    #接下来,将初始化结果中的命令复制出来执行(初始化master 节点后,kubeadm的任务就完成了,下面的命令是固定的,给kubectl用的,只有执行了以下命令,kubectl才会起作用):
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

       9.2 安装flannel网络(master 节点执行,配置网络环境,节点与节点之间需要网络连接,节点内部的容器也需要网络连接,所以要配置flannel 网络)

    # 安装flannel(在master执行,这个文件,下载时可能被墙,需要在hosts手动添加DNS配置 199.232.28.133  raw.githubusercontent.com)
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml  
    
    # 安装完flannel,将配置从master拷到node节点,否则添加节点之后状态不对(免密登录的用处)
    scp -r /etc/cni root@172.20.111.175:/etc
    
    # 这一步也要拷贝,否则节点看着正常,但是pod由于网络原因无法创建(复制过去后,加入集群时,子节点会pull 3个镜像,有三个镜像,子节点的flanel网络才是通畅的)
    scp -r /run/flannel/ root@172.20.111.175:/run
    

       复制到node 节点后,node 节点的三个镜像:

       9.3 再次初始化 master (master节点执行,执行时,需要将下面的命令和参数写成一行)

    kubeadm init 
    --apiserver-advertise-address=172.20.111.130   #指定apiserver的监听地址,即master的地址
    --image-repository registry.aliyuncs.com/google_containers   #镜像加速
    --kubernetes-version=v1.20.0  #指定Kubernetes版本
    --service-cidr=10.1.0.0/16  
    --pod-network-cidr=10.244.0.0/16 #指定使用flanneld网络
    --apiserver-bind-port=6443 
    --ignore-preflight-errors=all #跳过之前已安装部分(出问题时,问题解决后加上继续运行)
    

       9.4 查看集群状态

    kubectl get cs
    

      

       10 Node 节点加入集群

       10.1 获取加入集群的token(master 节点执行)

    kubeadm token create --print-join-command
    

      
       10.2 node 加入集群:复制 master 输出的指令,再node上执行。即可加入集群

      

       10.3 master 节点查看节点状态

    kubectl get node -o wide
    

       11 移除node节点:当node节点出错,则需要移除

       11.1 node 节点脱离(node节点执行)

    kubeadm reset #重置节点
    

       11.2 master 删除节点(master节点执行)

    kubectl delete node 节点名称  #删除节点,删除后 数据就从etcd中清除了(可运行kubectl的任一节点中执行)
    

    三、问题处理

      集群搭建好后,kubectl get cs 查看集群组件状态时,kube-scheduler和kube-controller-manager显示unhealthy。具体如下所示:

       原因可能是没有启动10251、10252端口,使用sudo netstat -tlunp可查看端口是否开启。确认没有开启,则是因为kube-scheduler和kube-controller-manager组件配置禁用了非安全端口。此时,vi /etc/kubernetes/manifests/kube-scheduler.yamlvi /etc/kubernetes/manifests/kube-controller-manager.yaml,将 --port=0 这一行删掉,sudo systemctl restart kubelet 重启kubelet 即可。

    (参考:https://blog.csdn.net/xiaobao7865/article/details/107513957)

    vi

    四、K8S基础命令

    #使用kubectl -h,查看K8S的各种类别的指令。kubectl +具体的指令 -h,可以查看该指令的用法,参数配置等。
    
    kubectl get:#用于获取资源(kubectl -h 可以查看到)。
    
    kubectl get node [-o wide]       # 获取集群中的节点[加上 可选参数,可查看更多信息],kubectl get node -h 可查看更多参数配置。
    
    kubectl run nginx --image=nginx --port=80      #运行nginx pod(这个时候只是容器在pod内部使用,还不能给外界进行访问)
    
    kubectl describe pod nginx-pod      # 查看nginx pod信息(显示demo是否成功或者失败信息),非默认名称空间的 pod,要加上 -n 对应的名称空间。   
    
    kubectl expose pod nginx-pod --port=80 --target-port=80 --type=NodePort        # 暴露nginx pod(暴露给外界进行访问) ,type=NodePort才可以被访问 (kubectl expose deployment k3cdey -n k3cpod-ns  --type=NodePort  #不指定端口直接暴露)
    
    kubectl get service -o wide     #查看暴露nginx副本deployment service
    
    kubectl get ns     #获取名称空间
    
    kubectl get pods -o wide -n k3cpod-ns   # 查看特定名称空间下的 pod。
    
    kubectl apply -f ns.yaml:#根据yaml 文件创建资源,包括pod,service,namespaces,deployment
    
    
    kubectl delete -f  ns.yaml:根据ns的yaml 文件,删除资源,包括 pod,service,namespaces,deployment
    
    kubectl create ns 名称空间:创建名称空间
    
    kubectl delete ns ns-test1:删除名称空间
    
    kubectl get services fyyservice -n k3cpod-ns111 -o yaml >hehe.yaml  #将service以为yaml的格式输出到文件 hehe.yaml,也能以json格式输出到文件。
    

    五、YAML文件

    nginx副本集部署deployment

    apiVersion: apps/v1 #k8s版本号
    kind: Deployment #部署类型(资源类型)
    metadata: #元数据(用于定义资源信息)
      name: nginx-deployment-tony5 #资源名称
      labels: #资源标签(版本号)
        app: nginx 
    spec: #资源相关信息规范
      replicas: 3 #副本数
      selector: #选择哪一个版本
        matchLabels:
          app: nginx
      template: #模板
        metadata: #资源的元数据/属性
          labels: #设置资源的标签
            app: nginx
        spec: #资源规范字段(规范容器配置)
          containers: #指定容器
          - name: nginx #容器名称
            image: nginx #容器使用的镜像
            ports: #端口号
            - containerPort: 80 #容器对应的端口号
    

    nginx暴露service

    apiVersion: v1 # 指定api版本,此值必须在kubectl api-versions中
    kind: Service # 指定创建资源的角色/类型
    metadata: # 资源的元数据/属性
      name: service-tony # 资源的名字,在同一个namespace中必须唯一
      namespace: default # 部署在哪个namespace中
      labels: # 设定资源的标签
        app: demo
    spec: # 资源规范字段
      type: NodePort # ClusterIP 类型
      ports:
        - port: 8080 # service 端口
          targetPort: 80 # 容器暴露的端口
          protocol: TCP # 协议
          name: http # 端口名称
      selector: # 选择器(选择什么资源进行发布给外界进行访问:pod deployment 等等资源)
        app: nginx
    

    deployment yaml 文件参考:https://www.cnblogs.com/txlsz/p/13141700.html
    service yaml 文件参考:https://blog.csdn.net/yucaifu1989/article/details/106680995/
    其他yaml文件参考:https://www.pianshen.com/article/6425350768/

    集群搭建参考:
      官网:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
      其他参考:https://blog.csdn.net/valada/article/details/102790997

  • 相关阅读:
    物联网普而不及 仍缺杀手级应用
    05-if和switch的简单比较
    05-if使用注意
    04-关系运算符使用注意
    03-sizeof的用法
    01-scanf函数的注意点
    01-变量的内存分析
    06-自定义构造方法
    06-构造方法
    05-id的使用
  • 原文地址:https://www.cnblogs.com/Fengyinyong/p/14682770.html
Copyright © 2011-2022 走看看